【发布时间】:2017-04-12 09:37:28
【问题描述】:
最近我们(与我一起工作的团队和我自己)发现 MS-build 和 Visual Studio (2015) 的构建结果之间有些奇怪。
情况
与我一起工作的团队的任务是重构一个较旧且相当大的 c# 项目,该项目包含许多 (150 多个) 项目,所有项目都捆绑到一个 sln 文件中。正如预期的那样,在我们工作期间,sln 文件中会发生合并冲突,并且其中一名团队成员错误地解决了此冲突。使 sln 文件缺少项目参考。
从这里开始,项目的行为在 3 个位置有所不同。它们如下所述
最初犯错的开发者的 Visual Studio
(请注意,我假设该开发人员没有清理过他的解决方案) 该程序员已经构建并运行了该项目(使用 Visual Studio 2015 Professional)。所以所有编译的 dll 文件都在 prorammers 输出文件夹中。这意味着 Visual Studio 不会注意到缺少引用。程序员可以毫无问题地构建、运行和测试应用程序。
构建服务器
构建服务器 (Jenkins) 不运行 Visual Studio,但它使用 MS-build 14 编译源代码。 Jenkins 服务器配置为使用管道运行,如 groovy 中所述。我们通过调用一个通过命令行运行 MS-build 的 bat 脚本来调用 ms build。一个例子:
"C:\Program Files (x86)\MSBuild\14.0\Bin\amd64\msbuild.exe" "TheSolutionFile.sln" /property:Configuration="Debug" /property:Platform="Any CPU"
即使使用不正确的 sln 文件,构建也会以某种方式成功。我怀疑 ms build 解决了它自己的依赖关系,因为 buildserver 上的工作区是干净的(完全空的),所以没有剩余的 dll 可以欺骗系统。 (我的假设是否正确?)
其他团队成员
其他团队成员最终会拉取损坏的 sln 文件的更改,他们会参与其中一些“乐趣”。当您的输出文件夹中没有 dll 文件时,Visual Studio 将尝试重建缺少的依赖项。但由于无法解析引用,它将失败并开始堆积有关丢失元数据的错误。在团队中,我们都使用 Visual Studio 2015。但我们也尝试使用 2017 并遇到相同的结果。最初犯错的人也可能落入这组他清理解决方案中。
问题
显然我们对构建服务器接受带有损坏的 sln 文件的构建这一事实不满意(开发人员获取最新版本无法编译或运行程序)。 有没有办法让最后两种情况同步(所以 ms build 不接受“损坏”的 sln 文件进行编译)
【问题讨论】:
标签: visual-studio msbuild