情况如下:
- 我在一个文件夹中有多个配置文件
- 我在不同的文件夹中有相同名称的转换文件
- 我想在生成后将转换后的同名文件输出到第三个文件夹
我可以通过手动添加每个文件的节点来轻松解决这个问题。然而,我不想为此而烦恼(因为我们团队中的一个人在添加新配置时总是忘记编辑csproj文件)。
这就是我现在拥有的:
<UsingTask
TaskName="TransformXml"
AssemblyFile="$(MSBuildExtensionsPath32)MicrosoftVisualStudiov10.0WebMicrosoft.Web.Publishing.Tasks.dll" />
<Target Name="AfterBuild">
<ItemGroup>
<PathToConfigs Include="ConfigurationsEnvironmentDependent" />
<FilesToTransform Include="*.config"/>
</ItemGroup>
<TransformXml
Source="%(PathToConfigs)%(FilesToTransform)"
Destination="OutputConfigs%(FilesToTransform)"
Transform="%(PathToConfigs)TransformFiles%(FilesToTransform)" />
我在这里没有得到正确的语法,所以我得到以下错误消息并不奇怪:
"正在引用没有项目名称的项目元数据%(PathToConfigs)。请使用%(itemname.PathToConfig)指定项目名称"。
更新
根据尼克的回答,我得出了这个解决方案:
<TransformXml
Source="@(FilesToTransform -> '%(Identity)')"
Destination="@(FilesToTransform -> '%(OutputFile)')"
Transform="@(FilesToTransform -> '%(Transform)')" />
我验证了<Message ... />
-s中显示的文件路径。
然而,我得到以下错误:
"无法打开源文件:找不到路径'C:\fakpath\Configurations\EnvironmentDependent\file1.config;Configurations\EnvironmentDependent\fle2.config'的一部分。">
(我已经将部分路径重命名为C:\fakpath;否则,我没有更改分号后的路径:错误消息中的第一个路径是绝对路径,第二个路径是相对路径。消息的输出显示文件的相对路径)。
出了什么问题?
更新2
使用Source="%FilesToTransform.Identity"
修复了源问题。我对Transform也有同样的问题。
好吧,您正在对PathToConfigs集合进行迭代,而不是对配置组进行迭代。
引用单个项时使用MsBuild属性,引用集合时使用MsBuild-项。让我们首先将路径变量更改为属性,而不是项。
<PropertyGroup>
<PathToConfigs>ConfigurationsEnvironmentDependent</PathToConfigs>
<TransformLocation>$(ConfigLocation)OutputConfigs</TransformLocation>
<Destination>$(PathToConfigs)TransformationFiles</Destination>
</PropertyGroup>
接下来,由于我们知道转换和输出文件是基于FilesToTransform项组成员的结构,所以让我们在元数据中推断这些值。首先创建一个包含配置文件的组,然后使用@(Configs)group:中的元数据构建FilesToTransform
<ItemGroup>
<Configs Include="$(PathToConfigs)*.config" />
<FilesToTransform Include="@(Configs)">
<Transform>$(TransformLocation)%(FileName)%(Extension)</Transform>
<OutputFile>$(Destination)%(FileName)%(Extension)</OutputFile>
</FilesToTransform>
</ItemGroup>
最后,在消息任务中确认您的输出:
<Message Importance="High" Text=" Source @(FilesToTransform ->'%(Identity)')" />
<Message Importance="High" Text=" Destination @(FilesToTransform -> '%(OutputFile)')" />
<Message Importance="High" Text=" Transform @(FilesToTransform -> '%(Transform)')" />
在Nick指出正确的方向后,我需要弄清楚剩下的。为了获得正确的语法,你必须使用它:
这是一个按预期工作的:
<PropertyGroup>
<PathToConfigs>ConfigurationsEnvironmentDependent</PathToConfigs>
<TransformLocation>ConfigurationsTransformFilesForEnvironment1</TransformLocation>
<Destination>$(PathToConfigs)TransformedConfigs</Destination>
</PropertyGroup>
<ItemGroup>
<FilesToTransform Include="$(PathToConfigs)*.config" />
</ItemGroup>
<!-- you can check the path of files here -->
<Message Importance="High"
Text=" Source files: %(FilesToTransform.Identity)" />
<Message Importance="High"
Text=" Destination files: $(Destination)%(FilesToTransform.Filename)%(FilesToTransform.Extension)" />
<Message Importance="High"
Text=" Transform files: $(TransformLocation)%(FilesToTransform.Filename)%(FilesToTransform.Extension)" />
<!--
1> Source files: ConfigurationsEnvironmentDependentconfig1.config
1> Source files: ConfigurationsEnvironmentDependentconfig2.config
1> Destination files: ConfigurationsEnvironmentDependentTransformedConfigsconfig1.config
1> Destination files: ConfigurationsEnvironmentDependentTransformedConfigsconfig2.config
1> Transform files: ConfigurationsTransformFilesForEnvironment1config1.config
1> Transform files: ConfigurationsTransformFilesForEnvironment1config2.config
-->
<TransformXml
Source="%(FilesToTransform.Identity)"
Destination="$(Destination)%(FilesToTransform.Filename)%(FilesToTransform.Extension)"
Transform="$(TransformLocation)%(FilesToTransform.Filename)%(FilesToTransform.Extension)" />
任何关于较短语法的帮助都将不胜感激!