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

13

我正在尝试编写一个F#脚本文件。因此,我使用Visual Studio“文件->新建->文件->F#脚本文件”来生成一个新的fsx文件。现在,我想通过打开Package Manager Console并输入以下内容来添加对FSharpData的引用:

Install-Package FSharp.Data

但我得到了以下错误。即使是 F# 脚本文件,解决方案总是必须要创建吗?

Install-Package : 当前环境没有打开的解决方案。
At line:1 char:1
+ Install-Package FSharp.Data
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [Install-Package], InvalidOperationException
    + FullyQualifiedErrorId : NuGetNoActiveSolution,NuGet.PowerShell.Commands.InstallPackageCommand

好的,简单的方法是从某个地方获取.dll文件(例如使用nuget创建一次性解决方案并抓取它),然后将其放在与您的.fsx文件相邻的位置 - 然后您可以继续使用#r调用它并使用它 - 除此之外,您还可以从脚本中调用nuget.exe来自行获取它,但我认为这会过度杀伤(而且您仍然需要将nuget.exe放在路径或文件旁边)。 - Random Dev
请注意,您现在可以简单地使用 #r nuget: PkgName - Abel
2个回答

20

自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#交互式环境的情况下完成所有操作。


注意事项。有一个新版本的示例packet.exe加载器代码,它不会硬编码版本。请参见:从F#交互使用Paket。它使用let url = "http://fsprojects.github.io/Paket/stable"let stable = wc.DownloadString(url)wc.DownloadFile(stable, tmp)。对于安装了较新版本NuGet的NuGet Feed Locations,请使用https://api.nuget.org/v3/index.json - Guy Coder

2
新的开箱即用方式是在您的.fsx脚本中添加以下内容:
#r "nuget: FSharp.Data, Version=3.3.3"

实现此功能的PR可以供参考;并且发布文章中也提到了这个功能。)

旧答案:

对于Linux用户而言,如果你的发行版是基于Debian(在Ubuntu 16.04上测试过),你可以在F#脚本内执行以下操作:

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

这样,你就不需要从某个Web服务器下载.exe文件,从而感觉完全不安全。

PS:请注意,你仍然需要相信(Microsoft的)Nuget服务器接收到的库(二进制文件)。


也许您可以更详细地说明第三步。 - Sam
非常抱歉回复晚了,但是你是什么意思呢?我认为这很明显,#r 这一行应该放在你的 .fsx 脚本中。 - knocte

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接