简短版本:
.NET解决方案的构建时间从平均12分钟变为34分钟。
长版:
我有一个Visual Studio 2015解决方案,里面有三个项目:
使用" MSBuild"在TeamCity 2017.1.5中成功构建了解决方案。构建步骤和MSBuild 14.0工具。 TeamCity步骤具有以下标志:
/p:DeployOnBuild=true /p:PublishProfile="%system.teamcity.build.workingDir%\WEBAPPLICATION\Properties\PublishProfiles\PUBLISHPROFILENAME.pubxml" /p:Configuration=CONFIGURATIONNAME /p:VisualStudioVersion=14.0 /p:AutoParameterizationWebConfigConnectionStrings=false /p:SkipExtraFilesOnServer=false /p:DeleteExistingFiles=true
此设置已启用我们的开发服务器的持续集成/持续部署。重要的是要注意本地,我们不构建MVC视图,但 TeamCity上的构建配置首先启用MVCBuildViews 。这样可以加快我们团队在当地的发展。
我们的大多数模型项目都需要另一个.NET项目使用。因为Microsoft不赞成使用可移植类库,并且我们的模型项目广泛使用了[Serializable]属性,而PCL不支持该属性而没有多次更改,我们决定将模型项目更改为.NET Standard 2.0库项目。最终目标是我们将使用我们的私有NuGet服务器将这个.NET Standard 2.0库项目打包为NuGet包,以便在其他项目中使用。
我们将开发机器从Visual Studio 2015升级到Visual Studio 2017,在同一解决方案中创建了一个新的.NET Standard 2.0项目,将所有模型从旧模型项目复制到新项目,更新了所有参考资料在Web应用程序和数据访问项目中,并将Web应用程序和数据访问项目更改为目标.NET 4.6.2。该解决方案在本地成功构建,并且运行正常。
我能够让TeamCity构建这个新版本的解决方案,确保安装代理的服务器安装了Visual Studio 2017以及4.6.2目标包(这部分很烦人)。经过大量的试验和错误,我只能让TeamCity使用批处理文件成功构建解决方案,并使用命令行构建步骤调用批处理文件。
以下是来自TeamCity的电话:
c:\MYBATCHFILE.bat "%system.teamcity.build.checkoutDir%" "CONFIGURATIONNAME" "PUBLISHPROFILENAME"
这是批处理文件:
"C:\Program Files\dotnet\dotnet.exe" restore %~1\NEWMODELSPROJECT
%~1\..\..\tools\nuget.commandline.4.4.0\tools\nuget.exe restore %~1
"C:\Program Files\dotnet\dotnet.exe" build %~1 /p:Configuration="Release"
"c:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\msbuild.exe" %~1\DATAACCESSPROJECT\DATAACCESSPROJECT.csproj /p:Configuration=%~2 /p:Platform="AnyCpu" /p:VisualStudioVersion=15.0
"c:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\msbuild.exe" %~1\WEBAPPLICATION\WEBAPPLICATION.csproj /p:Configuration=%~2 /p:Platform="AnyCpu" /p:VisualStudioVersion=15.0 /p:DeployOnBuild=true /p:PublishProfile=%~1\WEBAPPLICATION\Properties\PublishProfiles\%~3.pubxml /p:AutoParameterizationWebConfigConnectionStrings=false /p:SkipExtraFilesOnServer=false /p:DeleteExistingFiles=true
基本上,我们在.NET Standard 2.0项目上使用dotnet还原,在其余解决方案上使用NuGet还原,使用msnet 2.0项目构建.NET标准2.0项目,然后使用MSBuild 15.0工具MSBuild解决方案中的其他两个项目以及我们之前使用的相同标志。
我们没有在本地看到解决方案的任何问题,但在TeamCity中,我们的平均构建时间从12分钟猛增到34分钟。值得注意的是,在升级过程中,项目没有发生其他重大变化。到目前为止,最大的时间是MvcBuildViews。以下是构建日志的高度编辑版本,取自TeamCity:
[10:50:07] The build is removed from the queue to be prepared for the start
...
//all other steps of the build complete in this amount of time
...
[10:50:21] Step 8/15: Run Batch (Command Line) (33m:28s)
...
//the other portions of the above batch file run in this time period
...
[10:51:15] MvcBuildViews:
...
[11:23:50]
[11:23:50] 104 Warning(s)
[11:23:50] 0 Error(s)
[11:23:50]
[11:23:50] Time Elapsed 00:33:16.53
[11:23:50] Process exited with code 0
...
//minor clean up steps
...
[11:23:53] Build finished
无论批处理文件是由TeamCity运行还是从命令行手动运行,这些平均时间都是相同的。那么,直截了当地说,MSBuild 14.0和MSBuild 15.0之间发生了什么MVCBuildViews任务需要3倍的时间?是否有标记或选项可以传递给MVCBuildViews以改善构建时间?