Anders Wang


我所认识的每个人都是榜样,都有值得我去尊敬和学习的地方。


微软的新一代Windows套件包管理器(OneGet)

转载请注明出处,不胜感激!关于PowerShell的文章,我也同步发布在我的微信公共订阅号里,欢迎关注:[一起PowerShell]

自从上一篇文章向大家阐明了为什么要学习PowerShell后。这次,我想从PowerShell最基本的入口概念说起,那就是用PowerShell来操作以及管理Windows上的套件包,说起套件包的管理自然要说到OneGet,那就从他开始吧。

什么是OneGet呢?

大家如果用过其它的一些非Windows的操作系统,如Ubuntu, CentOs,RedHat, MacOS等等就应该知道apt-get, rpm, homebrew等套件包管理工具。但是在Windows上我们却没有专门统一的包管理机制,当你要安装某某工具,下载某某软件套件都要自己去网站上搜索或者对应的第三方软件供应商网站下载,甚至有的人下载到了盗版带有病毒的软件,又或者对于某些无法自提供更新的工具要不定期的去手动去网站上检查更新并重新下载,十分麻烦和混乱。那么OneGet的出现让Windows系统从此解决了这个问题。OneGet是Windows系统上的套件包管理器,现在官方已经将它更名为PackageManagement了。他是一个基于以PowerShell为操作界面的统一管理套件工具,用户很轻松的使用PowerShell命令来安装和管理想要的软件套件,并且还可以自定义配置你指定的套件来源。

下面让我们来看看PackageManagement的架构图

从架构图可以看出,用户只要输入对应的管理命令后,该命令就会执行对应的操作,而背后的运行机制正如图上画的那样从左往右依次进行。

简单的说,PackageManagement的架构图是由四大单元组成。当用户输入对应的PowerShell cmdlets后,我们的第二个单元PackageManagement Core(套件包内核)中执行对应的操作,该内核单元以软件的安装/删除,发现等等分成了若干功能区域,紧接着会从第三个单元PackageManagement Providers(套件包提供者)里提取套件包提供者所能提供的对应的套件,而PackageManagement Providers提供的套件源头是哪来的呢?那就是从第四个单元的PackageSource(套件包来源)所获取的。

使用PackageManagement(OneGet)

使用OneGet前提是系统必须满足如下最低要求:

Windows 10, Windows Server 2016, or down-level Windows OS + WMF5

Linux or Mac with the [PowerShellCore][pscore]

如果你当前使用的系统是Windows 10的话,系统已经自带了PackageManagement包,如果没有的话可以微软官方下载 Windows Management Framework 5.0。

我们先使用Get-Module -Name PackageManagement查看下当前我的PackageManagement信息,如下我的PackageManagement版本号为截止目前最新的1.1.3.0。

PS C:\Users\Administrator> Get-Module -Name PackageManagement

ModuleType Version    Name                                ExportedCommands  
---------- -------    ----                                ----------------
Script     1.1.3.0    PackageManagement                   {Find-Package, Find-PackageProvider...  

我们使用Get-Command命令行来看看PackageManagement支持了多少PowerShell cmdlets命令,由于我的机器上安装的是WMF 5.1,所以我的是最新的PackageManagement包,可能内置的命令数量也不一样。

PS C:\Users\Administrator> Get-Command -Module PackageManagement

CommandType     Name                           Version    Source  
-----------     ----                           -------    ------
Cmdlet          Find-Package                   1.1.3.0    PackageManagement  
Cmdlet          Find-PackageProvider           1.1.3.0    PackageManagement  
Cmdlet          Get-Package                    1.1.3.0    PackageManagement  
Cmdlet          Get-PackageProvider            1.1.3.0    PackageManagement  
Cmdlet          Get-PackageSource              1.1.3.0    PackageManagement  
Cmdlet          Import-PackageProvider         1.1.3.0    PackageManagement  
Cmdlet          Install-Package                1.1.3.0    PackageManagement  
Cmdlet          Install-PackageProvider        1.1.3.0    PackageManagement  
Cmdlet          Register-PackageSource         1.1.3.0    PackageManagement  
Cmdlet          Save-Package                   1.1.3.0    PackageManagement  
Cmdlet          Set-PackageSource              1.1.3.0    PackageManagement  
Cmdlet          Uninstall-Package              1.1.3.0    PackageManagement  
Cmdlet          Unregister-PackageSource       1.1.3.0    PackageManagement  

可以看到我们从PackageManagement包中得到了13个有关于查找,获取,安装,注册,删除等等相关操作的PowerShell cmdlets命令。接下来我们用这里面的一些命令来给大家说明下如何使用OneGet。

既然要安装软件,我们肯定先要查找下有没有我们想要安装的软件,我正想给我的Windows安装一个7Zip软件包,这里我用Find-Package命令模糊查找我所需要的软件包。

PS C:\Users\Administrator> Find-Package -Name *7zip*

Name                           Version          Source           Summary  
----                           -------          ------           -------
7Zip4Powershell                1.8.0            PSGallery        Powershell module for creating and extracting 7-Zip...  
x7Zip                          1.0.8            PSGallery        Powershell DSC Configuration Script for installing ...  
PS7Zip                         1.3.0.1604       PSGallery        Powershell module that allows you to work with comp...  
7zip                           16.4.0.20170420  chocolatey       7-Zip is a file archiver with a high compression ra...  
7zip.install                   16.4.0.20170420  chocolatey       7-Zip is a file archiver with a high compression ra...  
7zip.portable                  16.04            chocolatey       7-Zip is a file archiver with a high compression ra...  
7zip.commandline               16.02.0.20170209 chocolatey       7-Zip is a file archiver with a high compression ra...  
Easy7zip                       0.1.2.2          chocolatey       Easier to use and more featured version of 7-zip.  

我发现了我想要的软件包已经出现了,说明软件包已经被收入到了官方Package库里。于是就使用Install-Package来安装。

PS C:\Users\Administrator> Install-Package -Name "7zip"

The package(s) come(s) from a package source that is not marked as trusted.  
Are you sure you want to install software from 'chocolatey'?  
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "N"): Y

Name                           Version          Source           Summary  
----                           -------          ------           -------
7zip                           16.4.0.20170420  chocolatey       7-Zip is a file archiver with a high compression ra...  

我们使用Get-Package来验证下当前系统里是否包含我们所需的软件,是否安装成功了吧。

PS C:\Users\Administrator> Get-Package -Name "7zip"

Name                           Version          Source                           ProviderName  
----                           -------          ------                           ------------
7zip                           16.4.0.20170420  C:\Chocolatey\lib\7zip.16.4.0... Chocolatey  

非常方便我们安装完了我们所需的软件,那么这些软件怎么来的呢,回忆下之前的架构图我们作为EndUser用户键入命令后,接着PackageManagement Core执行对应的功能操作,然后会从我们的PackageProvider得到提供的软件包。说到这里,那么我们还可以使用Get-PackageProvider命令获得我们的PackageManagement Providers都有哪些,而正是你看到的这些Providers,他们提供了我们所需要的软件。

PS C:\Users\Administrator> Get-PackageProvider

Name                     Version          DynamicOptions  
----                     -------          --------------
Chocolatey               2.8.5.101        SkipDependencies, ContinueOnFailure, ExcludeVersion, ForceX86, PackageSave...  
msi                      3.0.0.0          AdditionalArguments  
msu                      3.0.0.0  
NuGet                    2.8.5.207        Destination, ExcludeVersion, Scope, SkipDependencies, Headers, FilterOnTag...  
PowerShellGet            1.0.0.1          PackageManagementProvider, Type, Scope, AllowClobber, SkipPublisherCheck, ...  
Programs                 3.0.0.0          IncludeWindowsInstaller, IncludeSystemComponent  

但是如果我们需要一些本机目前并没有安装的PackageProvider怎么办呢,我们可以用Find-PackageProvider查找官方目前提供哪些PackageProvider。

PS C:\Users\Administrator> Find-PackageProvider

Name                           Version          Source           Summary  
----                           -------          ------           -------
nuget                          2.8.5.208        https://onege... NuGet provider for the OneGet meta-package manager  
psl                            1.0.0.210        https://onege... psl provider for the OneGet meta-package manager  
chocolatey                     2.8.5.130        https://onege... ChocolateyPrototype provider for the OneGet meta-pa...  
NanoServerPackage              1.0.1.0          PSGallery        A PackageManagement provider to  Discover, Save and...  
GitHubProvider                 0.5              PSGallery        GitHub-as-a-Package - PackageManagement PowerShell ...  
DockerMsftProvider             1.0.0.1          PSGallery        PowerShell module with commands for discovering, in...  
ContainerImage                 0.6.4.0          PSGallery        This is a PackageManagement provider module which h...  
PowerShellGet                  1.1.2.0          PSGallery        PowerShell module with commands for discovering, in...  
TSDProvider                    0.2              PSGallery        PowerShell PackageManager provider to search & inst...  
ChocolateyGet                  1.0.0.1          PSGallery        An PowerShell OneGet provider that discovers packag...  
GistProvider                   0.6              PSGallery        Gist-as-a-Package - PackageManagement  PowerShell P...  
MyAlbum                        0.1.2            PSGallery        MyAlbum provider discovers the photos in your remot...  
OfficeProvider                 1.0.0.1          PSGallery        OfficeProvider allows users to install Microsoft Of...  
GitLabProvider                 1.3.4            PSGallery        GitLab PackageManagement provider  
WSAProvider                    1.0.0.4          PSGallery        Provider to Discover, Install and inventory windows...  
0install                       2.12.1           PSGallery        Zero Install is a decentralized cross-platform soft...  
AppxGet                        0.1.0.1          PSGallery        Powershell Package Management (OneGet) Provider for...  

还记得我们之前提到的PackageManagement架构图么,PackageProvider是从PackageSource里获得数据源的,也就是PackageSource才是我们最根本的数据源头,我们使用Get-PackageSource查看下我们当前机器都有那些PackageSource。

PS C:\Users\Administrator> Get-PackageSource

Name                             ProviderName     IsTrusted  Location  
----                             ------------     ---------  --------
chocolatey                       Chocolatey       False      http://chocolatey.org/api/v2/  
PSGallery                        PowerShellGet    False      https://www.powershellgallery.com/api/v2/  

你还可以使用Register-PackageSource来自己注册一个数据源头,另外相同的命令配合不同的参数也会获得不同的结果,如使用Find-PackageProvider -AllVersions来活的所有当前已支持的PackageProvider并罗列出所有支持的历史版本号信息。除此之外还有许多命令就不一一说明使用了,使用方法很简单,大家可以去一个个试试。

最近的文章

生活里的如果

有时会有这样的想法,如果这时的环境是怎样怎样的,也或是当时如果做了怎样怎样不同的选择,那么,此时此刻的我会有不少的改善的吧。 这些的假设,一般都是源自于过去的。也源自于对现状的不满跟期望改进。 其…

生活点滴详细阅读
更早的文章

原点

转载请注明出处,不胜感激! 在黑夜中迷失就像开车一样,并不是有把握的事就是很明确的,你觉得你会开了一个劲的加速,但有时候形势会差强人意,并不是人人都会踩刹车的。我们要学会避免失控,控制失控,你才…

生活点滴详细阅读
comments powered by Disqus