Linux/Mono 環境のビルドツールである XBuild は MSBuild といろいろ違って,単純に MSBuild でビルドできたプロジェクトが XBuild でビルドできるようになるとは限りません。 Visual Studio 2012 で作成した F# プロジェクト (.fsproj) もそのままではビルドできません。
ビルドが失敗する原因は, Import 要素の Condition で使われている Exists が働いてくれないために, Microsoft.FSharp.Targets が読み込まれないためです。そこで以前作成した NUnit プロジェクトファイルを修正するスクリプトを少し修正して, F# プロジェクトファイルを改変するスクリプトを作成します。
変更するのは editProject 関数のみです。
let editProject rawProjectXml =
let project = XDocument.Parse rawProjectXml
query {
for import in project.Descendants (XName.Get ("Import", "http://schemas.microsoft.com/developer/msbuild/2003")) do
let project = import.Attribute (XName.Get ("Project"))
where (project.Value.EndsWith ("Microsoft.FSharp.Targets"))
select (import.Attribute (XName.Get ("Condition")))
}
|> Seq.iter (fun attribute -> attribute.Remove ())
project
プロジェクトファイル中に Import 要素は Microsoft.Common.props と Microsoft.FSharp.Targets の 2 つあります。 Microsoft.Common.props は Mono 環境では存在しないので無視して[A] Microsoft.FSharp.Targets の方のみ Condition 属性を取り除いてやります[B]。