MSBuild无法解决具有项目依赖性的解决方案

时间:2017-09-29 15:59:58

标签: c# asp.net msbuild msbuild-15 msbuild-14.0

我的解决方案的构建(包含多个项目)突然出现故障并且问题的原因尚不清楚。解决方案中的所有项目都针对相同的框架(4.5.1),但是,某些项目的依赖项可能是针对该框架的早期版本。截至上周,我们能够成功构建属于这种情况的解决方案。从上周四开始,构建似乎被破坏而不对构建服务器或解决方案进行任何更改。

为了说明和消除我们的生产设置中的一些复杂性,我创建了一个模拟行为的示例解决方案。

项目结构:

  • CBI解决方案
    • CBI网站
    • CBI实施图书馆
    • CBI核心库,定义接口

网站和类库的目标框架版本是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 Repo:https://github.com/NikitaGolovko/Solution2.git

该解决方案与Solution1几乎完全相同,唯一的例外是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文件夹

当查看网站的bin文件夹时,我注意到在构建Solution2之后CBILite.dll丢失了,但是在Solution1中出现了。

TargetFrameworkVersion

在MSBuild参数中传递 TargetFrameworkVersion 似乎不会影响构建。我试图通过4.5,4.5.1无济于事。 HOWEVER 传递3.5会导致成功构建。这非常奇怪。

Metaproj

在比较为两种解决方案生成的Metaproj文件时,唯一可观察且看似重要的区别是缺少 TargetFrameworkVersion 元素。 Solution1(没有依赖项),包含 v.4.0 元素。 Solution2(具有依赖性)没有。 我没有在repo中包含metaproj文件,但如果需要可以共享它们。

Visual Studio

在Visual Studio中构建解决方案可以正常工作。

其他想法

这个问题突然显现出来,似乎影响了我们大多数混合项目的解决方案(C#/ VB +网站)。 Web项目继续正常运行。

我试图使用MSBuild 15,但它导致了相同的行为。

有一些解决方法

  1. 使用解决方案保留metaproj文件,并通过添加v4.5.1元素手动修改它。
  2. 添加额外的构建步骤以手动将CBILib.dll复制到网站项目中(通过批处理文件或其他方式)。
  3. 为指向CBILib / bin / Release文件夹的网站添加刷新文件
  4. 虽然所有这些解决方案都可行,但它们肯定是黑客攻击并且将来会出现问题。

    我希望别人对如何处理这个问题提出更好的建议。

1 个答案:

答案 0 :(得分:0)

确保已安装以下NuGet软件包:

  • Microsoft.NET.Test.Sdk

  • MSTest.TestAdapter

  • MSTest.TestFramework

  • Microsoft.NETCore.App(如果使用.NET Core)