MSBuild 复制任务 + 相关元数据的批处理
MSBuild Copy task + batching on correlation metadata
我正在尝试构建一个 MSBuild 目标,即获取目录列表中的某个文件,然后将该文件以不同的名称复制到同一目录中。 "destination" 名称直接取决于目录。
让我们用一个例子来说明:
|-\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" />
我怎样才能做到这一点?
可能 'correlate' 像那样分隔项目组,但您仍然必须确保它们具有相同数量的相同顺序的项目(例如,如果有 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>
我正在尝试构建一个 MSBuild 目标,即获取目录列表中的某个文件,然后将该文件以不同的名称复制到同一目录中。 "destination" 名称直接取决于目录。
让我们用一个例子来说明:
|-\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" />
我怎样才能做到这一点?
可能 'correlate' 像那样分隔项目组,但您仍然必须确保它们具有相同数量的相同顺序的项目(例如,如果有 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>