正しくコンパイルされ、提供されたタイプを定義するライブラリLibrary_1があります。
type modelforexcel = FSharpx.ExcelFile<@"template.xls", "Brokernet", true>
このライブラリを別のプロジェクトLibrary_2に含めると、コンパイラは、新しいLibrary_2プロジェクトのルートに「Brokernet.template.xls」が見つからないと文句を言います。
Error 4 'C:\Library_2\template.xls' could not be found. Check the spelling of the file name, and verify that the file location is correct.
タイプが元の「Brokernet.template.xls」を参照するようにしたいので、そのタイプへの完全なパスを提供しようとしていますが、
type modelforexcel =
FSharpx.ExcelFile<__SOURCE_DIRECTORY__+@"Brokernet.template.xls", "Brokernet", true>
リテラルではないと思うので、動作しません(?)しかし、このリテラルを定義する「明らかに」も動作しません
[<Literal>]
let a = __SOURCE_DIRECTORY__+@"Brokernet.template.xls"
そのような「動的リテラル」を定義する方法はありますか?
編集
興味深いことに、最初のライブラリのモジュール内でタイプを定義すると、
module Load =
[<Literal>]
let a = @"Brokernet.template.xls"
type modelforexcel = FSharpx.ExcelFile< a , "Brokernet", true>
その場合、2番目のライブラリで最初のライブラリを使用しても型は「再生成」されず、型プロバイダーは2番目のライブラリのルートにファイルがないことについて文句を言いません。
これは、おそらくマスターによって最もよく公開されるF#のコンパイルモデルに深い洞察をもたらします。大まかな言い方をすれば、「コードはモジュール内にある」とだけ言っておきます。
PS:それは適切な段階的コンパイルによって解決されるもう1つの問題だと思います。