MSBuild中的可选PreBuildEvent?

时间:2016-08-07 11:16:16

标签: build msbuild xbuild

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

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

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

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

1 个答案:

答案 0 :(得分:2)

只是跳过构建事件会给你留下一个空的git-hash.txt,这似乎不是最好的主意。相反,您可以尝试运行git命令,如果失败则将伪哈希写入文件。我不知道这样做的命令行语法(PreBuildEvent在cmd.exe下运行)所以这是一个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将为空,在这种情况下,它会设置为“未知”
  • 依赖当前目录几乎总是一个坏主意,所以指定在属性中显式运行git的目录
  • 输出文件相同