如何在没有解决方案的情况下为 F# 脚本使用 nuget 安装包?

How to use nuget install package for F# script without a solution?

我正在尝试编写 F# 脚本文件。所以我使用 Visual studio "File->New->Files->F# Script File" 来生成一个新的 fsx 文件。现在我想通过打开包管理器控制台并输入

添加对 FSharpData 的引用
Install-Package FSharp.Data

但是我得到了以下错误。是否总是需要为 F# 脚本文件创建解决方案?

Install-Package : The current environment doesn't have a solution open.
At line:1 char:1
+ Install-Package FSharp.Data
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [Install-Package], InvalidOperationException
    + FullyQualifiedErrorId : NuGetNoActiveSolution,NuGet.PowerShell.Commands.InstallPackageCommand

自 2019 年底以来,现在原生支持:

#r "nuget: Suave" 
#r "nuget: FSharp.Data" 
#r "nuget: FSharp.Charting" 

原回答:

suave.io 网站上记录了一个有趣的技巧,您可以执行该技巧,它会下载 Paket,然后使用它来下载软件包 - 所有这些都在脚本文件中的几行中完成:

// Step 0. Boilerplate to get the paket.exe tool
open System
open System.IO     
Environment.CurrentDirectory <- __SOURCE_DIRECTORY__
 
if not (File.Exists "paket.exe") then
    let url = "https://github.com/fsprojects/Paket/releases/download/0.31.5/paket.exe"
    use wc = new Net.WebClient()
    let tmp = Path.GetTempFileName()
    wc.DownloadFile(url, tmp)
    File.Move(tmp,Path.GetFileName url)
 
// Step 1. Resolve and install the packages     
#r "paket.exe"     
Paket.Dependencies.Install """
source https://nuget.org/api/v2

nuget Suave
nuget FSharp.Data
nuget FSharp.Charting
""";;

对我来说有点长,但它可以让您在不离开脚本文件和 F# Interactive 的情况下完成所有事情。

新的开箱即用的方法是将其添加到您的 .fsx 脚本中:

#r "nuget: FSharp.Data, Version=3.3.3"

(The PR that implemented this, for reference; and the release 此处揭晓。)


旧答案

对于那里的 Linux 用户,如果您的发行版是基于 Debian 的(使用 Ubuntu 16.04 测试过),您可以在 F# 脚本中执行:

  1. 安装 nuget 软件包(如果尚未安装)(使用 sudo apt install nuget)。
  2. nuget install FSharp.Data -Version 2.3.2.
  3. 通过 #r 行(例如 #r "FSharp.Data.2.3.2/lib/net40/FSharp.Data.dll)加载 DLL。

这样你就不需要从一些网络服务器上下载 .exe 文件了,感觉完全不安全。

PS:请注意,您仍然会信任从(Microsoft 的)Nuget 服务器收到的库(二进制)。