如何获取从“ nuget.exe restore”返回的msbuild路径

时间:2019-01-04 10:35:24

标签: git msbuild nuget githooks

我是使用git hook的新手,现在我正尝试为解决方案中的项目还原nuget程序包,然后再构建解决方案。 我所做的是创建一个git hook'post-merge'并添加以下代码:

#!/bin/sh
RED='\033[0;31m'
GREEN='\033[0;32m'
NC='\033[0m'

projectRoot="$(git rev-parse --show-toplevel)"
solutionFile="solution.sln"

msBuild="C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\MSBuild.exe"

echo -e "\n${RED}Restoring nuget packages for ${solutionFile}...${NC}"
./nuget.exe restore $projectRoot/development/$solutionFile
echo -e "${GREEN}Done restoring nuget packages for ${solutionFile}.${NC}\n"

echo -e "\n${RED}Building ${solutionFile}...${NC}"
"$msBuild"  $projectRoot/development/$solutionFile
echo -e "${GREEN}Done building ${solutionFile}.${NC}\n"

exit 1

我添加了退出1,这样我就可以测试我的命令而无需实际拉项目。

现在,在解决方案路径上运行nuget.exe之后,它会返回一个msbuild自动检测路径,我想使用此路径来定位msbuild.exe,这样我就可以根据其使用的版本在解决方案上运行msbuild。

我该怎么做? 如果有任何方法可以改善或改进此代码,请告诉我!

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以use VSWhere to find MSBuild。而不是捕获和解析NuGet的输出。

在Wiki页面上:

  

在安装了Visual Studio 2017 Update 2或更高版本的情况下,您可以在%ProgramFiles(x86)%\ Microsoft Visual Studio \ Installer \ vswhere.exe中找到vswhere,或者要确保它在您的存储库中始终可用,请参见{{3} }中使用NuGet的选项。

要继续使用bash,需要适应bash的powershell示例

$path = vswhere -latest -products * -requires Microsoft.Component.MSBuild -property installationPath
if ($path) {
  $path = join-path $path 'MSBuild\15.0\Bin\MSBuild.exe'
  if (test-path $path) {
    & $path $args
  }
}

编辑:如果已安装.NET Core SDK,则可以使用dotnet msbuild运行msbuild,因为安装.NET Core SDK会将dotnet.exe放在路径上。使用Visual Studio MSBuild和.NET Core MSBuild之间的唯一真正区别是扩展路径将有所不同。但是,如果您的构建不依赖于MSBuild扩展,则可以使用dotnet msbuild而不必先找到可执行文件的路径。