3

正しくコンパイルされ、提供されたタイプを定義するライブラリ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つの問題だと思います。

4

1 に答える 1

4

コメントに示されているように、たとえば相対パスを使用@"..\Library_1\Brokernet.template.xls"すると問題が解決しました。

于 2012-12-18T19:16:28.607 に答える