f# - MSBuild 构建解决方案但无法构建项目

标签 f# msbuild visual-studio-code

我有一个 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 社区版中,从 F# Web 模板创建名为“Web Api 2.2”的新项目,然后尝试使用 MSBuild 构建它。

另一件令人不安的事情是,最小的演示产生的错误与我昨天看到的错误不同。 vscode 还提示不同的项目。如果昨天它无法解决几个调用,那么现在它会提示所有调用:

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

告诉我们它们都没有被定义。

最佳答案

现在将我的评论重新格式化为回复,已验证其有效:

您的FSharpWeb1.fsproj引用文献MSBuild.ExtensionPack.FileSystem.File任务来自MSBuild.Extension.Pack ,但是 <UsingTask> 中指定的路径标签包含$(SolutionDir)当您在 Visual Studio 外部运行 MSBuild 时未定义该属性。

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

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.

当 VS 未设置该属性时,可以通过有条件地设置相对路径来解决此问题:

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

(此解决方案的原始响应:https://stackoverflow.com/a/33782131/1659828)

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

关于f# - MSBuild 构建解决方案但无法构建项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40821011/

相关文章:

f# - 实现具有带有泛型类型参数的方法的 F# 接口(interface)类型

f# - 列表的最小/最大和最频繁的元素

msbuild - 如何使用MSBuild更改AssemblyProduct,AssemblyTitle?

.net - MSBuild 错误 MSB3021 : Unable to copy file. 找不到文件 'obj\Release\myWebProject1.dll'

c# - 如何指定引用的多目标项目的平台?

typescript - VS Code 是否安装 TypeScript,如果是 : where?

matlab - 您使用 Matlab/F#/R 进行数据分析和建模算法的经验

javascript - Visual Studio Code 智能感知和 JavaScript ES5

node.js - Visual Studio Code - 使用检查器协议(protocol)进行调试

f# - 什么是| f# 中的符号?