読者です 読者をやめる 読者になる 読者になる

恐ろしい standalone オプション

この記事は、F# Advent Calendar 2012 14日目の記事です。

3ヶ月前の話しをします。僕はF#を使ってプロダクトに対するテストツールを作っていました。Webアプリケーションに対してリクエストを投げ、レスポンスやDBをチェックし、期待通りの動作をしているかチェックするツールです。

本番環境へデプロイして、テストツールを実行して動作を確認できれば、リリース完了となります。ですが、作業目前でとんでもない事実を知るのでありました。

テストツールを実行するマシンには! F#が!インストールされていない!インストールできない!!!
開発環境でしか動作しないツールを作るとかやる気あるんですかああああ

FShap.Core.dllを持っていけばいいじゃない

F#は実はただのライブラリなので、というかDSLなので、FShap.Core.dllを実行ファイルと同じディレクトリにコピーしておけば、F#で作ったプログラムを実行できます。
ですが注意が必要で、F# 2.0 のアセンブリには.NET Framework 2.0 用と .NET Framework 4.0 用の2種類があります。片方だけ利用している場合問題ないのですが、混在している場合は、コンパイルはできるのに実行できません。どちらかに統一してください。

F# コンパイラによるサポートもあります

FShap.Core.dllをコピーすればいいという話を先にしましたが、standaloneというコンパイラオプションを使えば、依存するアセンブリを成果物に含めることができます。このオプションをコンパイル時にしていすれば、F#がインストールされていない環境でもプログラムを実行できてしまいます。ナイスなオプションですね。
さらに、先ほど挙げた、.NET Framework 2.0用、4.0用のアセンブリが混在している場合はコンパイルが失敗します。コンパイルが成功したものは実行できる!

VS2012 での standalone オプションの指定方法

プロジェクトのプロパティを開き、ビルド > その他のフラグ に、--standalone と指定します。

standalone オプション利用時の注意点

standaloneオプションは出力形式がDLL、EXEのどちらでも利用できるのですが、EXEを出力するプロジェクトに指定するのが無難です。FShap.Core.dll等を取り込むため、standaloneオプションを指定して作成されたDLLと、FShap.Coreの両方を参照した場合、競合が起こりコンパイルができません。参照設定からFShap.Coreを除けば解決できるのですが、複数のプロジェクトを扱っていると面倒ですよね。

まとめ

この記事は僕が実際にハマった問題を元にしています。
standaloneオプションにより F# の無い環境でも実行できるようになりました。 妥協してF#を使わない理由がひとつ減ったと思います。