情况如下:
我可以通过手动为每个文件添加节点来轻松解决此问题。但是,我不想打扰(因为我们团队中的一个人总是忘记在他/她添加新配置时编辑csproj文件)。
这就是我现在所拥有的:
<UsingTask
TaskName="TransformXml"
AssemblyFile="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll" />
<Target Name="AfterBuild">
<ItemGroup>
<PathToConfigs Include="Configurations\EnvironmentDependent" />
<FilesToTransform Include="*.config"/>
</ItemGroup>
<TransformXml
Source="%(PathToConfigs)\%(FilesToTransform)"
Destination="OutputConfigs\%(FilesToTransform)"
Transform="%(PathToConfigs)\TransformFiles\%(FilesToTransform)" />
我在这里没有得到正确的语法,所以我收到以下错误消息并不令人惊讶:
“正在引用项目元数据%(PathToConfigs)而没有项目名称。使用%(itemname.PathToConfigs)”指定项目名称。
根据尼克的回答,我找到了这个解决方案:
<TransformXml
Source="@(FilesToTransform -> '%(Identity)')"
Destination="@(FilesToTransform -> '%(OutputFile)')"
Transform="@(FilesToTransform -> '%(Transform)')" />
我验证了文件的路径,如<Message ... />
- s。
但是,我收到以下错误:
“无法打开源文件:找不到路径的一部分'C:\ fakepath \ Configurations \ EnvironmentDependent \ file1.config; Configurations \ EnvironmentDependent \ file2.config'。”
(我已经将路径的一部分重命名为C:\ fakepath;否则我没有在分号后改变路径:错误消息中的第一个路径是绝对路径,第二个路径是相对路径。消息的输出显示文件的相对路径。)
出了什么问题?
使用Source="%FilesToTransform.Identity"
解决了源问题。我对Transform有同样的问题。
答案 0 :(得分:1)
嗯,您正在迭代PathToConfigs集合而不是一组配置。
引用单个项目时使用MsBuild属性,并在引用集合时使用MsBuild项目。让我们首先将路径变量更改为属性而不是项目。
<PropertyGroup>
<PathToConfigs>Configurations\EnvironmentDependent</PathToConfigs>
<TransformLocation>$(ConfigLocation)\OutputConfigs</TransformLocation>
<Destination>$(PathToConfigs)\TransformationFiles</Destination>
</PropertyGroup>
接下来,由于我们知道转换和输出文件基于FilesToTransform项组成员的结构,因此我们可以在元数据中推断这些值。首先创建一个包含配置文件的组,然后使用@(Configs)组中的元数据构造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)')" />
答案 1 :(得分:0)
在尼克指向正确的方向后,我需要弄清楚其余部分。您必须使用它才能获得正确的语法:
这是按预期工作的:
<PropertyGroup>
<PathToConfigs>Configurations\EnvironmentDependent</PathToConfigs>
<TransformLocation>Configurations\TransformFilesFor\Environment1</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: Configurations\EnvironmentDependent\config1.config
1> Source files: Configurations\EnvironmentDependent\config2.config
1> Destination files: Configurations\EnvironmentDependent\TransformedConfigs\config1.config
1> Destination files: Configurations\EnvironmentDependent\TransformedConfigs\config2.config
1> Transform files: Configurations\TransformFilesFor\Environment1\config1.config
1> Transform files: Configurations\TransformFilesFor\Environment1\config2.config
-->
<TransformXml
Source="%(FilesToTransform.Identity)"
Destination="$(Destination)\%(FilesToTransform.Filename)%(FilesToTransform.Extension)"
Transform="$(TransformLocation)\%(FilesToTransform.Filename)%(FilesToTransform.Extension)" />
但是,对于较短语法的任何帮助都很受欢迎!