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

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

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

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

  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 ArticleGitHub 了解有关 PowerShellGet 3.0 正在进行的开发的更多信息。

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


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

包管理

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

  • PackageProvider 相当于包管理器;想想 APT/dpkgpacmanHomebrewChocolatey/NuGetwinget .它们利用框架来使用包的概念管理 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. PSRepositoryPackageSource 的自定义对象和包装器;它存储了一个名为 PackageManagementProviderstring 属性,可以与 Get-PackageProvider 一起使用来访问 PackageProvider 对象。
  2. PSRepository 对象具有自定义属性,允许模块、脚本、检索和发布的不同 URI。 它们是用于模块的 SourceLocationPublishLocation,以及用于脚本的 ScriptSourceLocationScriptPublishLocation
  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
相关资源
最近更新 更多