【问题标题】:PowerShell Package Management - Repository vs Provider vs SourcePowerShell 包管理 - 存储库 vs 提供程序 vs 源
【发布时间】:2018-09-07 17:37:27
【问题描述】:

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

  • PSRepository 可以提供零个或多个 PowerShell 模块。 PSRepository 必须有一个,并且只有一个 PackageProvider。 PSGallery 是一个存储库示例。
  • PackageProvider 可以提供零个或多个 PSRepository 对象。 PackageProvider 必须具有一个或多个 PackageSource 对象。 PackageProvider 有时称为“包管理器”。包提供程序的一些示例包括 NuGet、Chocolatey 或 PowerShellGet。
  • PackageSource 必须提供一个且只有一个 PackageProvider。包源的一些示例包括 nuget.org、MyCustomVSTSFeed 或 PSGallery。

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

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

【问题讨论】:

  • 也许存储库是提供者和源的组合?并且源只有提供者属性,因为源只适用于某些提供者?
  • 为什么 Find-Package 不适用于 PackageSources 但 PSRepository 位置?
  • 顺便说一句,他们似乎将通过 7.2 中 PowerShellGet 的主要版本更新来改变其中的一些工作方式。这是项目首席工程经理an article
  • 好发现! PowerShellGet 3.0 看起来很有希望。
  • @Efie 既然 PowerShellGet 3.0 的 Preview 11 已经发布,我已经在答案中添加了一条注释。感谢您提出这个问题!

标签: windows powershell nuget package-management powershellget


【解决方案1】:

2021 年 8 月更新

PowerShellGet 3.0 将与以前版本的模块根本不同。它将不再依赖 PackageManagment,直接使用 NuGet API 和库(而不是 nuget.exe)并具有新语法。您可以通过DevBlogs Article 和GitHub 了解有关 PowerShellGet 3.0 正在进行的开发的更多信息。

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


将其视为两个球体的最佳方式; PackageManagement 一个和 PowerShellGet 一个。

包管理

PackageManagement(以前称为 OneGet)是外层,是 Windows 中包交付的框架。它通过 PowerShell 进行管理,但适用于整个操作系统或用户配置文件。它提供了两个主要类:

  • PackageProvider 相当于包管理器;想想 APT/dpkg、pacman、Homebrew、Chocolatey/NuGet 或 winget .它们利用框架来使用包的概念管理 Windows 上的软件。
  • PackageSource 服务于单个 PackageProvider,并且是提供者从中获取其包的地方。

PowerShellGet

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

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

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

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

总结

鉴于以上,我们现在可以回答问题中的四点:

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

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

来源:

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2015-12-12
  • 2017-06-28
  • 2016-02-22
  • 2020-07-31
  • 2014-06-26
  • 1970-01-01
  • 2014-10-14
  • 2015-06-04
相关资源
最近更新 更多