我有一个库 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>
然后在第二个库中使用第一个库时不会“重新生成”该类型,并且类型提供程序不会抱怨该文件不存在第二个库的根目录。
这为 F# 的编译模型提供了深刻的见解,这可能是大师们最好揭示的。作为一个粗鲁的人,我只想说“代码在模块中”
PS:我想那是另一个问题,可以通过适当的分阶段编译来解决。