转换文件夹中的所有配置

时间:2014-01-07 16:24:17

标签: c# msbuild msbuild-task

情况如下:

  • 我在一个文件夹中有多个配置文件
  • 我在不同的文件夹中有相同名称的转换文件
  • 我想在构建
  • 之后将具有相同名称的转换后的文件输出到第三个文件夹

我可以通过手动为每个文件添加节点来轻松解决此问题。但是,我不想打扰(因为我们团队中的一个人总是忘记在他/她添加新配置时编辑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;否则我没有在分号后改变路径:错误消息中的第一个路径是绝对路径,第二个路径是相对路径。消息的输出显示文件的相对路径。)

出了什么问题?

更新2

使用Source="%FilesToTransform.Identity"解决了源问题。我对Transform有同样的问题。

2 个答案:

答案 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)" />

但是,对于较短语法的任何帮助都很受欢迎!