您实际上可以直接在msbuild中执行此操作,以便它能在VS和大多数CI系统中无需任何额外步骤(如PowerShell脚本)运行,甚至可以在跨平台的dotnet
CLI和mono上运行。
您可以在项目或解决方案(>影响所有项目)目录中创建一个名为Directory.Build.targets
的文件,并使用以下内容(假设MSBuild 15 / VS 2017. 如果较低,则需要手动导入或将此目标插入每个项目):
<Project>
<Target Name="DetermineOctopackVersion" BeforeTargets="Build" Condition=" '$(RunOctoPack)' == 'true' ">
<Exec Command="git rev-parse HEAD" ConsoleToMSBuild="true" StandardOutputImportance="low">
<Output TaskParameter="ConsoleOutput" PropertyName="GitCommitHash" />
</Exec>
<PropertyGroup>
<VersionDatePart>$([System.DateTime]::get_Now().ToString(yyyyMMdd.HHmmss))</VersionDatePart>
<OctopackPackageVersion>2.$(VersionDatePart)-git-$(GitCommitHash.Substring(0,16))</OctopackPackageVersion>
</PropertyGroup>
</Target>
</Project>
如果您希望在每次构建时设置属性,而不仅仅是在 RunOctoPack
为 true
时进行设置,则只需删除 Condition
属性。
但如果您需要在 PowerShell 中执行此操作,可以调用 git 命令并捕获其输出:
$commitHash = (git rev-parse HEAD).Substring(0,16)
$versionDatePart = [System.DateTime]::Now.ToString('yyyyMMdd.HHmmss')
$version = "1.$versionDatePart-git-$commitHash"
如果你真的想避免调用 git
(尽管没有一个像样的构建系统设置可以完全没有 git 安装..),你还可以在 PowerShell 或 MSBuild 中使用 [System.IO.File]::ReadAllText(".git\refs\heads\master")
从 git 目录中读取(在分离状态下,.git\HEAD
将包含哈希值,当使用分支时,它将包含要查找哈希值的文件位置)。