MSBuild 中的可选 PreBuildEvent?

Optional PreBuildEvent in MSBuild?

是否可以在 *.csproj 文件中包含可选的 <PreBuildEvent>?我有以下内容:

<PropertyGroup>
  <PreBuildEvent>git rev-parse HEAD &gt;../../git-hash.txt</PreBuildEvent>
</PropertyGroup>

这会将最新的 git 哈希输出到一个文件,该文件嵌入在其他地方的可执行文件中。

因为我是一名大学生,所以我经常在有 SVN 而不是 git 的大学机器(而不是我家里的 linux 机器)上编写代码,导致构建过程失败。是否可以使上面的 <PreBuildEvent /> 成为可选的,这样如果 git 没有安装,构建过程就不会失败?

只是跳过构建事件会给您留下一个空的 git-hash.txt,所以这似乎不是最好的主意。相反,您可以尝试 运行 git 命令,如果失败,则将虚拟哈希写入文件。我不知道执行此操作的命令行语法(cmd.exe 下的 PreBuildEvent 运行s)所以这是一个 msbuild 解决方案。由于 BeforeTargets="Build" 它也会在构建之前 运行。

<Target Name="WriteGitHash" BeforeTargets="Build">
  <Exec Command="git --work-tree=$(Repo) --git-dir=$(Repo)\.git rev-parse HEAD 2> NUL" ConsoleToMSBuild="true" IgnoreExitCode="True">
    <Output TaskParameter="ConsoleOutput" PropertyName="GitTag" />
  </Exec>
  <PropertyGroup>
    <GitTag Condition="'$(GitTag)' == ''">unknown</GitTag>
  </PropertyGroup>
  <WriteLinesToFile File="$(Repo)\git-hash.txt" Lines="$(GitTag)" Overwrite="True"/>
</Target>

一些注意事项:

  • 2> NUL 将标准错误重定向到输出,因此 GitTag 将在出现错误时为空,在这种情况下它被设置为 'unknown'
  • 依赖当前目录几乎总是一个坏主意,因此在 属性
  • 中明确指定 运行 git 的目录
  • 输出文件相同