如何在PowerShell脚本中使用NuGet包?

21

我正在编写一个使用 Mono.Cecil 库的 PowerShell 脚本。我该如何安装这个包,以便在脚本中使用它?谢谢!

(顺便说一下,我在提问前尝试过谷歌搜索,但搜到的都是关于 PMC 和 Visual Studio 的结果,与这个问题无关。)

3个回答

17

我能够通过指定源在PowerShell 6 (Core)中安装一个软件包:

PS > install-package gudusoft.gsqlparser -source https://www.nuget.org/api/v2

10

默认情况下,PowerShell 的 ~5.x 版本包含了一个 NuGet 包源,但它无法正常工作:

PS > Get-PackageSource 
Name                             ProviderName     IsTrusted  Location
----                             ------------     ---------  --------
nuget.org                        NuGet            False      https://api.nuget.org/v3/index.json
PSGallery                        PowerShellGet    False      https://www.powershellgallery.com/api/v2/
如果您使用Unregister-PackageSource -Source nuget.orgRegister-PackageSource -Location https://www.nuget.org/api/v2 -name nuget.org-Trusted,则可以仅使用Install-Package在PowerShell中安装NuGet包,而不是在Visual Studio中安装。这个想法来自于此SO答案。我不知道删除nuget.org源的v3版本会有什么其他可能的负面影响,但我已经这样运行一段时间了,看起来一切都好,结果可能因人而异。作为替代方案,下面是一个示例,通过下载nuget.exe完成该任务,即使这种方法并不理想:
function Install-InvokeOracleSQL {
    $ModulePath = (Get-Module -ListAvailable InvokeSQL).ModuleBase
    Set-Location -Path $ModulePath

    if ($PSVersionTable.Platform -ne "Unix") {
        $SourceNugetExe = "https://dist.nuget.org/win-x86-commandline/latest/nuget.exe"
        $TargetNugetExe = ".\nuget.exe"
        Invoke-WebRequest $sourceNugetExe -OutFile $targetNugetExe
        .\nuget.exe install Oracle.ManagedDataAccess
        Remove-Item -Path $TargetNugetExe
    } elseif ($PSVersionTable.Platform -eq "Unix") {
        nuget install Oracle.ManagedDataAccess.Core -Version 2.12.0-beta2
    }
}

1
Unregister-PackageSource -Source nuget.org - Josh Gust
1
@JoshGust 的名称似乎被别名为 Unregister-PackageSource -Name nuget.org -WhatIf,这个命令似乎可以工作,但 -Source 更加正确,因此我已经编辑了答案。 - Chris Magnuson
4
我发现,通过运行 Register-PackageSource nugetV2 https://www.nuget.org/api/v2 -ProviderName NuGet,然后再用 install-package packageName -Source nugetV2 命令就可以直接安装所需的包,无需注销任何内容。@JamesKo,我确实需要手动添加 add-type -path _longPathName_,我不确定你是否期望所有这些操作都是自动完成的。使用 Get-Package 命令可以查看已安装的位置(并且它会自动解压缩)。如果你想以非管理员权限运行,请使用 -Scope CurrentUser 参数。 - unbob

-22

无法找到一个好的解决方案,最终我只能通过 NuGet API 手动下载和解压缩包。

对于那些感兴趣或遇到同样问题的人,这里是我使用的代码。


27
“我放弃了”并不真正称得上是一个答案,也肯定不是被接受的答案。最多可以归类为评论,这样问题看起来就没有得到回答(同时可能会被知道如何解决问题的人找到)。 - Tullo_x86
9
@Tullo_x86说:接受的标记完全取决于问题提问者。这是一个合格的答案,因为它试图提出一个解决方案。我们可以使用投票来表示我们认为它作为答案有多大帮助。 - Martijn Pieters

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