0

我正在尝试构建一个 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" />

我怎样才能做到这一点?

4

1 回答 1

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>
于 2016-06-03T19:10:21.680 回答