我是使用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。
我该怎么做? 如果有任何方法可以改善或改进此代码,请告诉我!
谢谢!
答案 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
而不必先找到可执行文件的路径。