有办法在fsx文件之间共享类型吗?
当使用#load从多个FSX文件加载包含类型的相同文件时,它们似乎每次都被前缀到不同的FS_00xx命名空间中,这意味着您不能传递它们。
有什么办法可以避免这种行为而不去编译成一个程序集呢?
发布于 2014-08-16 07:39:48
至于
http://msdn.microsoft.com/en-us/library/dd233169.aspx
.fsx文件用于在F#中包含非正式测试代码,而无需将测试代码添加到应用程序中,也无需为其创建单独的项目。默认情况下,即使脚本文件是项目的一部分,它们也不包含在项目的构建中。
这意味着,如果您有一个具有足够结构的项目存在这种依赖关系问题,则不应该使用.fsx文件,而应该使用.fs文件编写模块/命名空间。也就是说,您确实应该将它们类型编译成程序集。
f#交互式解释器为每个加载的文件生成程序集。如果您加载一个文件两次,则字节码会生成两次,而且即使它们具有相同的定义和名称,它们的类型也是不同的。这意味着您无法在两个.fsx文件之间共享类型,除非其中一个文件包含另一个文件。
当您使用与环境中已经存在的文件类型相同的#load文件时,f#交互式解释器可以使用两种不同的策略:
FS_00xx命名空间中(因此它们实际上与您已经加载的名称空间不同),最终对生成的名称空间进行open,这样就可以从交互式会话中获得名称。由于fsx文件应该用作非正式测试,所以使用第二种方法更方便用户(使用第二种方法也有技术原因,主要依赖于.net VM类型系统,而且现有类型不能在运行时更改)。
发布于 2016-07-15 15:31:55
[备注:,这是对更具体的问题的一个更具体的回答,它是对这个答案的复制。]
我不认为有一个好的和容易的解决办法。我在一些项目(如F#片段网站)中使用的唯一解决方案是,只有一个顶级fsx文件加载大量fs文件。例如,请参见app.fsx。
因此,您可以按如下方式从common.fs、intMapper.fs和stringMapper.fs中加载caller.fsx:
#load "common.fs"
#load "stringMapper.fs"
#load "intMapper.fs"
open Common在stringMapper.fs和intMapper.fs中,您不加载common.fs。通常的类型将由caller.fsx加载,所以一切都会正常进行。
唯一的问题是intMapper.fs现在不是一个独立的脚本文件,如果您想在编辑器中获得自动完成,您需要添加一个指定文件顺序的fsproj文件。在F#片段项目中,有项目档案,它指定编辑器应该查看和加载文件的顺序。
发布于 2015-05-29 15:56:13
将所有#load和#open指令包含在实际从fsi.exe运行的文件中(下面的示例中为C),并确保加载的文件本身不#load它们自己的依赖关系:
文件A.fsx,B.fsx,C.fsx。B依赖于A C依赖于B和A。
乙含
//adding the code below would cause the types defined in A to be loaded twice
//#load "A.fsx"
//#open AC包含
#load "A.fsx"
#open A
#load "B.fsx"
#open B不幸的是,这使得所有文件很难从Visual编辑--编辑器不知道它们的依赖关系,并显示各种错误。
因此,这有点麻烦,推荐的方法似乎是拥有一个.fsx文件并将其他所有内容编译成一个.dll:
// file1.fsx #r "MyAssembly.dll“ https://msdn.microsoft.com/en-us/library/dd233175.aspx
https://stackoverflow.com/questions/24285116
复制相似问题