xbuild和F#(vs2010)项目

时间:2011-10-20 00:28:25

标签: visual-studio-2010 msbuild f# mono xbuild

我有一个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)有助于实现这一目标。

2 个答案:

答案 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的一个弱点,但它似乎是一个误报 - 该项目实际上已经构建并成功运行)。希望这有助于其他人。