正在转换文件夹中的所有配置



情况如下:

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

我可以通过手动添加每个文件的节点来轻松解决这个问题。然而,我不想为此而烦恼(因为我们团队中的一个人在添加新配置时总是忘记编辑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)" />

任何关于较短语法的帮助都将不胜感激!

最新更新