10

我正在尝试了解 PowerShell 中的包管理,但我得到的图片不完整。当我查看对象 PSRepository、PackageProvider 和 PackageSource 时,它​​们似乎都有以下关系:

  • PSRepository可以提供零或多个 PowerShell 模块。一个PSRepository必须有一个且只有一个PackageProvider。存储库的一个示例是PSGallery.
  • PackageProvider可以提供零个或多个PSRepository对象。PackageProvider必须有一个或多个PackageSource对象PackageProvider有时被称为“包管理器”。包提供程序的一些示例包括、或。NuGetChocolateyPowerShellGet
  • 一个PackageSource必须为一个且只有一个PackageProvider提供服务。包源的一些示例包括nuget.orgMyCustomVSTSFeedPSGallery

我查看了以下链接,但仍然无法清楚地了解它们之间的关系。

  1. 为什么PSRepository有一个名为PackageManagementProviderstring类型 而不是PackageProvider类型的属性?
  2. 为什么PSRepository有自己的SourceLocation属性,如果它已经通过它的提供者有一个源引用?
  3. 为什么PackageSourcePSRepositoryPSGallery都是?
  4. 为什么PowerShellGet提供访问画廊的模块的名称和PackageProvider的名称都是?
4

1 回答 1

3

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/dpkgpacmanHomebrewChocolatey/NuGetwinget。它们利用框架来使用包的概念来管理 Windows 上的软件。
  • PackageSource为单个PackageProvider提供服务,并且是提供者从中获取其包的地方。

PowerShell获取

PowerShellGet是内部球体,是一个 PowerShell模块,它使用PackageManagement框架来交付专门用于 PowerShell的包。它注册为PackageProvider,并使用关联的PackageSources从 PowerShell 库或其他源提供模块脚本。它引入了一个新类,称为PSRepository。您可以将其视为仅存在于PowerShellGet领域中的PackageSource的虚拟包装器。

当您使用 注册新的PSRepositoryRegister-PSRepository,您会注意到,如果您运行,则会自动为PowerShellGetGet-PackageSource提供程序添加具有相同名称和 URI 的新源。PSRepository一些特定的功能:

  • 限制在 PowerShell 领域内所做的更改;任何PowerShellGet Cmdlet 都不会修改操作系统组件或软件。
  • 区分模块包和脚本包,并将它们安装在正确的位置。
  • Update-*允许使用Cmdlet手动更新上述内容。
  • 允许将包发布回PSRepository

对于(卸载)安装/更新模块和脚本,PowerShellGet使用PackageManagement Cmdlet。对于发布脚本和模块,它使用.NET CLI命令dotnet nuget push将它们包装在nupkg存档中。

概括

综上所述,我们现在可以回答问题中的四点:

  1. PSRepositoryPackageSource的自定义对象和包装器;它存储了一个string名为PackageManagementProvider的属性,可用于Get-PackageProvider访问PackageProvider对象。
  2. PSRepository对象具有自定义属性,允许模块、脚本、检索和发布的不同 URI。它们是模块的SourceLocationPublishLocation,以及脚本的ScriptSourceLocationScriptPublishLocation
  3. PowerShellGet在后台使用PackageManagement框架,因此每个PSRepository都有一个匹配的PackageSource用于后端操作。
  4. PowerShellGet模块在其清单中将自身注册为PackageProvider,以便与框架交互并提供它所执行的自定义功能。它还与 NuGet PackageProvider交互。

简而言之,当您在 PowerShell 之外处理软件包时,您可以直接使用PackageManagement框架。在处理 PowerShell 的模块和脚本,您使用的是PowerShellGet,它为您提供了对框架和 NuGet 的抽象访问。

资料来源:

于 2021-03-01T14:30:57.543 回答