我有一个VS 2010混合语言解决方案,主要是C#,但包含一个用F#编写的Windows服务。我在并行环境中使用xbuild构建了这个版本,但自从badgerports升级到mono 2.10.5的打包版本后,我一直无法使其工作。
我经常遇到的错误是:
/home/alex/git/Solution/FSProject/FSProject.fsproj:错误:在项目中找不到名为“Build”的目标。
让我感到困惑的是,查看项目文件时,似乎没有定义任何目标。我远不是MSBuild的专家,但这对我来说似乎有点奇怪。话虽如此,它以前确实有效。
有没有人遇到(并希望找到解决方案)类似的问题?如果可能的话,我希望能够使用xbuild和Visual Studio构建解决方案。
环境是薄荷11(不确定这是基于ubuntu maverick还是natty)从badgerports运行mono 2.10.5。 fsharp从最新源安装到默认前缀。
修改
由于Brian的指针(我确实需要硬编码路径,xbuild似乎无法解决诸如“$(MSBuildExtensionsPath32).. \ FSharp \ 1.0 \ Microsoft之类的东西),因此我能够更接近一点。 FSharp.Targets“)。 FSC现在实际上已被调用,但它抱怨它无法解析对FSharp.Core的引用。
我发现此页面F# and XBuild (Debian)有助于实现这一目标。
答案 0 :(得分:6)
如果你使用它,就不再需要hackery了:
答案 1 :(得分:3)
事实证明,并行环境实际上让我更容易。 Mono安装在/ usr,而F#安装在/ usr / local,所以我需要设置符号链接以启用FSharp目标和Common目标来看到对方。详情请参阅:F# and XBuild (Debian)
一旦设置好,我仍然遇到麻烦。添加一些调试消息后,我发现xbuild没有正确解析F#目标的路径。项目文件试图像这样导入:
<Import Project="$(MSBuildExtensionsPath32)\FSharp\1.0\Microsoft.FSharp.Targets" Condition="!Exists('$(MSBuildBinPath)\Microsoft.Build.Tasks.v4.0.dll')" />
<Import Project="$(MSBuildExtensionsPath32)\..\Microsoft F#\v4.0\Microsoft.FSharp.Targets" Condition="Exists('$(MSBuildBinPath)\Microsoft.Build.Tasks.v4.0.dll')" />
并且xbuild无法解析相对路径。所以我把它改成了这个:
<Import Project="$(TargetsPath)" Condition="$(TargetsPath) != ''" />
<Import Project="$(MSBuildExtensionsPath32)\FSharp\1.0\Microsoft.FSharp.Targets" Condition="$(TargetsPath) == '' And !Exists('$(MSBuildBinPath)\Microsoft.Build.Tasks.v4.0.dll')" />
<Import Project="$(MSBuildExtensionsPath32)\..\Microsoft F#\v4.0\Microsoft.FSharp.Targets" Condition="$(TargetsPath) == '' And Exists('$(MSBuildBinPath)\Microsoft.Build.Tasks.v4.0.dll')" />
允许我在命令行上将路径传递给FSharp.targets。
还有一些问题(关于ItemGroups未注册的投诉失败,我知道这是xbuild的一个弱点,但它似乎是一个误报 - 该项目实际上已经构建并成功运行)。希望这有助于其他人。