PowerShell软件包管理 - 存储库与提供商与来源



我正在尝试了解PowerShell中的软件包管理,并且我的情况不完整。当我查看对象psrepository,PackageProvider和packagesource时,它们似乎都有以下关系:

  • a psrepository 可以提供零或更多的PowerShell模块。a psrepository 必须有一个,只有一个, packageProvider 。存储库的一个示例是PSGallery
  • a PackageProvider 可以提供零或更多 psrepository 对象。 PackageProvider 必须具有一个或多个 packagesource 对象。A PackageProvider 有时称为"包装管理器"。包装提供商的一些示例包括NuGetChocolateyPowerShellGet
  • a packagesource 必须仅服务一个 packageProvider 。包装源的一些示例包括nuget.orgMyCustomVSTSFeedPSGallery

我已经查看了以下链接,但仍然没有清楚地了解它们的相关性。

  • 关于PackageManagement
  • psgallery入门
  1. 为什么 psrepository 有一个属性称为 packagemanagementprovider type 字符串而不是类型 PackageProvider
  2. 为什么A PSREPOSITOR 有其自己的 silcelocation 属性,如果它已经通过其提供商具有源参考?
  3. 为什么 PSGallery a packagesource 和a psrepository
  4. 为什么PowerShellGet既是提供访问画廊的模块的名称,又是 packageProvider的名称

更新2021年8月

powershellget 3.0将与模块的先前版本根本不同。它将不再取决于 packagemanagment ,直接使用nuget API和库(与nuget.exe相对(并具有新的语法。您可以从DevBlogs文章和GitHub上了解有关PowerShellget 3.0的持续发展的更多信息。

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


认为这是两个 Spheres 的最佳方法; PackageManagement 一个和 PowerShellget 一个。

packageManagement

PackageManagementagemention (以前是Oneget(是外部球体,是Windows中包装交付的框架。它是通过PowerShell管理的,但适用于整个操作系统或用户配置文件。它提供了两个主要类:

  • a packageProvider 等效于软件包管理器;思考 apt/dpkg pacman homebrew 巧克力/nuget winget 。这些利用该框架使用软件包的概念来管理Windows上的软件。
  • a packagesource 提供单个 packageProvider ,并且是提供商从中获取其包裹的地方。

PowerShellget

PowerShellget 是内部领域,并且是使用 packageManagementagement 的powershell 模块专门为PowerShell <<em> packagemanagement /strong>。它已注册为A packageProvider ,并使用关联的 packagesources 来交付模块 and scripts 其他来源。它引入了一个新类,称为 psrepository 。您可以将其视为仅存在于 powershellget sphere的 packagesource 的虚拟包装器。

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

  • 将变化限制为Powershell宇宙内的变化; powershellget cmdlets修改操作系统组件或软件。
  • 要区分模块软件包和脚本软件包,并将它们安装在正确的位置。
  • 允许使用Update-* CMDLET的手动更新。
  • 允许将包裹发布回到 psrepository source

对于(un(安装/更新模块和脚本, powershellget 使用 packagemanagementagementagementage cmdlet。对于发布脚本和模块,它使用 .net CLI 命令dotnet nuget push将它们包装在nupkg Archive中。

摘要

根据上述情况,我们现在可以回答问题中的四个点:

  1. psrepository 是A packagesource 的自定义对象和包装器;它存储一个称为 packagemanagementprovider string属性,该属性可与Get-PackageProvider一起使用以访问 packageProvider 对象。
  2. psrepository 对象具有自定义属性,可以为模块,脚本,检索和发布提供不同的uris。这些是 SIRCELOCATION PublishLocation 用于模块,以及 scriptSourcelocation and scriptpublishLocation forScripts。
  3. powerShellget 在后台使用 packagemanagement 框架,因此每个 psrepository 都有一个匹配的 packagesource 用于后端操作。
  4. powershellget 模块在其清单中以 packageprovider 的形式注册自身,以便与框架进行交互并提供自定义的功能。它还与nuget packageProvider
  5. 互动

简而言之,当您处理PowerShell之外的软件包时,您可以直接与PackageManagementagement 框架合作。当您处理模块和脚本 for powershell时,您可以使用 powershellget ,它使您可以抽象地访问框架和nuget。

来源:

  • 关于PackageManagement -Microsoft Docs
  • PackageManagement模块 - Microsoft Docs
  • PowerShellget模块-Microsoft Docs
  • PowerShellget 2.2.5- PowerShell画廊
  • PackageManagement 1.4.7- PowerShell Gallery

最新更新