我正在尝试了解PowerShell中的软件包管理,并且我的情况不完整。当我查看对象psrepository,PackageProvider和packagesource时,它们似乎都有以下关系:
- a psrepository 可以提供零或更多的PowerShell模块。a psrepository 必须有一个,只有一个, packageProvider 。存储库的一个示例是
PSGallery
。 - a PackageProvider 可以提供零或更多 psrepository 对象。 PackageProvider 必须具有一个或多个 packagesource 对象。A PackageProvider 有时称为"包装管理器"。包装提供商的一些示例包括
NuGet
,Chocolatey
或PowerShellGet
。 - a packagesource 必须仅服务一个 packageProvider 。包装源的一些示例包括
nuget.org
,MyCustomVSTSFeed
或PSGallery
。
我已经查看了以下链接,但仍然没有清楚地了解它们的相关性。
- 关于PackageManagement
- psgallery入门
- 为什么 psrepository 有一个属性称为 packagemanagementprovider type 字符串而不是类型 PackageProvider ?
- 为什么A PSREPOSITOR 有其自己的 silcelocation 属性,如果它已经通过其提供商具有源参考?
- 为什么
PSGallery
a packagesource 和a psrepository ? - 为什么
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中。
摘要
根据上述情况,我们现在可以回答问题中的四个点:
-
psrepository 是A packagesource 的自定义对象和包装器;它存储一个称为 packagemanagementprovider 的
string
属性,该属性可与Get-PackageProvider
一起使用以访问 packageProvider 对象。 - psrepository 对象具有自定义属性,可以为模块,脚本,检索和发布提供不同的uris。这些是 SIRCELOCATION 和 PublishLocation 用于模块,以及 scriptSourcelocation and scriptpublishLocation forScripts。
- powerShellget 在后台使用 packagemanagement 框架,因此每个 psrepository 都有一个匹配的 packagesource 用于后端操作。
- powershellget 模块在其清单中以 packageprovider 的形式注册自身,以便与框架进行交互并提供自定义的功能。它还与nuget packageProvider 。 互动
简而言之,当您处理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