是否可以将 #load 指令放在 F# fsx 文件中的 #if 指令中?

Should it be possible to put the #load directive inside #if directive in F# fsx file?

我有一个 fsx 文件,我尝试在其中执行此操作

#if DEV
#load "MyFile.fs"
#endif

// Later in the file
#if DEV
callSomethingFromMyFile()
#endif

如果我删除 #load 指令周围的 #if DEV ... #endifcallSomethingFromMyFile() 会起作用。

我意识到这可能是一件奇怪的事情,但这是因为我正在使用寓言来编译F#到js,如果我想在生产时排除一个文件"build"以减少js文件尺寸。

” 在 F# Interactive 中执行脚本时,某些指令可用,但在执行编译器时不可用。以下 table 总结了使用 F# Interactive 时可用的指令。 “

https://docs.microsoft.com/en-us/dotnet/articles/fsharp/tutorials/fsharp-interactive/index#differences-between-the-interactive-scripting-and-compiled-environments

然后 table 列出了#load。不完全清楚该文本(编译器与预处理器),但它也有点道理......

在常规 F# 脚本中是可能的,似乎 fable 无法处理它。

为了验证它在常规 F# 中是否有效,我创建了以下文件:

MyModule.fs:

module MyModule
type A = {b: string}

script.fsx:

#if DEV
#load "./MyModule.fs"
#endif

#if DEV
open MyModule
printfn "Hello A: %A" {b = "yolo"}
#endif
printfn "Done"

运行 fsharpi --define:DEV --exec script.fsx 按预期工作。我希望 Windows 上的 fsi 也能正常工作。

我已在以下 PR 中解决此问题:https://github.com/fable-compiler/Fable/pull/429

您目前可以将定义传递给交互式检查器,只是对于 fsx 文件,目前还没有这样做。