我正在尝试转换我拥有的项目中的所有 web.config 文件,这是我的树结构:
- 转换.bat
- 变换
- ConfigTransform.proj
- Web.Transform.config
- 网站
- 网络.config
- 视图
- 网络.config
还有更多的 web.config 文件,但想法是这将找到所有这些文件并对它们应用相同的配置转换。
我从我找到的一篇博客文章中得到了一些提示,但我卡在了最后一步,即实际的转变。中间还有一点我不太喜欢的粗糙部分(我不太明白我在做什么,我显然做错了(。这是我目前所处的位置:
<Project ToolsVersion="4.0" DefaultTargets="Transform" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<UsingTask TaskName="TransformXml" AssemblyFile="ToolsMicrosoft.Web.Publishing.Tasks.dll"/>
<PropertyGroup>
<SitePath>....Website</SitePath>
<WebConfigTransformInputFile>$(SitePath)Web.config</WebConfigTransformInputFile>
<WebConfigTransformFile>Web.Transform.config</WebConfigTransformFile>
<OutDir>..NN</OutDir>
</PropertyGroup>
<ItemGroup>
<_FilesToTransform Include="$(SitePath)**web.config"/>
</ItemGroup>
<Target Name="Transform">
<MakeDir Directories="@(_FilesToTransform->'$(OutDir)%(RelativeDir)')" />
<TransformXml Source="@(_FilesToTransform->'$(OutDir)%(RelativeDir)%(Filename)%(Extension)')"
Transform="$(WebConfigTransformFile)"
Destination="@(_FilesToTransform->'$(OutDir)%(RelativeDir)%(Filename)%(Extension)')" />
</Target>
</Project>
我的变换.bat如下所示:
%systemroot%Microsoft.NETFrameworkv4.0.30319MSBuild.exe %CD%TransformsConfigTransform.proj
因此,当我调用批处理时,会创建相应的目录。但是,正如您所看到的,我不得不对OutDir进行一些创意,使其..\.出于某种原因,如果我不这样做,OutDir 路径将与输入目录完全相同。所以我显然需要在 MakeDir 中更改一些内容,但我不确定是什么。
当它开始进行转换时,真正的问题就来了。我试图像这样或这样保留 TransformXml 源参数:
@(_FilesToTransformNotAppConfig->'%(FullPath)')
后者给了我一个错误"无法打开源文件:不支持给定路径的格式",前者给了我这个输出:
Build started 30-4-2012 14:02:48.
Project "D:DevtransformDoTransformsTransformsConfigTransform.proj" on node 1 (default targets).
Transform:
Creating directory "..NN....WebsiteViews".
Transforming Source File: ..NN....WebsiteViewsWeb.config;..NN....WebsiteWeb.config
D:DevtransformDoTransformsTransformsConfigTransform.proj(32,2): error : Could not open Source file: Could not find a part of the path 'D:DevtransformDoTransformsWebsiteViewsWeb.config;WebsiteWeb.config'.
Transformation failed
Done Building Project "D:DevtransformDoTransformsTransformsConfigTransform.proj" (default targets) -- FAILED.
Build FAILED.
总结一下我的问题:
- 如何避免 OutDir 的路径问题?我已经摆弄了多条路径,但我无法正确处理。
- 如何使 TransformXml 任务接受"源"属性中的多个文件?
你很接近。我在下面粘贴了一个示例,显示了如何执行此操作。
在我的示例中,我发现转换位于 web.config 文件本身旁边。对于你的方案,可以只使用指向特定文件的 MSBuild 属性。
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="TransformAll" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath32)MicrosoftVisualStudiov10.0WebMicrosoft.Web.Publishing.Tasks.dll"/>
<PropertyGroup>
<Configuration Condition=" '$(Configuration)'=='' ">Release</Configuration>
<OutputFolder Condition=" '$(OutputFolder)'=='' ">C:temptransformed-files</OutputFolder>
</PropertyGroup>
<!--
This target shows how to transform web.config with a specific transform file associated to that specific web.config file.
-->
<Target Name="TransformAll">
<!-- discover the files to transform -->
<ItemGroup>
<FilesToTransofm Include="$(MSBuildProjectDirectory)**web.config"/>
</ItemGroup>
<!-- Ensure all target directories exist -->
<MakeDir Directories="@(FilesToTransofm->'$(OutputFolder)%(RecursiveDir)')"/>
<!-- TransformXml only supports single values for source/transform/destination so use %(FilesToTransofm.Identity)
to sned only 1 value to it -->
<TransformXml Source="%(FilesToTransofm.Identity)"
Transform="@(FilesToTransofm->'%(RecursiveDir)web.$(Configuration).config')"
Destination="@(FilesToTransofm->'$(OutputFolder)%(RecursiveDir)web.config')" />
</Target>
</Project>
仅供参考,您可以在 https://github.com/sayedihashimi/sayed-samples/tree/master/TransformMultipleWebConfigs 下载完整示例。