PowerShell 包管理 - 存储库与提供者与源
PowerShell Package Management - Repository vs Provider vs Source
我试图了解 PowerShell 中的包管理,但我得到的信息并不完整。当我查看对象 PSRepository、PackageProvider 和 PackageSource 时,它们似乎都具有以下关系:
- A PSRepository 可以提供零个或多个 PowerShell 模块。一个 PSRepository 必须有一个,而且只有一个,PackageProvider。存储库的示例是
PSGallery
.
- 一个 PackageProvider 可以提供零个或多个 PSRepository 对象。 PackageProvider 必须有一个或多个 PackageSource 对象。 PackageProvider 有时被称为“包管理器”。包提供商的一些示例包括
NuGet
、Chocolatey
或 PowerShellGet
.
- 一个 PackageSource 必须服务于一个且仅此一个 PackageProvider。包源的一些示例包括
nuget.org
、MyCustomVSTSFeed
或 PSGallery
.
我查看了以下链接,但仍然没有清楚地说明它们之间的关系。
- 为什么 PSRepository 有一个
属性 调用了 PackageManagementProvider 类型 string
而不是键入 PackageProvider?
- 为什么 PSRepository 有自己的 SourceLocation 属性,如果它已经通过其提供者引用了源代码?
- 为什么
PSGallery
既是 PackageSource 又是 PSRepository?
- 为什么
PowerShellGet
既是提供图库访问的模块的名称,又是 PackageProvider 的名称?
2021 年 8 月更新
PowerShellGet 3.0 与该模块的先前版本根本不同。它将不再依赖于 PackageManagment,直接使用 NuGet API 和库(与 nuget.exe
相反)并具有新的语法。您可以从 DevBlogs Article and on GitHub.
了解有关 PowerShellGet 3.0 持续开发的更多信息
因此,此页面上的问题和答案仅与 PowerShellGet 2.0 相关。
最好的理解方式是将其视为两个 球体; PackageManagement 一个和 PowerShellGet 一个。
包管理
PackageManagement(原OneGet)是外层,是Windows中的一个包传递框架。它通过 PowerShell 进行管理,但适用于整个操作系统或用户配置文件。它提供了两个主要的classes:
- A PackageProvider 相当于包管理器;想想 APT/dpkg, pacman, Homebrew, Chocolatey/NuGet,或winget。这些利用框架通过包的概念在 Windows 上管理软件。
- A PackageSource 服务于单个 PackageProvider 并且是提供商从中获取其包的地方。
PowerShellGet
PowerShellGet 是内层,是一个使用 PackageManagement 的 PowerShell module 专门为 PowerShell 交付包的框架。它注册为 PackageProvider,并使用关联的 PackageSources 交付 modules 和 scripts 来自 PowerShell 库或其他来源。它引入了一个新的 class,称为 PSRepository。您可以将其视为仅存在于 PowerShellGet 领域中的 PackageSource 的虚拟包装器。
当您使用 Register-PSRepository
注册一个新的 PSRepository 时,您会注意到如果您 运行 Get-PackageSource
,一个新的来源有已自动为 PowerShellGet 提供程序添加相同的名称和 URI。 PSRepository 有一些特定的功能:
- 限制在 PowerShell 宇宙中所做的更改; PowerShellGet Cmdlet 的 none 修改操作系统组件或软件。
- 区分模块包和脚本包,并将它们安装在正确的位置。
- 允许使用
Update-*
Cmdlet 手动更新上述内容。
- 允许将包发布回 PSRepository 源。
对于 (un)installing/updating 模块和脚本,PowerShellGet 使用 PackageManagement Cmdlet。为了发布脚本和模块,它使用 .NET CLI 命令 dotnet nuget push
将它们包装在 nupkg
存档中。
总结
综上所述,我们现在可以回答问题中的四点:
- PSRepository 是 PackageSource 的自定义对象和包装器;它存储一个名为 PackageManagementProvider 的
string
属性,它可以与 Get-PackageProvider
一起使用来访问 PackageProvider 对象.
- PSRepository 对象具有允许不同 URI 用于模块、脚本、检索和发布的自定义属性。
这些是用于模块的 SourceLocation 和 PublishLocation,以及 ScriptSourceLocation 和 ScriptPublishLocation 用于脚本。
- PowerShellGet 在后台使用 PackageManagement 框架,所以每个 PSRepository 都有一个匹配PackageSource 用于后端操作。
- PowerShellGet 模块在其清单中将自身注册为 PackageProvider,以便与框架交互并提供自定义功能确实如此。它还与 NuGet PackageProvider.
交互
简而言之,当您在 PowerShell 之外处理软件包时,您直接使用 PackageManagement 框架。当您处理 for PowerShell 的模块和脚本时,您使用 PowerShellGet,它使您可以抽象地访问框架和 NuGet。
来源:
我试图了解 PowerShell 中的包管理,但我得到的信息并不完整。当我查看对象 PSRepository、PackageProvider 和 PackageSource 时,它们似乎都具有以下关系:
- A PSRepository 可以提供零个或多个 PowerShell 模块。一个 PSRepository 必须有一个,而且只有一个,PackageProvider。存储库的示例是
PSGallery
. - 一个 PackageProvider 可以提供零个或多个 PSRepository 对象。 PackageProvider 必须有一个或多个 PackageSource 对象。 PackageProvider 有时被称为“包管理器”。包提供商的一些示例包括
NuGet
、Chocolatey
或PowerShellGet
. - 一个 PackageSource 必须服务于一个且仅此一个 PackageProvider。包源的一些示例包括
nuget.org
、MyCustomVSTSFeed
或PSGallery
.
我查看了以下链接,但仍然没有清楚地说明它们之间的关系。
- 为什么 PSRepository 有一个 属性 调用了 PackageManagementProvider 类型 string 而不是键入 PackageProvider?
- 为什么 PSRepository 有自己的 SourceLocation 属性,如果它已经通过其提供者引用了源代码?
- 为什么
PSGallery
既是 PackageSource 又是 PSRepository? - 为什么
PowerShellGet
既是提供图库访问的模块的名称,又是 PackageProvider 的名称?
2021 年 8 月更新
PowerShellGet 3.0 与该模块的先前版本根本不同。它将不再依赖于 PackageManagment,直接使用 NuGet API 和库(与 nuget.exe
相反)并具有新的语法。您可以从 DevBlogs Article and on GitHub.
因此,此页面上的问题和答案仅与 PowerShellGet 2.0 相关。
最好的理解方式是将其视为两个 球体; PackageManagement 一个和 PowerShellGet 一个。
包管理
PackageManagement(原OneGet)是外层,是Windows中的一个包传递框架。它通过 PowerShell 进行管理,但适用于整个操作系统或用户配置文件。它提供了两个主要的classes:
- A PackageProvider 相当于包管理器;想想 APT/dpkg, pacman, Homebrew, Chocolatey/NuGet,或winget。这些利用框架通过包的概念在 Windows 上管理软件。
- A PackageSource 服务于单个 PackageProvider 并且是提供商从中获取其包的地方。
PowerShellGet
PowerShellGet 是内层,是一个使用 PackageManagement 的 PowerShell module 专门为 PowerShell 交付包的框架。它注册为 PackageProvider,并使用关联的 PackageSources 交付 modules 和 scripts 来自 PowerShell 库或其他来源。它引入了一个新的 class,称为 PSRepository。您可以将其视为仅存在于 PowerShellGet 领域中的 PackageSource 的虚拟包装器。
当您使用 Register-PSRepository
注册一个新的 PSRepository 时,您会注意到如果您 运行 Get-PackageSource
,一个新的来源有已自动为 PowerShellGet 提供程序添加相同的名称和 URI。 PSRepository 有一些特定的功能:
- 限制在 PowerShell 宇宙中所做的更改; PowerShellGet Cmdlet 的 none 修改操作系统组件或软件。
- 区分模块包和脚本包,并将它们安装在正确的位置。
- 允许使用
Update-*
Cmdlet 手动更新上述内容。 - 允许将包发布回 PSRepository 源。
对于 (un)installing/updating 模块和脚本,PowerShellGet 使用 PackageManagement Cmdlet。为了发布脚本和模块,它使用 .NET CLI 命令 dotnet nuget push
将它们包装在 nupkg
存档中。
总结
综上所述,我们现在可以回答问题中的四点:
- PSRepository 是 PackageSource 的自定义对象和包装器;它存储一个名为 PackageManagementProvider 的
string
属性,它可以与Get-PackageProvider
一起使用来访问 PackageProvider 对象. - PSRepository 对象具有允许不同 URI 用于模块、脚本、检索和发布的自定义属性。 这些是用于模块的 SourceLocation 和 PublishLocation,以及 ScriptSourceLocation 和 ScriptPublishLocation 用于脚本。
- PowerShellGet 在后台使用 PackageManagement 框架,所以每个 PSRepository 都有一个匹配PackageSource 用于后端操作。
- PowerShellGet 模块在其清单中将自身注册为 PackageProvider,以便与框架交互并提供自定义功能确实如此。它还与 NuGet PackageProvider. 交互
简而言之,当您在 PowerShell 之外处理软件包时,您直接使用 PackageManagement 框架。当您处理 for PowerShell 的模块和脚本时,您使用 PowerShellGet,它使您可以抽象地访问框架和 NuGet。
来源: