我的解决方案的构建包含多个项目,突然出现故障,问题的原因尚不清楚。解决方案中的所有项目都针对相同的框架 (4.5.1),但是,某些项目的依赖项可能针对框架的早期版本。截至上周,我们能够成功构建属于这种情况的解决方案。从上周四开始,构建似乎被破坏,而构建服务器或解决方案没有任何更改。
为了说明和消除我们的生产设置的一些复杂性,我创建了一个模拟行为的示例解决方案。
项目结构:
- CBI 解决方案
- CBI 网站
- CBI 实现库
- CBI Core 库,定义接口
网站和类库的目标框架版本是 4.5.1
复制步骤
解决方案 1
Github 仓库:https ://github.com/NikitaGolovko/Solution1.git
使用 MSBuild 14 构建。我的命令是:
msbuild.exe "%SOLUTION1PATH%\CBILite.sln" /p:platform="Any CPU" /p:configuration="Release" /v:d
输出
C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_compiler.exe -v /localhost_61806 -p cbi\ -u -f PrecompiledWeb\lo
calhost_61806\
Microsoft (R) ASP.NET Compilation Tool version 4.7.2046.0
Utility to precompile an ASP.NET application
Copyright (C) Microsoft Corporation. All rights reserved.
Done executing task "AspNetCompiler".
Task "Message" skipped, due to false condition; (!((false) or ('$(AspNetConfiguration)' == 'Debug') or ('$(AspNetConfig
uration)' == 'Release'))) was evaluated as (!((false) or ('Release' == 'Debug') or ('Release' == 'Release'))).
Done building target "Build" in project "cbi.metaproj".
Done Building Project "D:\Work\DotNet\Nikita\Solution1\cbi.metaproj" (default targets).
Done executing task "MSBuild".
Done building target "Build" in project "CBILite.sln".
Done Building Project "D:\Work\DotNet\Nikita\Solution1\CBILite.sln" (default targets).
Build succeeded.
0 Warning(s)
0 Error(s)
Time Elapsed 00:00:03.10
完整输出位于此处:https ://github.com/NikitaGolovko/Solution1/blob/master/MSBuild_Output.txt
解决方案 2
Github 回购:https ://github.com/NikitaGolovko/Solution2.git
该解决方案与解决方案 1 几乎相同,唯一的例外是 CBI 实现库中的 Unity 依赖项。为了简化过程并消除 nuget 还原步骤,我在解决方案中包含了 nuget 包。
使用 MSBuild 14 构建。我的命令是:
msbuild.exe "%SOLUTION2PATH%\CBILite.sln" /p:platform="Any CPU" /p:configuration="Release" /v:d
输出
C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_compiler.exe -v /localhost_61806 -p cbi\ -u -f PrecompiledWeb\lo
calhost_61806\
Microsoft (R) ASP.NET Compilation Tool version 4.7.2046.0
Utility to precompile an ASP.NET application
Copyright (C) Microsoft Corporation. All rights reserved.
D:\Work\DotNet\Nikita\Solution2\cbi\Index.aspx.vb(5): error BC30002: Type 'CBILite.Calculator' is not defined. [D:\Work
\DotNet\Nikita\Solution2\cbi.metaproj]
The command exited with code 1.
Done executing task "AspNetCompiler" -- FAILED.
Done building target "Build" in project "cbi.metaproj" -- FAILED.
Done Building Project "D:\Work\DotNet\Nikita\Solution2\cbi.metaproj" (default targets) -- FAILED.
Done executing task "MSBuild" -- FAILED.
Done building target "Build" in project "CBILite.sln" -- FAILED.
Done Building Project "D:\Work\DotNet\Nikita\Solution2\CBILite.sln" (default targets) -- FAILED.
Build FAILED.
完整输出位于此处:https ://github.com/NikitaGolovko/Solution2/blob/master/MSBuild_Output.txt
观察
文件夹
在查看网站的 bin 文件夹时,我注意到 CBILite.dll 在为解决方案 2 构建后丢失,但存在于解决方案 1 中。
目标框架版本
在 MSBuild 参数中传递TargetFrameworkVersion似乎不会影响构建。我试图通过 4.5、4.5.1 无济于事。但是通过 3.5 会导致成功构建。这非常奇怪。
元项目
在比较为这两种解决方案生成的 Metaproj 文件时,唯一可观察到且看似重要的区别是缺少TargetFrameworkVersion元素。解决方案 1(无依赖项),包含v.4.0元素。解决方案2(具有依赖项)没有。我没有在 repo 中包含 metaproj 文件,但如果需要可以共享它们。
视觉工作室
在 Visual Studio 中构建解决方案效果很好。
额外的想法
这个问题表现得相当突然,似乎影响了我们大多数具有混合项目的解决方案(C#/VB + 网站)。Web 项目继续正常运行。
我尝试使用 MSBuild 15,但它导致了相同的行为。
有一些解决方法
- 使用解决方案保留 metaproj 文件并通过添加 v4.5.1 元素手动修改它。
- 添加额外的构建步骤以手动将 CBILib.dll 复制到网站项目中(通过批处理文件或其他方式)。
- 为指向 CBILib/bin/Release 文件夹的网站添加刷新文件
虽然所有这些解决方案都可能有效,但它们肯定是黑客行为,并且将来会出现问题。
我希望其他人对如何处理这个问题有更好的建议。