【问题标题】:How to use nuget install package for F# script without a solution?如何在没有解决方案的情况下为 F# 脚本使用 nuget 安装包?
【发布时间】:2020-07-29 11:08:55
【问题描述】:

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

Install-Package FSharp.Data

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

Install-Package :当前环境没有打开解决方案。 在行:1 字符:1 + 安装包 FSharp.Data + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [Install-Package], InvalidOperationException + FullyQualifiedErrorId : NuGetNoActiveSolution,NuGet.PowerShell.Commands.InstallPackageCommand

【问题讨论】:

  • 那么简单的方法是从某个地方获取 .dll(例如,制作一次性解决方案并使用 nuget 获取它),然后将它放在您的 .fsx 文件旁边 - 然后您可以继续前进并#r 它并使用它-除此之外,您可以从脚本中调用 nuget.exe 来自己获取它,但这将是过度杀伤IMO(并且您仍然需要在您的路径或下一个路径中有nuget.exe到你的文件)
  • 请注意,您现在可以简单地使用#r nuget: PkgName

标签: f# nuget


【解决方案1】:

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

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

原答案:

suave.io 网站上记录了一个有趣的 hack,它会下载 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 的情况下做任何事情。

【讨论】:

  • 请注意。示例packet.exe 加载程序代码的较新版本不会对版本进行硬编码。请参阅:Using Paket from F# Interactive。它使用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
【解决方案2】:

开箱即用的新方法就是在您的 .fsx 脚本中添加以下内容:

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

The PR that implemented this,供参考;以及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 服务器接收到的库(二进制)。

【讨论】:

  • 也许您可以详细了解第 3 步
  • 很抱歉,答案很延迟,但您是什么意思?我认为很明显,#r 行将进入您的 .fsx 脚本
猜你喜欢
  • 1970-01-01
  • 2017-05-14
  • 1970-01-01
  • 2013-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-11
相关资源
最近更新 更多