MSBuild:如何将文件复制到由执行命令的输出确定的 DestinationFolder?

Posted

技术标签:

【中文标题】MSBuild:如何将文件复制到由执行命令的输出确定的 DestinationFolder?【英文标题】:MSBuild: How do I CopyFiles to DestinationFolder that is determined by output of executing a command? 【发布时间】:2021-09-12 07:54:15 【问题描述】:

我需要将特定的 git 挂钩文件复制到 MSBuild 上的本地存储库中,以强制执行一些通常可以正常工作的客户端验证,但是,我注意到在某些特殊情况下,工作树的设置与建议的配置略有不同。如果在从git rev-parse --git-path hooks 执行任务时获取下面的DestPath,则可以解决此问题。

<Target Name="CopyFiles" AfterTargets="Build">
  <Copy SourceFiles="@(HookFiles)"
        DestinationFolder="$(DestPath)" 
        OverwriteReadOnlyFiles="True"
/>

我的猜测是在 Copy 前面添加一个 Exec 任务来收集变量,但我不确定如何使输出在 Copy 任务中可用。

<Exec Command="git rev-parse --git-path hooks"/>

【问题讨论】:

【参考方案1】:

感谢Gathering outputs from an MSBuild exec task 的回答,我设法通过执行命令并将输出重定向到文本文件来处理它。

<PropertyGroup>
 <OutputFile>$(MSBuildThisFileDirectory)temp.txt</OutputFile>
</PropertyGroup>

<Exec Command="git rev-parse --path-format=absolute --git-path hooks > &quot;$(OutputFile)&quot;" />

然后从文本文件中读取值。

<ReadLinesFromFile File="$(OutputFile)">
  <Output TaskParameter="Lines" ItemName="OutputLines"/>
</ReadLinesFromFile>

然后替换回任务。

<Copy SourceFiles="@(GitHookFiles)"
      DestinationFolder="@(OutputLines)" 
      OverwriteReadOnlyFiles="True"
/>

最后清理文件。

<Delete Files="$(OutputFile)" />

【讨论】:

以上是关于MSBuild:如何将文件复制到由执行命令的输出确定的 DestinationFolder?的主要内容,如果未能解决你的问题,请参考以下文章

.Net-Core Proj - MSBuild 无法复制到输出文件夹

VS/MSBUILD:复制子项目的输出文件,不添加对exe的引用

Roslyn 如何使用 MSBuild Copy 复制文件

MSBuild 复制动态生成的文件作为项目依赖项的一部分

msbuild不会将引用的本机项目的输出复制到c#project out dir

将全局数组复制到由双指针引用的数组中