Powershell:如何在未连接的计算机上安装适用于 PowerShell 的 Nuget 提供程序,以便可以从 PS 命令行安装 nuget 包?
Posted
技术标签:
【中文标题】Powershell:如何在未连接的计算机上安装适用于 PowerShell 的 Nuget 提供程序,以便可以从 PS 命令行安装 nuget 包?【英文标题】:Powershell: How do I install the Nuget provider for PowerShell on a unconnected machine so I can install a nuget package from the PS command line? 【发布时间】:2018-12-26 15:35:01 【问题描述】:我正在尝试在未连接到 Internet 的 Win 7 计算机上从 Powershell 命令行安装 pswindowsupdate.2.0.0.4.nupkg
。我正在运行 PS 5.1.14409.1005。我从https://www.preview.powershellgallery.com/packages/PSWindowsUpdate/2.0.0.4获得了nupkg
PS
命令Install-Module -Name pswindowsupdate.2.0.0.4.nupkg -Repository path to pswindowsupdate.2.0.0.4.nupkg
抛出错误消息:
PowerShellGet 需要 NuGet 提供程序版本“2.8.5.201”或更高版本才能与基于 NuGet 的存储库进行交互。 NuGet 提供程序必须在“C:\Program Files\PackageManagement\ProviderAssemblies”或“C:\Usersmy login\AppData\Local\PackageManagement\ProviderAssemblies”中可用。您还可以通过运行“Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force”来安装 NuGet 提供程序。是否希望 PowerShell 现在安装和导入 NuGet 提供程序?
说“是”当然无法安装 NuGet 提供程序,因为我没有连接到互联网。
我获得了nuget.exe
(v4.7.0),将其存储在“C:\Program Files\PackageManagement\ProviderAssemblies”中,并将“C:\Program Files\PackageManagement\ProviderAssemblies”添加到我的path
语句中。但是,执行Install-Module -Name pswindowsupdate.2.0.0.4.nupkg -Repository path to pswindowsupdate.2.0.0.4.nupkg
仍然失败。
NuGet provider
到底是什么?它只是nuget.exe吗?如何获取并安装适用于 PowerShell 的 Nuget 提供程序(v2.8.5.201 或更高版本),以便我可以从 PowerShell 命令行安装此 nuget 包?
注意:Visual Studio 与我的问题没有任何关系
【问题讨论】:
【参考方案1】:虽然我已经尝试了所有以前的答案,但只有以下一个解决了:
1 - 打开 Powershell(以管理员身份)
2 - 运行:
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
3 - 运行:
Install-PackageProvider -Name NuGet
作者是 Niels Weistra: Microsoft Forum
【讨论】:
由于某种原因,Microsoft 尚未将该存储库更新为更好的 SSL 版本,因此在使用命令 2 允许降级 TLS 版本之前我遇到了错误。感谢您的提示! 解决了我有互联网连接但安装包仍然抱怨连接问题的问题 我认为这应该是的解决方案。 如果系统上启用了 FIPS,那么也会抛出错误【参考方案2】:我接受了trebleCode's answer,但我想提供更多详细信息,说明我按照 trebleCode 的回答,在未连接的 Win 7 机器上安装感兴趣的 nupkg pswindowsupdate.2.0.0.4.nupkg
的步骤。
首先:经过一番挖掘,我想我找到了 trebleCode 所指的 MS 文档:
Bootstrap the NuGet provider and NuGet.exe
Install-PackageProvider
要继续,如 trebleCode 所述,我做了以下操作
在我连接的机器上安装 NuGet 提供程序
在连接的机器(Win 10 机器)上,我从 PS 命令行运行 Install-PackageProvider -Name NuGet -RequiredVersion 2.8.5.208 -Force
。 Nuget 软件是从 'Net 获得并安装在我本地连接的机器上。
安装后,我在C:\Program Files\PackageManagement\ProviderAssemblies
找到了 NuGet 提供程序软件(注意:文件夹名称 \ProviderAssemblies
而不是 \ReferenceAssemblies
是相对于 trebleCode 答案的一个小区别。
提供者软件的文件夹结构如下:
C:\Program Files\PackageManagement\ProviderAssemblies
\NuGet
\2.8.5.208
\Microsoft.PackageManagement.NuGetProvider.dll
在我未连接的机器上安装 NuGet 提供程序
我将 \NuGet 文件夹(及其所有子文件夹)从连接的机器复制到拇指驱动器上,并将其复制到我未连接的 (Win 7) 机器上的 C:\Program Files\PackageManagement\ProviderAssemblies
我在未连接 (Win 7) 的机器上启动 PS (v5) 并运行 Import-PackageProvider -Name NuGet -RequiredVersion 2.8.5.208
以将提供程序导入当前的 PowerShell
会话。
我跑了Get-PackageProvider -ListAvailable
并看到了这个(NuGet 出现在以前不存在的地方):
Name Version DynamicOptions
---- ------- --------------
msi 3.0.0.0 AdditionalArguments
msu 3.0.0.0
NuGet 2.8.5.208 Destination, ExcludeVersion, Scope, SkipDependencies, Headers, FilterOnTag, Contains, AllowPrereleaseVersions, ConfigFile, SkipValidate
PowerShellGet 1.0.0.1 PackageManagementProvider, Type, Scope, AllowClobber, SkipPublisherCheck, InstallUpdate, NoPathUpdate, Filter, Tag, Includes, DscResource, RoleCapability, Command, PublishLocati...
Programs 3.0.0.0 IncludeWindowsInstaller, IncludeSystemComponent
在我未连接的机器上创建本地存储库
在未连接的 (Win 7) 机器上,我创建了一个文件夹作为我的 PS 存储库(例如,c:\users\foo\Documents\PSRepository
)
我注册了 repo:Register-PSRepository -Name fooPsRepository -SourceLocation c:\users\foo\Documents\PSRepository -InstallationPolicy Trusted
安装 NuGet 包
我在未连接的 Win7 机器上获取并复制了 nupkg pswindowsupdate.2.0.0.4.nupkg
到 c:\users\foo\Documents\PSRepository
我通过执行Find-Module -Repository fooPsRepository
获知了模块的名称
Version Name Repository Description
------- ---- ---------- -----------
2.0.0.4 PSWindowsUpdate fooPsRepository This module contain functions to manage Windows Update Client.
我通过执行Install-Module -Name pswindowsupdate
安装了模块
我通过执行 Get-Command –module PSWindowsUpdate
验证了安装的模块
CommandType Name Version Source
----------- ---- ------- ------
Alias Download-WindowsUpdate 2.0.0.4 PSWindowsUpdate
Alias Get-WUInstall 2.0.0.4 PSWindowsUpdate
Alias Get-WUList 2.0.0.4 PSWindowsUpdate
Alias Hide-WindowsUpdate 2.0.0.4 PSWindowsUpdate
Alias Install-WindowsUpdate 2.0.0.4 PSWindowsUpdate
Alias Show-WindowsUpdate 2.0.0.4 PSWindowsUpdate
Alias UnHide-WindowsUpdate 2.0.0.4 PSWindowsUpdate
Alias Uninstall-WindowsUpdate 2.0.0.4 PSWindowsUpdate
Cmdlet Add-WUServiceManager 2.0.0.4 PSWindowsUpdate
Cmdlet Enable-WURemoting 2.0.0.4 PSWindowsUpdate
Cmdlet Get-WindowsUpdate 2.0.0.4 PSWindowsUpdate
Cmdlet Get-WUApiVersion 2.0.0.4 PSWindowsUpdate
Cmdlet Get-WUHistory 2.0.0.4 PSWindowsUpdate
Cmdlet Get-WUInstallerStatus 2.0.0.4 PSWindowsUpdate
Cmdlet Get-WUJob 2.0.0.4 PSWindowsUpdate
Cmdlet Get-WULastResults 2.0.0.4 PSWindowsUpdate
Cmdlet Get-WURebootStatus 2.0.0.4 PSWindowsUpdate
Cmdlet Get-WUServiceManager 2.0.0.4 PSWindowsUpdate
Cmdlet Get-WUSettings 2.0.0.4 PSWindowsUpdate
Cmdlet Get-WUTest 2.0.0.4 PSWindowsUpdate
Cmdlet Invoke-WUJob 2.0.0.4 PSWindowsUpdate
Cmdlet Remove-WindowsUpdate 2.0.0.4 PSWindowsUpdate
Cmdlet Remove-WUServiceManager 2.0.0.4 PSWindowsUpdate
Cmdlet Set-WUSettings 2.0.0.4 PSWindowsUpdate
Cmdlet Update-WUModule 2.0.0.4 PSWindowsUpdate
我觉得我可以走了
【讨论】:
@OP,很好的细节,这肯定会让你在这里获得一些声誉。我相信我也有一天会回来看它的!哈哈。这似乎是创建几个脚本来自动化这个繁琐过程的好机会。我将不得不在一些虚拟机上玩这个 Install-PackageProvider 正在下载onegetcdn.azureedge.net/providers/…(通过go.microsoft.com/fwlink/?LinkID=627338&clcid=0x409)并最终到达onegetcdn.azureedge.net/providers/… - 如果您需要另一种方法来执行此操作。 嗨,我也遇到了同样的问题。但是我的问题略有不同,我没有看到动态选项,但在执行 listavailable 脚本时仍然看到 nuget 2.8.5.208 以前有人遇到过这个问题吗? 他们说安装 Linux 软件很复杂……哈哈。 这是一个很棒的解释@william-charlton。这很好地完成了接受的答案。我成功完成了离线包安装。谢谢!【参考方案3】:MSDocs 为您的场景说明了这一点:
为了第一次执行,PackageManagement 需要一个 互联网连接以下载 Nuget 包提供程序。然而, 如果您的计算机没有互联网连接并且您需要 使用 Nuget 或 PowerShellGet 提供程序,您可以在 另一台计算机并将它们复制到您的目标计算机。使用 执行此操作的步骤如下:
运行
Install-PackageProvider -Name NuGet -RequiredVersion 2.8.5.201 -Force
以从具有 Internet 连接的计算机安装提供程序。安装后可以在
$env:ProgramFiles\PackageManagement\ReferenceAssemblies\\\<ProviderName\>\\\<ProviderVersion\>
找到安装的provider 要么$env:LOCALAPPDATA\PackageManagement\ProviderAssemblies\\\<ProviderName\>\\\<ProviderVersion\>
.将文件夹(在本例中为 Nuget 文件夹)放置在目标计算机上的相应位置。如果你的 目标计算机是 Nano 服务器,您需要运行 从 Nano Server Install-PackageProvider 下载正确的 Nuget 二进制文件。
重新启动 PowerShell 以自动加载包提供程序。或者,运行
Get-PackageProvider -ListAvailable
列出所有 计算机上可用的软件包提供程序。然后使用Import-PackageProvider -Name NuGet -RequiredVersion 2.8.5.201
到 将提供程序导入当前的 Windows PowerShell 会话。
【讨论】:
我面临同样的问题并按照您的步骤操作,但对于第 4 步,当我执行 Get-PackageProvider -ListAvailable 时,nuget 仍然没有出现。 C:\Program Files\PackageManagement\ProviderAssemblies\nuget\2.8.5.201 存在,但似乎根本无法使用 Nuget.. 当 Install-PackageProvider 没有源位置输入时,这怎么可能是解决方案? 抱歉,我不知道,我现在不使用 NuGet 和 PowerShell,并且已经有几年没有接触过 NuGet。 @WilliamCharlton 在下面发布了一个很好的答案,其中包含更多技术细节。滚动并祝你好运!-RequiredVersion
或 -Force
不是必需的。在此评论中,有一个更新的 2.8.5.208 版本可用。
如果安装 NuGet 时出现错误,可能需要运行 [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 行,如下所述。【参考方案4】:
试试这个:
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Install-PackageProvider NuGet -Force
Set-PSRepository PSGallery -InstallationPolicy Trusted
【讨论】:
【参考方案5】:提供程序与 PowerShell>=6.0 捆绑在一起。
如果您只需要一种从文件安装软件包的方法,只需从 github 发布页面获取最新版本的 .msi 安装程序,将其复制到机器上,安装并使用它。
【讨论】:
也许修改你的答案以提供一个例子?【参考方案6】:这是我在基于windows/servercore
的Dockerfile
中使用的脚本,用于通过 Artifactory 镜像实现完整的 PowerShellGallery 设置(也适用于 onegetcdn.azureedge.net)
ARG ONEGET_NUGET_PROVIDER="Microsoft.PackageManagement.NuGetProvider-2.8.5.208.dll"
ARG ONEGET_PROVIDERS="https://artifactory/artifactory/generic-azureedge-onegetcdn/providers/"
RUN $ProviderPath = 'C:/Program Files/PackageManagement/ProviderAssemblies/'; `
New-Item -ItemType "directory" -Path $ProviderPath -Force; `
Invoke-WebRequest -Uri "$Env:ONEGET_PROVIDERS$Env:ONEGET_NUGET_PROVIDER" -OutFile "$ProviderPath$Env:ONEGET_NUGET_PROVIDER"; `
Register-PSRepository -Name "artifactory-powershellgallery-remote" -SourceLocation "https://artifactory/artifactory/api/nuget/powershellgallery-remote"; `
Unregister-PSRepository -Name PSGallery;
位置和 dll 版本在 https://onegetcdn.azureedge.net/providers/providers.masterList.feed.swidtag 可见
【讨论】:
【参考方案7】:此线程中的所有选项都不适合我。我正在使用 PowerShell Core 7.1.5。对我有用的是从 $env:PSModulePath 中删除 Windows Powershell 模块。本质上,检查您的环境变量并查找任何包含“WindowsPowerShell”的路径并将其删除。
【讨论】:
以上是关于Powershell:如何在未连接的计算机上安装适用于 PowerShell 的 Nuget 提供程序,以便可以从 PS 命令行安装 nuget 包?的主要内容,如果未能解决你的问题,请参考以下文章
如何通过Powershell在域计算机上查询Active Directory而不在客户端计算机上安装RSAT工具
您的代理计算机上未安装 SQL Powershell 模块。请按照以下步骤执行此任务