Ove*_*urg 5 f# visual-studio f#-interactive
因此,在Project AB中,我有FileA.fs和FileB.fs.FileB使用FileA中的定义,FileA和FileB都使用Project C中的定义(用C#编写).
在FileA.FS中,我有:
#if COMPILED
namespace ProjectAB
#else
#I "bin\debug"
#r "ProjectZ.dll"
#endif
Run Code Online (Sandbox Code Playgroud)
......它的运作方式如何 - 我可以用F#-Interactive运行整个文件,这很棒.
在FileB.fs中,我的标题是:
#if COMPILED
module ProjectAB.ModuleB
#else
#load "FileA.fs"
#I "bin\debug"
#r "ProjectZ.dll"
#endif
Run Code Online (Sandbox Code Playgroud)
但是当我运行它(从FileB),我得到错误:
FileA.fs(6,1): error FS0222: Files in libraries or multiple-file applications must begin with a namespace or module declaration, e.g. 'namespace SomeNamespace.SubNamespace' or 'module SomeNamespace.SomeModule'. Only the last source file of an application may omit such a declaration.
Run Code Online (Sandbox Code Playgroud)
根据fsi.exe引用,#load指令"读取源文件,编译并运行它".但似乎必须在没有定义COMPILED指令的情况下这样做,因为它没有看到"命名空间ProjectAB"声明.
如何设置标题以便我可以在F#中运行任一文件?
编辑下面的每个latkin的答案,我创建了一个脚本作为项目中的最后一个文件_TestScript.fsx.我从其他文件中删除了所有预编译器的东西,并将其设置为.fsx文件的标头:
#if INTERACTIVE
#I "bin\debug"
#r "ProjectZ.dll"
#load "FileA.fs"
#load "FileB.fs"
#endif
Run Code Online (Sandbox Code Playgroud)
当我在交互式中运行它时,它正确加载ProjectZ,FileA和FileB供我在交互式窗口中访问.
但是,在_TestScript.fsx中,我从引用文件(包括"open"语句)的任何函数/类型中得到了波浪形的红线和智能感知.
我需要在脚本文件中设置其他内容以使intellisense工作吗?(答案可能非常基本,因为之前我没有使用.fsx文件.)
我认为没有办法可以顺利地做到这一点。有几点需要考虑:
INTERACTIVE始终在 fsi.exe 处理时定义,无论您是 .fsx、.fs、#load'ed 还是其他。COMPILED同样,当您被 fsc.exe 处理时,总是会被定义。我可以看到文档中引用的短语可能并没有使这一点完全清晰。
您只能从#load'ed 文件中声明 fsi 中的命名空间
因此,如果您希望文件声明一个命名空间,并在交互中作为单个文件工作,则必须删除该命名空间#ifdef。但这也意味着#ifdef当文件被“编辑”时,名称空间将被#load“编辑”...
您可以通过有条件地将其声明为模块而不是命名空间来解决此问题。或者也许创建额外的、更细粒度的定义。这会很棘手。
尝试让源文件作为已编译库的一部分并同时作为单文件脚本正常工作并不容易,而且我认为该工具在设计时并未考虑到这种情况。更常见的是让所有库文件纯粹作为库文件运行,然后使用专用的独立脚本来获取#load它们所需的 .fs 文件。这使驱动代码和库代码保持分离,并且可以更干净地组合在一起。