xbuild和F# (vs2010)项目

4
我有一个VS 2010混合语言解决方案,主要是C#,但包含用F#编写的Windows服务。 我曾经在平行环境中使用xbuild构建过,但自从升级到来自badgerports的打包版本的mono 2.10.5后,我就无法使其正常工作。我通常遇到的错误是:“/home/alex/git/Solution/FSProject/FSProject.fsproj: error : Target named 'Build' not found in the project.”。令我困惑的是,查看项目文件时,似乎没有定义任何目标。我远非MSBuild专家,但这对我来说似乎有点奇怪。尽管如此,它之前确实可以工作。是否有人遇到过类似问题(并希望找到解决方案)?如果可能,我想能够使用xbuild和Visual Studio构建解决方案。环境是mint 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)在帮助我到达这一步时非常有用。


1
作为一个起点,项目文件将包含其他.targets文件的<Import>,而这些其他目标定义了例如Build目标。 - Brian
谢谢Brian - 这可能让我走上了正确的轨道。我看到它从两个位置导入Microsoft.FSharp.targets,我不认为任何一个位置都能在Linux机器上正确解决(目前无法检查)。如果最终是这种情况,我将看看是否有一种方法可以根据类似于“Environment.OSVersion.Platform”的条件导入,如果这样做不起作用,我可以使用符号链接或设置一个“Mono”构建配置来控制此行为并将其传递给xbuild。 - AlexCuse
2个回答

6

1
F#的GitHub代码库包含F# 3.0版本——甚至有一个工作中的CI构建,网址为http://teamcity.codebetter.com/viewType.html?buildTypeId=bt814。 - forki23

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


感谢您跟进并提供了全面的答案。:-] - ildjarn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接