【问题标题】:MSBuild Copy task + batching on correlation metadataMSBuild 复制任务 + 相关元数据批处理
【发布时间】:2016-06-03 12:41:58
【问题描述】:

我正在尝试构建一个 MSBuild 目标,该目标将在目录列表中获取某个文件,然后将该文件以不同的名称复制到同一目录中。 “目标”名称直接依赖于目录。

我们用一个例子来说明:

|-\Source\MySolution.ProjectFoo\
|    -- App.config.tpl
|    -- MySolution.ProjectFoo.exe
|    -- (Target) MySolution.ProjectFoo.exe.config.tpl
|-\Source\MySolution.ProjectBar\
|    -- App.config.tpl
|    -- MySolution.ProjectBar.exe
|    -- (Target) MySolution.ProjectBar.exe.config.tpl

我已经开始像这样构建我的ItemGroup

<ItemGroup>
    <AppConfigTemplates Include="Source\**\App.config.tpl">
        <Correlate>%(RecursiveDir)</Correlate>
    </AppConfigTemplates>
    <ExeFiles Include="Source*\**\*.exe">
        <Correlate>%(RecursiveDir)</Correlate>
    </ExeFiles>
</ItemGroup>

我希望能够对Correlate 元数据属性进行批处理。比如:

<Copy Batch="%(Correlate)" SourceFiles="%(AppConfigTemplates.FullPath)"
                           DestinationFiles="%(ExeFiles.FullPath).config.tpl" />

我怎样才能做到这一点?

【问题讨论】:

    标签: .net msbuild copy msbuild-4.0 msbuild-batching


    【解决方案1】:

    可能可以像这样“关联”单独的项目组,但您仍然必须确保它们以相同的顺序具有相同数量的项目(例如,如果有一个 exe 但没有 .tpl 怎么办?反之亦然),这可能会变得混乱。一个更简单的解决方案是仅列出 exe 文件并复制 tpl 文件(具有固定名称)(如果存在):

    <ItemGroup>
      <ExeFiles Include="Source\**\*.exe">
        <!-- expected location of the tpl: same directory -->
        <AppConfigTpl>%(RootDir)%(Directory)App.config.tpl</AppConfigTpl>
      </ExeFiles>
    </ItemGroup>
    
    <Target Name="CopyTpl">
      <Copy SourceFiles="%(ExeFiles.AppConfigTpl)"
            DestinationFiles="%(ExeFiles.FullPath).config.tpl"
            Condition="Exists('%(ExeFiles.AppConfigTpl)') />
      <!-- If needed you could raise an error like this -->
      <Error Text="oops no tpl" Condition="!Exists('%(ExeFiles.AppConfigTpl)')" />
    </Target>
    

    【讨论】:

    • 这正是我正在寻找的解决方案!谢谢!
    猜你喜欢
    • 2014-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多