在 F# Interactive 中加载 dotnet 项目文件

peq*_*peq 6 .net f#

我有一个 F# dotnet 项目,其中有一些依赖项.fsproj(例如<PackageReference Include="FSharp.Data" Version="3.0.0-beta4" />)。

现在我想测试我编写的模块中的一些功能,所以我开始fsharpi并尝试使用#load "Program.fs";;.

然而,然后我得到了error FS0039: The type 'CsvProvider' is not defined

如何使用正确的依赖项加载我的模块?

我已经看到了解决方法,其中包括dll从一些模糊的系统相关路径手动加载所有必需的(例如#load a package in F# Interactive (FSharpChart.fsx)),但我想一定有更好的方法来做到这一点。

sdg*_*sdh 5

有几种选择可以做到这一点,但没有一个是完美的。

离子化物

如果您使用的是 Ionide,则可以右键单击 F# 视图中的项目并选择“生成 FSI 引用”。这将创建一个 F# 脚本,为您加载所有依赖项和项目文件。在下面写下你的测试代码。

这种方法的缺点:

  • 每次项目文件或依赖项发生更改时,您都需要运行该过程。
  • 尽管您可以将这些脚本签入源代码管理,但在您无权访问 VS Code 的情况下不适用。

帕克特

如果您使用 Paket,那么您可以为您的项目生成“加载脚本”:

dotnet paket generate-load-scripts
Run Code Online (Sandbox Code Playgroud)

这将生成./.paket/load. 每个依赖项(及其传递依赖项)和每个 Paket“组”都会有一个加载脚本。

paket.dependencies如果您添加此行,这可以自动与您同步:

generate_load_scripts: true
Run Code Online (Sandbox Code Playgroud)

请参阅:https ://fsprojects.github.io/Paket/paket-generate-load-scripts.html

这种方法的缺点:

  • 它可能会加载比您实际需要的更多的依赖项,这会带来性能成本
  • 您必须#load手动投影文件

点网 + Nuget

.NET 5 的新功能是,您可以直接在文件中写入 Nuget 字符串fsx。对于快速脚本来说,这是一个很棒的功能!

generate_load_scripts: true
Run Code Online (Sandbox Code Playgroud)

这种方法的缺点:

  • 如果您将 Paket 用于项目代码,它不会将包版本与 Paket 同步
  • 您必须#load手动投影文件

一天?

在理想的世界中,我们能够做这样的事情:

#r "nuget: FParsec"

// Package with a specific version
// #r "nuget: FParsec,1.1.1"

open FParsec

#load "./Types.fs"

// etc...
Run Code Online (Sandbox Code Playgroud)

这里有一个问题:https ://github.com/dotnet/fsharp/issues/8764