我有一个 VS2010 解决方案文件,其中包含 20 多个项目,其中一些项目依赖于解决方案中的其他项目。
我还为不同的目的设置了多个构建配置,但我已经缩减了要构建的项目,仅包含最少数量的项目。
例如,我有三个库(A、B和C)、一个网站项目和一个网站部署项目(VS2010)。该网站引用了库 A 和 B,而 B 又引用了 C。我的构建配置仅检查了网站和部署项目。当我从解决方案的属性中检查项目依赖项时,网站正确列出了库,并且 B 按预期显示了 C。
当我从 VS2010 中针对我的构建配置运行构建时,它工作得完全正常,但是当我在指定我的配置的解决方案上运行 MSBuild 时(如下所示),它只会导致一堆错误。
msbuild.exe mysolution.sln/t:Build/p:configuration=MyConfig
这是我收到的错误的示例:
Services\IService.cs(11,63): 错误 CS0246: 找不到类型或命名空间名称“Priority”(您是否缺少 using 指令或程序集引用?)
我注意到我的构建服务器 (TeamCity v7.1.2) 上发生了这种情况,但我可以在多台计算机上重现它,并且我将其范围缩小到 MSBuild 本身的问题。
它是在我安装了 .NET 4.5(和 2 个安全补丁)之后才开始发生的,所以我卸载了它,重新安装了 .NET 4.0(带有补丁),因为它也被删除了,然后尝试了相同的命令,它工作得很好.
这让我相信 .NET 4.5 的 MSBuild 中发生了某些更改或损坏,但他们的文档中似乎没有任何内容谈论这种更改。
MSBuild 4.5 文档:http://msdn.microsoft.com/en-us/library/hh162058.aspx
我什至尝试将 BuildProjectDependency=true
传递给 MSBuild,结果显示它跳过了其他项目,因为它们未在配置管理器中选择,这是正确且有意的。
我让它与 MSBuild 4.5 一起工作的唯一方法是返回并选择被跳过的项目,但由于实际的解决方案依赖链有点复杂,我不想每次我们使用新项目或依赖项更新解决方案时,请尝试手动管理配置。它应该是自动的。
对我正在做的事情有什么想法吗?
最佳答案
如果您仍然没有解决这个问题,让我们尝试一些盲打:
Msbuild 已确认存在错误,有时它会根据所遵循的依赖关系生成错误的构建顺序。尝试构建不完整的解决方案,而是构建您想要构建的确切项目 - 例如
msbuild.exe YourWebsiteProject.csproj/t:Clean;Build/p:configuration=MyConfig
。问题仍然存在吗?确保 YourWebsiteProject 和您的库(B 和 C)具有正确的引用 - 在项目上,而不是在另一个项目文件夹中的 dll 上(解决该问题的最简单方法 - 从 B 中删除对 C 的引用,然后重新添加) ,只需确保您添加项目引用而不是浏览到 bin\Debug 中的 C.dll)。问题还存在吗?
如果您可以提供详细的甚至诊断性的 msbuild 日志(在开关/ds/v:diag 之后添加到您的 msbuild 命令行,然后在某处共享 teamcity 完整构建日志或通过管道将命令行日志传输到文件)或一些示例项目设置在哪里我可以重现这种行为 - 它对解决问题有很大帮助。
关于MSBuild 4.5 忽略项目依赖性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13752615/