代码之家  ›  专栏  ›  技术社区  ›  Rudi

msbuild递归副本(configurationtobuild.platformtobuild)

  •  1
  • Rudi  · 技术社区  · 16 年前

    我有以下任务,因为destinationfiles和destinationfolder的组合不起作用,但它抓住了我想做什么的概念:

    <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个配置:调试所有版本、发布客户端版本和发布Web服务。原因是保持相同的内部版本号和完全相同的代码库,同时让客户机和WebService项目“发布”,然后由安装项目接收。

    如果我尝试使用: destinationfiles=“@(generatedfiles->'$(binariesroot)\%(configurationtobuild.platformtobuild)\%(configurationtobuild.flavortobuild)\%(recursedir)%(filename)%(extension)'”

    msbuild在%(configurationToBuild.flavorToBuild)部分引发错误。

    1 回复  |  直到 16 年前
        1
  •  0
  •   Rudi    16 年前

    我找到了解决这个问题的方法:即手动复制命令。 因此,它的通用性较低,在buildlog文件中产生的噪声更大,但至少可以工作!

    <!-- 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路径中有“.”,则不再填充RecurveDir属性。 所以拥有

    'drive:\somefolder\subfolder\sources\generated**.generated.*.sql'将提供%(recurvedir)元数据。 使用

    'drive:\somefolder\subfolder\.\sources\generated**.generated.*.sql',解析为与上面相同的路径将 不是 提供%(递归)元数据。(注意子文件夹和源之间细微的“.”

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