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

ale*_*hro 2 msbuild f# visual-studio-code

我有F#项目,我想用命令行构建(稍后在FAKE配置中使用).问题是,当我直接在项目文件上使用它时,MSBuild无法解决程序集依赖性.当我使用包含此单个项目的解决方案文件时,它可以正常运行.

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

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

命令行:

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

错误信息:

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.
Run Code Online (Sandbox Code Playgroud)

我已将最小的演示推送到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
Run Code Online (Sandbox Code Playgroud)

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

Hon*_*tan 5

现在,我已将其评论重新格式化为响应,但已验证其有效:

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

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

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

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

<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
Run Code Online (Sandbox Code Playgroud)

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

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