【问题标题】:MSBuild builds solution but fails to build the projectMSBuild 构建解决方案但无法构建项目
【发布时间】:2016-11-26 17:24:44
【问题描述】:

我有 F# 项目,我想用命令行构建它(稍后在 FAKE 配置中使用)。 问题是当我直接在项目文件上使用 MSBuild 时,它无法解析程序集依赖项。虽然当我使用包含这个单个项目的解决方案文件时它会很好。

我真的没有想法了。解决方案文件似乎不包含任何关键信息。

另一个奇怪的事情是 VSCode 也无法解析其中一个程序集。我希望当我修复 MSBuild 配置时,我可能能够看到 VSCode 出了什么问题。

命令行:

"C:\Program Files (x86)\MSBuild\14.0\Bin\msbuild.exe" FSharpWeb1\FSharpWeb1.fsproj /t:rebuild

错误信息:

C:\work\MNP\testMSBuild1\FSharpWebApi\FSharpWeb1\FSharpWeb1.fsproj(173,5): error MSB4062: The "MSBuild.ExtensionPack.FileSystem.File" task could not be loaded from the assembly C:\work\MNP\testMSBuild1\FSharpWebApi\FSharpWeb1\*Undefined*\packages\MSBuild.Extension.Pack.1.3.0\tools\net40\MSBuild.ExtensionPack.dll. Could not load file or assembly 'file:///C:\work\MNP\testMSBuild1\FSharpWebApi\FSharpWeb1\*Undefined*\packages\MSBuild.Extension.Pack.1.3.0\tools\net40\MSBuild.ExtensionPack.dll' or one of its dependencies. The filename, directory name, or volume label syntax is incorrect. Confirm that the <UsingTask> declaration is correct, that the assembly and all its dependencies are available, and that the task contains a public class that implements Microsoft.Build.Framework.ITask.Done Building Project "C:\work\MNP\testMSBuild1\FSharpWebApi\FSharpWeb1\FSharpWeb1.fsproj" (rebuild target(s)) -- FAILED.

我已经将最小的演示推送到 github:https://github.com/alehro/testMSBuild.git

它实际上很容易独立复制。在 VS 2015 社区版中,从名为“Web Api 2.2”的 F# Web 模板创建新项目,然后尝试使用 MSBuild 构建它。

另一个令人不安的事情是,最小的演示会产生与我昨天看到的不同的错误。 vscode 也抱怨不同的项目。如果昨天它无法解决几个电话,现在它会抱怨所有:

open System.Net.Http
open System.Web
open System.Web.Http
open System.Web.Routing

告诉他们都没有定义。

【问题讨论】:

  • 复制步骤?错误信息?
  • 项目有哪些依赖项,哪些依赖项未能解决?它们是具有解决方案级包还原功能的 NuGet 包吗?
  • @MarkSeemann 我已添加详细信息
  • @HonzaBrestan 请查看我添加的详细信息。该项目具有 Asp.Net Web.Api 项目具有的标准依赖项。不确定“解决方案级包还原”。我在谷歌上搜索并找到了一些关于讨厌的话题。看起来我的 .fsproj 文件与 nuget 2.7 及更高版本兼容。所以,我不知道它会如何影响我的情况。
  • 谢谢,新的细节更能说明问题!我注意到的第一件事是,在您的 .fsproj 中有一个 &lt;UsingTask&gt; MSBuild 对 MSBuild.Extensions.Pack 的引用,其路径包含 $(SolutionDir) 属性。这是错误路径中的*Undefined*。此属性在 VS 中构建解决方案时自动设置,但必须传递给 MSBuild,如下所示:stackoverflow.com/a/15053967/1659828

标签: f# msbuild visual-studio-code


【解决方案1】:

现在将我的 cmets 重新格式化为响应,因为它已验证有效:

您的FSharpWeb1.fsproj 引用来自MSBuild.Extension.PackMSBuild.ExtensionPack.FileSystem.File 任务,但&lt;UsingTask&gt; 标记中指定的路径包含$(SolutionDir) 属性,当您在Visual Studio 之外运行MSBuild 时未定义该属性。

您收到的错误消息显示在路径的突出显示部分:

无法从程序集 C:\work\MNP\testMSBuild1\FSharpWebApi\FSharpWeb1\*Undefined*\packages\MSBuild.Extension 加载“MSBuild.ExtensionPack.FileSystem.File”任务.Pack.1.3.0\tools\net40\MSBuild.ExtensionPack.dll。

这可以通过在VS没有设置属性时有条件地设置相对路径来解决:

<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>

(此解决方案的原始回复:https://stackoverflow.com/a/33782131/1659828

我在 cmets 中提到的另一件事是,此解决方案假定您已经在 packages 文件夹中下载了必要的依赖项。 Visual Studio 通过在构建之前恢复 NuGet 包来自动执行此操作,但是当您在另一个上下文中构建时,必须确保包已恢复,否则构建将继续失败。

【讨论】:

  • 它有效,谢谢。虽然奇怪的是 MSBuild 没有抱怨缺少变量。没想到这么粗心。
猜你喜欢
  • 1970-01-01
  • 2018-03-08
  • 2011-06-07
  • 2013-08-15
  • 2020-06-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-03
  • 2016-04-26
相关资源
最近更新 更多