【问题标题】:xbuild and F# (vs2010) projectxbuild 和 F# (vs2010) 项目
【发布时间】:2011-10-20 00:28:25
【问题描述】:

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

我通常遇到的错误是:

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

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

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

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

编辑

多亏了 Brian 的指点,我才能够更接近一点(我确实必须硬编码路径,xbuild 似乎无法解决诸如 "$(MSBuildExtensionsPath32)..\FSharp\1.0\Microsoft. FSharp.目标”)。 FSC 现在实际上已被调用,尽管它抱怨无法解析对 FSharp.Core 的引用。

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

【问题讨论】:

  • 作为一个起点,项目文件将包含一个 <Import> 的其他 .targets 文件,并且这些其他目标定义例如Build 目标。
  • 谢谢布赖恩 - 这可能让我走上了正轨。我看到它正在从两个位置导入 Microsoft.FSharp.targets,我不相信任何一个都可以在 linux 机器上正确解析(目前无法检查)。如果最终是这种情况,我会看看是否有一种方法可以基于类似于“Environment.OSVersion.Platform”的东西进行条件导入,如果这不起作用,我可以使用符号链接或设置“Mono " 构建配置以控制此行为并将其传递给 xbuild。

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


【解决方案1】:

如果你使用这个,就不再需要hackery了:

【讨论】:

【解决方案2】:

事实证明,并行环境实际上让我的工作变得更轻松。 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 的一个弱点,但它似乎是一个误报——该项目实际上已经构建并成功运行)。希望这对其他人有帮助。

【讨论】:

  • 感谢您提供全面的答复。 :-]
猜你喜欢
  • 2013-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多