PowerShell 包管理 - 存储库与提供者与源

PowerShell Package Management - Repository vs Provider vs Source

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

我查看了以下链接,但仍然没有清楚地说明它们之间的关系。

  1. 为什么 PSRepository 有一个 属性 调用了 PackageManagementProvider 类型 string 而不是键入 PackageProvider?
  2. 为什么 PSRepository 有自己的 SourceLocation 属性,如果它已经通过其提供者引用了源代码?
  3. 为什么 PSGallery 既是 PackageSource 又是 PSRepository
  4. 为什么 PowerShellGet 既是提供图库访问的模块的名称,又是 PackageProvider 的名称?

2021 年 8 月更新

PowerShellGet 3.0 与该模块的先前版本根本不同。它将不再依赖于 PackageManagment,直接使用 NuGet API 和库(与 nuget.exe 相反)并具有新的语法。您可以从 DevBlogs Article and on GitHub.

了解有关 PowerShellGet 3.0 持续开发的更多信息

因此,此页面上的问题和答案仅与 PowerShellGet 2.0 相关。


最好的理解方式是将其视为两个 球体PackageManagement 一个和 PowerShellGet 一个。

包管理

PackageManagement(原OneGet)是外层,是Windows中的一个包传递框架。它通过 PowerShell 进行管理,但适用于整个操作系统或用户配置文件。它提供了两个主要的classes:

  • A PackageProvider 相当于包管理器;想想 APT/dpkg, pacman, Homebrew, Chocolatey/NuGet,或winget。这些利用框架通过包的概念在 Windows 上管理软件。
  • A PackageSource 服务于单个 PackageProvider 并且是提供商从中获取其包的地方。

PowerShellGet

PowerShellGet 是内层,是一个使用 PackageManagement 的 PowerShell module 专门为 PowerShell 交付包的框架。它注册为 PackageProvider,并使用关联的 PackageSources 交付 modulesscripts 来自 PowerShell 库或其他来源。它引入了一个新的 class,称为 PSRepository。您可以将其视为仅存在于 PowerShellGet 领域中的 PackageSource 的虚拟包装器。

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

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

对于 (un)installing/updating 模块和脚本,PowerShellGet 使用 PackageManagement Cmdlet。为了发布脚本和模块,它使用 .NET CLI 命令 dotnet nuget push 将它们包装在 nupkg 存档中。

总结

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

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

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

来源: