4

我有一个主要是 C# 的 VS 2010 混合语言解决方案,但包含一个用 F# 编写的 Windows 服务。我在并行环境中使用 xbuild 构建了这个建筑,但是自从从badgerports升级到 mono 2.10.5 的打包版本后,我一直无法让它工作。

我通常遇到的错误是:

/home/alex/git/Solution/FSProject/FSProject.fsproj:错误:在项目中找不到名为“Build”的目标。

令我困惑的是,查看项目文件,似乎没有定义任何目标。我远非 MSBuild 专家,但这对我来说似乎有点奇怪。话虽如此,它以前确实有效。

有没有人遇到过(并希望找到解决方案)类似的问题?如果可能的话,我希望能够使用 xbuild 和 Visual Studio 构建解决方案。

环境是从 badgerports 运行单声道 2.10.5 的 mint 11(不确定这是基于 ubuntu 特立独行还是 natty)。fsharp 是从最新源安装到默认前缀的。

编辑

多亏了布赖恩的指针,我已经能够更接近一点(我确实必须对路径进行硬编码,xbuild 似乎无法解决诸如 "$(MSBuildExtensionsPath32)..\FSharp\1.0\Microsoft.FSharp.Targets 之类的问题”)。FSC 现在实际上正在被调用,尽管它抱怨它无法解析对 FSharp.Core 的引用。

我发现此页面F# 和 XBuild (Debian)有助于实现这一目标。

4

2 回答 2

6

如果您使用它,则不再需要hackery:

于 2012-09-17T13:07:29.333 回答
3

所以事实证明,并行环境实际上让我的事情变得更轻松。Mono 安装在 /usr,而 F# 安装在 /usr/local,所以我需要设置符号链接以使 FSharp 目标和 Common 目标能够相互看到。这在此处进行了详细说明:F# 和 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 的一个弱点,但它似乎是一个误报——该项目实际上已成功构建并运行)。希望这对其他人有帮助。

于 2011-10-24T22:53:03.857 回答