2021 年 8 月更新
PowerShellGet 3.0 将与以前版本的模块有根本的不同。它将不再依赖于PackageManagment,直接使用 NuGet API 和库(相对于nuget.exe
)并具有新语法。您可以从DevBlogs 文章和GitHub 上了解有关 PowerShellGet 3.0 正在进行的开发的更多信息。
因此,此页面上的问题和答案仅与 PowerShellGet 2.0 相关。
考虑这一点的最好方法是两个领域;PackageManagement一个和PowerShellGet一个。
包管理
PackageManagement(以前称为 OneGet)是外层,是 Windows 中包交付的框架。它通过 PowerShell 进行管理,但适用于整个操作系统或用户配置文件。它提供了两个主要类:
- PackageProvider相当于包管理器;想想APT/dpkg、pacman、Homebrew、Chocolatey/NuGet或winget。它们利用框架来使用包的概念来管理 Windows 上的软件。
- PackageSource为单个PackageProvider提供服务,并且是提供者从中获取其包的地方。
PowerShell获取
PowerShellGet是内部球体,是一个 PowerShell模块,它使用PackageManagement框架来交付专门用于 PowerShell的包。它注册为PackageProvider,并使用关联的PackageSources从 PowerShell 库或其他源提供模块和脚本。它引入了一个新类,称为PSRepository。您可以将其视为仅存在于PowerShellGet领域中的PackageSource的虚拟包装器。
当您使用 注册新的PSRepository时Register-PSRepository
,您会注意到,如果您运行,则会自动为PowerShellGetGet-PackageSource
提供程序添加具有相同名称和 URI 的新源。PSRepository有一些特定的功能:
- 限制在 PowerShell 领域内所做的更改;任何PowerShellGet Cmdlet 都不会修改操作系统组件或软件。
- 区分模块包和脚本包,并将它们安装在正确的位置。
Update-*
允许使用Cmdlet手动更新上述内容。
- 允许将包发布回PSRepository源。
对于(卸载)安装/更新模块和脚本,PowerShellGet使用PackageManagement Cmdlet。对于发布脚本和模块,它使用.NET CLI命令dotnet nuget push
将它们包装在nupkg
存档中。
概括
综上所述,我们现在可以回答问题中的四点:
- PSRepository是PackageSource的自定义对象和包装器;它存储了一个
string
名为PackageManagementProvider的属性,可用于Get-PackageProvider
访问PackageProvider对象。
- PSRepository对象具有自定义属性,允许模块、脚本、检索和发布的不同 URI。它们是模块的SourceLocation和PublishLocation,以及脚本的ScriptSourceLocation和ScriptPublishLocation。
- PowerShellGet在后台使用PackageManagement框架,因此每个PSRepository都有一个匹配的PackageSource用于后端操作。
- PowerShellGet模块在其清单中将自身注册为PackageProvider,以便与框架交互并提供它所执行的自定义功能。它还与 NuGet PackageProvider交互。
简而言之,当您在 PowerShell 之外处理软件包时,您可以直接使用PackageManagement框架。在处理 PowerShell 的模块和脚本时,您使用的是PowerShellGet,它为您提供了对框架和 NuGet 的抽象访问。
资料来源: