是否有 MSBuild 属性提供存储库根?

Dan*_*iel 7 msbuild visual-studio azure-devops

从 Visual Studio 运行时,MSBuild 被赋予$(SolutionDir)宏/属性。从 Azure DevOps 运行时,此属性不存在(理所当然)。

Azure DevOps 具有Build.SourceBranch可以作为属性传递给 MsBuild 的变量。这个变量更好,因为它直接指向存储库根目录,而$(SolutionDir)如果解决方案不在根目录中,则可能指向子目录。

我是否可以在 Visual Studio 和 Azure DevOps 中使用一致的 MsBuild 属性,该属性可以指向存储库根?

实现此目的的一种方法是Directory.Build.props在存储库根目录中有一个文件并指定一个属性<RepositoryRoot>$(MSBuildThisFileDirectory)</RepositoryRoot>,但是我有一个限制阻止我这样做。

Mar*_*ich 5

简短的回答:不,MSBuild 中没有对源代码控制系统的默认理解。

Directory.Build.props文件可能是最可靠的方法,无论构建解决方案还是单个项目都会显示,因为无论您使用或迁移到哪个 VCS 系统,它都保持不变。

其他方法需要对 VCS 结构进行硬编码,例如查找包含文件的目录.gitignore(如果不使用此类文件,则该目录将不起作用):

<PropertyGroup>
  <RepoRoot>$([System.IO.Path]::GetDirectoryName($([MSBuild]::GetPathOfFileAbove('.gitignore', '$(MSBuildThisFileDirectory)'))))</RepoRoot>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)