PowerShell 包管理 - 存储库 vs 提供者 vs 源代码

srs*_*ate 9 windows powershell package-management nuget powershellget

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

  • PSRepository可以提供零个或多个PowerShell模块。一个PSRepository必须只有一个PackageProvider。存储库的一个示例是PSGallery.
  • 一个PackageProvider可以成为零个或多个PSRepository对象。一个PackageProvider必须有一个或多个PackageSource对象。一个PackageProvider有时也被称为“包管理器”。包提供的一些实例包括NuGetChocolatey,或PowerShellGet
  • 一个PackageSource必须服务一个且仅一个PackageProvider。的包源的一些实例包括nuget.orgMyCustomVSTSFeed,或PSGallery

我查看了以下链接,但它仍然没有提供它们之间关系的清晰图片。

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

The*_*193 5

2021 年 8 月更新

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

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


最好的方式是将其视为两个领域;PackageManagement一项和PowerShellGet一项

包管理

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

  • PackageProvider相当于包管理器想想APT/dpkgpacmanHomebrewChocolatey/NuGetwinget。这些框架利用包的概念来管理 Windows 上的软件。
  • PackageSource服务于单个PackageProvider 并且是提供者获取其包的地方。

PowerShell获取

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

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

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

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

概括

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

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

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

资料来源:

  • 精彩的!非常感谢!我颠倒了继承结构。[我编写了一些伪代码来帮助可视化您所说的内容。](https://i.ibb.co/X38GKL3/psuedo-Package-Management.png) (3认同)