F# MSBuild生成解决方案,但未能生成项目

F# MSBuild生成解决方案,但未能生成项目,f#,msbuild,visual-studio-code,F#,Msbuild,Visual Studio Code,我有一个F#project,我想用命令行构建它(稍后在假配置中使用它)。 问题是,当我在项目文件上直接使用MSBuild时,它无法解析程序集依赖项。当我使用包含这个项目的解决方案文件时,它运行良好 我真的没有主意了。解决方案文件似乎不包含任何关键信息 另一件奇怪的事情是VSCode也无法解析其中一个程序集。我希望在修复MSBuild配置时,能够看到VSCode的错误 命令行: "C:\Program Files (x86)\MSBuild\14.0\Bin\msbuild.exe" FSharp

我有一个F#project,我想用命令行构建它(稍后在假配置中使用它)。 问题是,当我在项目文件上直接使用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.

告诉他们两个都没有定义。

将我的评论重新格式化为已验证有效的响应:

您的
FSharpWeb1.fsproj
引用了
MSBuild.ExtensionPack.FileSystem.File
中的
MSBuild.Extension.Pack
任务,但是
标记中指定的路径包含
$(SolutionDir)
属性,在Visual Studio之外运行MSBuild时未定义该属性

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

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

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

<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
\
(此解决方案的原始响应:)


我在评论中提到的另一件事是,此解决方案假定您已经在
packages
文件夹中下载了必要的依赖项。Visual Studio通过在生成之前还原NuGet软件包来自动实现这一点,但当您在另一个上下文中生成时,必须确保软件包已还原,否则生成将继续失败。

复制步骤?错误消息?项目有哪些依赖项,哪些依赖项无法得到解决?它们是带有解决方案级包还原的NuGet包吗?@MarkSeemann我已添加details@HonzaBrestan请查看我添加的详细信息。该项目具有Asp.Net Web.Api项目具有的标准依赖项。我不太清楚“解决方案级别的包恢复”。我在谷歌上搜索了一些令人讨厌的话题。看起来my.fsproj文件与nuget 2.7及更高版本兼容。所以,我不知道它会如何影响我的处境。谢谢,新的细节显示了更多关于这个问题的信息!我能注意到的第一件事是,在.fsproj中有一个对
MSBuild.Extensions.Pack
MSBuild引用,其路径包含
$(SolutionDir)
属性。这是错误路径中的
*未定义*
。在VS中构建解决方案时,会自动设置此属性,但必须传递给MSBuild,如下所示:它可以工作,谢谢。尽管很奇怪,MSBuild并没有抱怨缺少变量。我没想到会如此粗心大意。
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>