1

我有以下任务,由于 DestinationFiles 和 DestionationFolder 的组合不起作用,但它抓住了我想要做的概念:

<CreateItem Include="$(Destination)\**\*.Generated.*.*">
  <Output TaskParameter="Include" ItemName="GeneratedFiles" />
</CreateItem>

<Copy Condition=" '%(ConfigurationToBuild.FlavorToBuild)'=='Debug-All' Or '%(ConfigurationToBuild.FlavorToBuild)'=='Release-WebService' "
      SourceFiles="@(GeneratedFiles)"
      DestinationFiles="@(GeneratedFiles-&gt;'%(RecursiveDir)%(Filename)%(Extension)')"
      DestinationFolder="$(BinariesRoot)\%(ConfigurationToBuild.PlatformToBuild)\%(ConfigurationToBuild.FlavorToBuild)"
/>

所以我有一组正在生成的文件(数据,而不是代码),这些文件需要复制到最终的二进制文件位置。

在这个构建中,我一次构建了 3 个配置:一个 Debug-All 版本、一个 Release-Client 版本和一个 Release-WebService。原因是保持相同的内部版本号和完全相同的代码库,同时让客户端和 WebService 项目“发布”,然后由安装项目选择。

如果我尝试使用: DestinationFiles="@(GeneratedFiles->'$(BinariesRoot)\%(ConfigurationToBuild.PlatformToBuild)\%(ConfigurationToBuild.FlavorToBuild)\%(RecursiveDir)%(Filename)%(Extension)')"

MSBuild 在 %(ConfigurationToBuild.FlavorToBuild) 部分引发错误。

4

1 回答 1

0

我找到了解决此问题的方法:即手动复制命令。所以它不那么通用并且在构建日志文件中产生更多的噪音,但至少它有效!

<!-- Copy the updated files to the Binariesroot to have them picked up by the Setups -->
<CreateItem Include="$(Destination)\**\*.Generated.*.sql">
  <Output TaskParameter="Include" ItemName="GeneratedSqlFiles" />
</CreateItem>
<Message Text="GeneratedSqlFiles=@(GeneratedSqlFiles)->RecursiveDir=%(RecursiveDir) Filename=%(Filename)%(Extension)" />

<CreateProperty Condition=" '%(ConfigurationToBuild.FlavorToBuild)'=='Debug'" 
                Value="$(BinariesRoot)\%(ConfigurationToBuild.PlatformToBuild)\%(ConfigurationToBuild.FlavorToBuild)" >
  <Output TaskParameter="Value" PropertyName="RealBinariesRoot" />
</CreateProperty>
<Copy Condition=" '%(ConfigurationToBuild.FlavorToBuild)'=='Debug'"
      SourceFiles="@(GeneratedSqlFiles)"
      DestinationFiles="@(GeneratedSqlFiles->'$(RealBinariesRoot)\Deployment\%(RecursiveDir)%(Filename)%(Extension)')"
/>
<CreateProperty Condition=" '%(ConfigurationToBuild.FlavorToBuild)'=='WebService'"
            Value="$(BinariesRoot)\%(ConfigurationToBuild.PlatformToBuild)\%(ConfigurationToBuild.FlavorToBuild)" >
  <Output TaskParameter="Value" PropertyName="RealBinariesRoot" />
</CreateProperty>
<Copy Condition=" '%(ConfigurationToBuild.FlavorToBuild)'=='WebService'"
      SourceFiles="@(GeneratedSqlFiles)"
      DestinationFiles="@(GeneratedSqlFiles->'$(RealBinariesRoot)\Deployment\%(RecursiveDir)%(Filename)%(Extension)')"
/>

同时发现如果你有一个'.' 在 CreateItem 任务的 Include 路径中,不再填写 RecursiveDir 属性。所以有

'drive:\somefolder\subfolder\Sources\Generated***.Generated.*.sql' 将提供 %(RecursiveDir) 元数据。使用

'drive:\somefolder\subfolder\.\Sources\Generated***.Generated.*.sql',解析为与上述相同的路径将提供 %(RecursiveDir) 元数据。(注意子文件夹和 Sources 之间微妙的“.”)

当然(墨菲定律)我们使用它来指定需要构建哪个分支,使用 . 指向主分支;-)

于 2009-04-14T13:25:35.497 回答