アクトインディ開発者ブログ

子供とお出かけ情報「いこーよ」を運営する、アクトインディ株式会社の開発者ブログです

Windowsのパッケージ管理について調べてみる

kadota です。こんにちは。

現在、会社のPCをキッティング(導入・入れ替え時の初期設定やソフトのインストール)するときのために、 Windows構成デザイナーというMS謹製ツールを使ってプロビジョニング・パッケージを作ったりしています。
※Windows構成デザイナーはWindows ADKに含まれています

ソフトウェアのインストールといえば、Linuxの各種ディストリビューションにもそれぞれパッケージ管理システムがありますし、Macにも Home Brew があって便利です。
Windows でも最近はそういったパッケージ管理システムが利用できるそうなので、少し調べてみました。

Chocolatey

冒頭から、最近は、と書きましたが、2011年からすでにあったようです…
コマンドプロンプト、またはPowerShellでインストール。公式サイトに掲載されたコードを実行するだけです。 https://chocolatey.org/install

次のようなコマンドで、パッケージを探したりインストールしたりできます。わかりやすいです。

choco search hoge
choco install hoge
choco upgrade all

コミュニティでメンテナンスしているパッケージ一覧をみると、メジャーなものが並んでいますね。
https://chocolatey.org/packages

ただ2018年11月から、レートリミットが導入されたそうです。リクエストが多すぎた場合に一時制限されます。
https://chocolatey.org/docs/community-packages-disclaimer#rate-limiting

多くのマシンで同時にインストールやアップグレードを走らせるような場合、コミュニティのリポジトリから直接パッケージを取得せずに作業用のリポジトリを作ってそこを参照するほうが良いそうです。
カスタムパッケージを作って配布もできるようです。

利用例

導入済みのパッケージを一覧します。

PS C:\WINDOWS\system32> choco search -l
Chocolatey v0.10.11
chocolatey 0.10.11
1 packages installed.

パッケージを探してみます。

PS C:\WINDOWS\system32> choco search adobereader
Chocolatey v0.10.11
adobereader 2019.010.20064.01 [Approved]
adobereader-update 18.011.20058 [Approved] Downloads cached for licensed users
simnetsa-adobereader-fr 11.0.7 - Possibly broken
adobereader-disable-updates-winconfig 0.0.1 [Approved]
BR.AdobeReaderFR 11.0.09 - Possibly broken
5 packages found.

[Approved] と付いているものは、パッケージがチェックされ安全とみなされたものです。

インストールします。

PS C:\WINDOWS\system32> choco install adobereader
Chocolatey v0.10.11
Installing the following packages:
adobereader
By installing you accept licenses for the packages.
Progress: Downloading KB2919355 1.0.20160915... 100%
Progress: Downloading KB2919442 1.0.20160915... 100%
Progress: Downloading adobereader 2019.010.20064.01... 100%
(略)

インストール時に -y オプションを付けておけば途中の確認をすっとばせます。

PackageManagement

MSの公式パッケージマネージャー。 パッケージマネージャーをさらに束ねる立ち位置で、NuGet や Chocolatey などの「パッケージプロバイダー」を登録し、統一されたコマンドで指示するラッパーになっています。

一般的には登録パッケージの状況から、PackageManagement でも chocolatey に依存することにはなるようです。chocolatey 以外のプロバイダーも利用するかどうかで PackageManagement を使うか決めてもいいかもしれません。

公式なのでPackageManagementのインストール的なものはなく、いきなり使えます。
パッケージプロバイダーを眺めてみます。
初回は NuGet が入ってない場合インストールを促されます。

PS C:\WINDOWS\system32> Find-PackageProvider

プロバイダー 'nuget v2.8.5.208' がインストールされていません。
nuget は、https://oneget.org/Microsoft.PackageManagement.NuGetProvider-2.8.5.208.dll
から手動でダウンロードしてインストールすることができます。
PackageManagement で nuget を自動的にダウンロードしてインストールしますか?
[Y] はい(Y)  [N] いいえ(N)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"): y

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...
PowerShellGet                  2.0.4            PSGallery        PowerShell module with commands for discovering, in...
DockerMsftProvider             1.0.0.5          PSGallery        PowerShell module with commands for discovering, in...
ChocolateyGet                  1.0.0.1          PSGallery        An PowerShell OneGet provider that discovers packag...
DockerProvider                 0.0.0.3          PSGallery        PowerShell module with commands for discovering, in...
ContainerImage                 0.6.4.0          PSGallery        This is a PackageManagement provider module which h...
NanoServerPackage              1.0.1.0          PSGallery        A PackageManagement provider to  Discover, Save and...
GitLabProvider                 1.3.8            PSGallery        GitLab PackageManagement provider
DockerMsftProviderInsider      1.0.0.2          PSGallery        PowerShell module with commands for discovering, in...
GistProvider                   0.6              PSGallery        Gist-as-a-Package - PackageManagement  PowerShell P...
GitHubProvider                 0.5              PSGallery        GitHub-as-a-Package - PackageManagement PowerShell ...
TSDProvider                    0.2              PSGallery        PowerShell PackageManager provider to search & inst...
OfficeProvider                 1.0.0.1          PSGallery        OfficeProvider allows users to install Microsoft Of...
MyAlbum                        0.1.2            PSGallery        MyAlbum provider discovers the photos in your remot...
0install                       2.16.1           PSGallery        OneGet Package Provider for Zero Install
AppxGet                        0.1.0.1          PSGallery        Powershell Package Management (OneGet) Provider for...
WSAProvider                    1.0.0.4          PSGallery        Provider to Discover, Install and inventory windows...
Pacman-Provider                0.0.1            PSGallery        Pacman provider enables installation of pacman pack...
ChocoOneGet                    0.4.0            PSGallery        OneGet provider for Chocolatey

色々なパッケージプロバイダーが出てきます。

ここでは PackageManagement を通して Chocolatey を入れます。

PS C:\WINDOWS\system32> Get-PackageProvider Chocolatey

プロバイダー 'chocolatey v2.8.5.130' がインストールされていません。
chocolatey は、https://oneget.org/ChocolateyPrototype-2.8.5.130.exe
から手動でダウンロードしてインストールすることができます。
PackageManagement で chocolatey を自動的にダウンロードしてインストールしますか?
[Y] はい(Y)  [N] いいえ(N)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"): y

Name                     Version          DynamicOptions
----                     -------          --------------
Chocolatey               2.8.5.130        SkipDependencies, ContinueOnFailure, ExcludeVersion, ForceX86, PackageSave...

ところが、調べてみると Chocolatey より ChocolateyGet のほうが良いとの話があり…
ほかにも出来たての ChocoOneGet というのもありますね。

ChocolateyGet のほうも入れてみます。
Source が "PSGallery" のものは、外部からPowerShellスクリプトを取得するので、これを利用する場合はPC側のスクリプト実行ポリシーを修正する必要があるようです。 ポリシーの初期値はRestrictedなので、リモートの場合に署名付きならOKな設定 RemoteSigned に緩めます。

PS C:\WINDOWS\system32> Get-ExecutionPolicy
Restricted

PS C:\WINDOWS\system32> Set-ExecutionPolicy RemoteSigned

実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies
のヘルプ トピック (https://go.microsoft.com/fwlink/?LinkID=135170)
で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "N"): y

インストールします。

PS C:\WINDOWS\system32> Install-PackageProvider ChocolateyGet

パッケージは、信頼済みとマークされていないパッケージ ソースから取得されています。
'PSGallery' からソフトウェアをアンインストールしますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "N"): y

Name                           Version          Source           Summary
----                           -------          ------           -------
ChocolateyGet                  1.0.0.1          PSGallery        An PowerShell OneGet provider that discovers packag...

「'PSGallery' からソフトウェアをアンインストールしますか?」というのは誤りのようです。 y でふつうにインストールできます。

Chocolatey に関するパッケージプロバイダが2つ入った状態になりました。

利用例

パッケージを探してみます。

PS C:\WINDOWS\system32> Find-Package GoogleChrome

Name                           Version          Source           Summary
----                           -------          ------           -------
GoogleChrome                   71.0.3578.98     chocolatey       Chrome is a fast, simple, and secure web browser, b...
GoogleChrome                   71.0.3578.98     https://www.c...

ChocolateyGet だけを対象にする場合、-Provider オプションを付けます。

PS C:\WINDOWS\system32> Find-Package GoogleChrome -Provider ChocolateyGet

Name                           Version          Source           Summary
----                           -------          ------           -------
GoogleChrome                   71.0.3578.98     https://www.c...

パッケージをインストールする場合も同じです。

Install-Package GoogleChrome -Provider ChocolateyGet

PackageManagement、ほかにも GitHubProvider, OfficeProvider など面白そうなプロバイダーも並んでいますし、今後の発展に期待したいです。

最後に

アクトインディではエンジニアを募集しています。