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

时间:2018-03-28 21:37:55

标签: windows powershell package nuget chocolatey

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

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

我查看了以下链接,但它仍未提供关于它们如何相关的清晰图片。

about_PackageManagement

psgallery_gettingstarted

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

1 个答案:

答案 0 :(得分:2)

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

包管理

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 的抽象访问。

来源: