寒月記

住みにくいところをどれほどか寛容て

Chocolateyを使ってWindowsでもコマンドラインでソフトウェア管理

随分間隔が空いてしまいましたが、今回はソフトウェアの紹介です。

Windowsでソフトウェアをインストールするとき、大抵は

  1. インストーラーが置いてあるページを検索
  2. Webページからインストーラーをダウンロード
  3. ダウンロードしたインストーラーを叩いて「次へ」「次へ」……
  4. 仲間を呼ばれないよう*1チェックボックスに気をつけて「完了」

という手順を取る方が多いと思います。

この手順、正直面倒に感じていました。
コマンド一発でソフトをインストールできる MacLinuxユーザーには、このストレスがより伝わるのではと思います。
さらにソフトの更新に至っては定期的に一つずつ確認して行わなければならず、
インストールよりもつらいものがあります。


そこで、Windowsでも MacLinuxのように、コマンドでソフトウェアを管理できるツール、
Chocolateyを使ってみました*2

f:id:kan-getsu:20181002221810j:plain
chocolateyのポップなtop画面。The package manager for Windows

Chocolateyを導入すれば、こんなことができます。

Chocolateyでできること
  • コマンドでソフトウェアインストール・アンインストール・更新
  • ソフトウェアインストール時に依存解決
  • 複数のソフトウェアをまとめて更新
  • インストール済みソフトウェアのリストをエクスポートして別マシンにソフトウェア環境を引っ越し

この記事では、Chocolateyのインストールから簡単な使い方までを紹介します。
特にプログラミングをやっている方・興味のある方は、
コマンドライン操作でのソフトウェア管理をぜひ一度体験してみてください。

この記事の目的

Chocolateyを利用して、

  1. インストーラーポチポチからの解放
  2. こまごましたソフトウェア更新からの解放
  3. ソフトウェア環境のバックアップ・簡単なお引越しを実現

Chocolateyのインストール

まずは、Chocolatey自身をインストールする必要があります。
手順はごく簡単で、公式ページの Install にある 5ステップ (実質 4ステップ) に従うだけです。
公式が英語なので、ここでも簡単に解説します。

1. コマンドプロンプトを [管理者として実行]

公式には PowerShellを使う方法も併記されていますが、
ここではコマンドプロンプト利用の場合を記載します。

ソフトウェアのインストールになるので、
コマンドプロンプト管理者権限で実行します。

  1. キーボードの Windowsボタン (または画面左下の Windowsマーク) を押し、cmd と入力
  2. コマンドプロンプトを右クリックし、管理者として実行

f:id:kan-getsu:20181002222247j:plain
コマンドプロンプトを管理者として実行

2. コマンドプロンプトで Chocolateyインストールコマンドを実行

公式サイトの Install with cmd.exe にあるコマンドをコピーします。
下図の囲み枠内のアイコンをクリックするとコマンドがクリップボードにコピーされます。

f:id:kan-getsu:20181002222318j:plain
Chocolateyインストールコマンドのコピー

3. Chocolateyインストールコマンドの実行

1で起ち上げたコマンドプロンプトに、2でコピーしたコマンドをペーストして実行します。

f:id:kan-getsu:20181002222401j:plain
Chocolateyインストールコマンド実行

警告が 3つ出ますが気にしなくて大丈夫です。簡単に説明すると、

「インストール後にコマンドプロンプト再起動必要かも」
「Chocolateyを過去バージョンからアップグレードするときに出るエラーは無視していい」
「タブ補完機能設定されてないよ」

程度です。

4. 完了まで待つ

待ちます (公式サイトに書いてあるので......)。

5. インストールの確認

無事インストールが完了したら、コマンドプロンプトchoco と打ってみます。
Chocolateyのバージョン情報が表示されたら成功です。
(2018/9/2現在 v0.10.11)

Chocolateyの使い方

まず覚えるべきコマンドは以下の 7つ。

パッケージの一覧

  • choco list -l
    インストール済みパッケージの一覧。-l--localonlyエイリアス
  • choco list ${packageName}
    Chocolateyリポジトリ (ソフトウェアの倉庫) から、${packageName} にマッチするものを検索
    ※Chocolateyリポジトリにないものもあるので、
    その場合は残念ながら今まで通りインストーラーを落として GUIでインストールしましょう。

パッケージのインストール

  • choco install ${packageName} ${packageName} で指定したパッケージをインストール。
    半角スペースで複数パッケージ名を並べて、一括インストールも可能

パッケージのアップグレード

  • choco outdated
    最新版でないインストール済みのパッケージを一覧
  • choco upgrade ${packageName}
    ${packageName} に完全一致するパッケージを更新。
    半角スペースで複数パッケージ名を並べて、一括更新も可能
  • choco upgrade all
    最新版でないインストール済みパッケージをすべて更新。
    GUIポチポチ更新と比べると圧倒的に便利

パッケージのアンインストール

  • choco uninstall ${packageName}
    インストール済みパッケージのアンインストール
    ※Chocolateyの弱いところとして、アンインストール機能が発展途上という点があります。
    中にはうまくアンインストールできないものもあるので、その場合は観念して GUIから消しましょう。
    気になる人は PATH の管理も忘れずに。

Chocolateyでインストール・実践例

chocolateyguiのインストール

では、実際に Chocolateyでソフトウェアをインストールしてみます。
まずは、Chocolateyを GUIで管理できる chocolateygui を入れてみましょう。
CLI最高」みたいなことを冒頭で述べてますが矛盾しているわけではなく、
これがChocolateyを使った別マシンへのソフトウェア環境の引っ越しに必要なモジュールになっているためです。

では、まずは choco list chocolateygui で、
リポジトリに登録されていることを確認してみましょう。

c:\workdir>choco list chocolateygui
Chocolatey v0.10.11
ChocolateyGUI 0.16.0 [Approved]
ChocoShortcuts 0.4.1 [Approved]
2 packages found.

探しているものは ChocolateyGUI という名前で、バージョンは 0.16.0のようです。
名前が分かったので Ctrl + M で選択モードにして名前をコピーし、
choco install ChocolateyGUI でインストールします。

c:\workdir>choco install ChocolateyGUI
Chocolatey v0.10.11
Installing the following packages:
ChocolateyGUI
By installing you accept licenses for the packages.
Progress: Downloading ChocolateyGUI 0.16.0... 100%

ChocolateyGUI v0.16.0 [Approved]
chocolateygui package files install completed. Performing other installation steps.
The package ChocolateyGUI wants to run 'chocolateyInstall.ps1'.
Note: If you don't run this script, the installation will fail.
Note: To confirm automatically next time, use '-y' or consider:
choco feature enable -n allowGlobalConfirmation
Do you want to run the script?([Y]es/[N]o/[P]rint): Y

Installing ChocolateyGUI...
ChocolateyGUI has been installed.
  chocolateygui may be able to be automatically uninstalled.
Environment Vars (like PATH) have changed. Close/reopen your shell to
 see the changes (or in powershell/cmd.exe just type `refreshenv`).
 The install of chocolateygui was successful.
  Software installed as 'msi', install location is likely default.

Chocolatey installed 1/1 packages.
 See the log for details (C:\ProgramData\chocolatey\logs\chocolatey.log).

途中、Do you want to run the script?([Y]es/[N]o/[P]rint):スクリプト実行の承認を求められますが、
面倒であればコマンド入力時に choco install ChocolateyGUI -y とすれば、
自動で [Yes] を選択した結果と同じになります。

無事インストールが完了したら、choco list -l でインストールされていることを確認してみましょう。
chocolateygui 0.16.0 が表示されていれば成功です (バージョンは 2018/9/2現在のもの)。

Pythonのインストール

同じく、Pythonでもインストールしてみましょう。

c:\workdir>choco install python
Chocolatey v0.10.11
Installing the following packages:
python
By installing you accept licenses for the packages.
Progress: Downloading python 3.7.0... 100%

chocolatey-core.extension v1.3.3 [Approved]
chocolatey-core.extension package files install completed. Performing other installation steps.
 Installed/updated chocolatey-core extensions.
 The install of chocolatey-core.extension was successful.
  Software installed to 'C:\ProgramData\chocolatey\extensions\chocolatey-core'

python3 v3.7.0 [Approved]
python3 package files install completed. Performing other installation steps.
The package python3 wants to run 'chocolateyInstall.ps1'.
Note: If you don't run this script, the installation will fail.
Note: To confirm automatically next time, use '-y' or consider:
choco feature enable -n allowGlobalConfirmation
Do you want to run the script?([Y]es/[N]o/[P]rint): y

Installing 64-bit python3...
python3 has been installed.
Installed to: 'C:\Python37'
  python3 can be automatically uninstalled.
Environment Vars (like PATH) have changed. Close/reopen your shell to
 see the changes (or in powershell/cmd.exe just type `refreshenv`).
 The install of python3 was successful.
  Software installed as 'exe', install location is likely default.

python v3.7.0 [Approved]
python package files install completed. Performing other installation steps.
 The install of python was successful.
  Software install location not explicitly set, could be in package or
  default install location if installer.

Chocolatey installed 3/3 packages.
 See the log for details (C:\ProgramData\chocolatey\logs\chocolatey.log).

chocolateyでは 2018/9/2現在、Pythonインストール時デフォルトで Python3が入ります。
指定したソフトウェ以外にも 2つインストールされていますが、
これは依存関係を解決してくれているためです。

つまり、Python3が満足に動作するために必要なソフトも一緒にインストールしてくれているということです。*3

インストール時に PATH も通してくれますが、そのままでは未反映なので
refreshenv コマンドで環境変数をリフレッシュするか、プロンプトを開き直してください。
すると python コマンドで Python3を起動できます。

ChocolateyGUIを使ったソフトウェア環境引っ越し

最後のポイント、ソフトウェア環境の引っ越し (複製) 方法を説明します。
先ほどインストールした ChocolateyGUIを起動してみましょう。
Windowsキーを押して chocolatey と打てば出てきます。

f:id:kan-getsu:20181002222946p:plain
ChocolateyGUIの画面。右上のエクスポートボタンでソフトウェア情報を出力

右上オレンジで囲ったアイコンをクリックすると、
インストール済みパッケージ名とバージョン情報を記録した xml形式の configファイルが出力されます。

Chocolateyインストール済みの環境で、

choco install ${configFIleName}

と実行することで、configファイルに出力したソフトウェアをインポートすることができます。

複数 Windowsマシンの環境を揃えるのに便利ですね。
インストーラを使って環境再現することを考えると、手間が恐ろしい……

補足:Chocolateyの注意点と可能性

以上、Chocolateyのメリットを中心に書いてきましたが、いくつか注意点があるので記載します。

Chocolateyの注意点

インストール済み同一パッケージとの競合に注意

レジストリ環境変数を編集する都合上、
インストール済みのソフトを Chocolateyでさらにインストールするのは避けた方が良いかもしれません。
先にインストール済みソフトをアンインストールをしてから
Chocolateyでインストールする場合はリスクが減るかもしれませんが、
リスクを避けるなら慎重にご判断ください (私はこの記事を書くために元々あった Pythonをアンインストールして Chocolateyで入れ直してます)。

アンインストールは発展途上

基本的に、アンインストールの箇所で触れたように、
アンインストール機能はまだ満足できるものではありません

Chocolateyでのアンインストールは失敗することがあり、その場合はやはり GUIで消すしかありません。
また、これは Windowsアンインストーラーでも同じかと思いますが、
環境変数の削除や、依存関係にあったソフトウェアの一括アンインストールなどもできません (当然かもしれませんが)。

Chocolateyリポジトリにあるパッケージしかインストールできない

これも当然ですが、Chocolateyのリポジトリにあるものしかインストールできません
choco list ${packageName} で見つからなければ、従来通りインストーラーを落とす必要があります。

Chocolateyリポジトリにあるパッケージは必ずしも最新版ではない

個別のソフトウェア発行元が管理しているわけではないので、これもある種当然かもしれません。
例えば、2018/9/2現在で、postgresqlの最新バージョンは公式で 10.5, Chocolateyで 10.4.0.0でした。

同一パッケージの複数バージョンは同居できない?

開発者のみに関係する問題かと思いますが、同一パッケージの複数バージョンの同居はできなさそうです。
試しに apache-httpdのマイナーバージョンを指定して バージョン 2.4.32と バージョン 2.4.34をインストールしてみましたが、
後勝ちで上書きされました (そして httpdのデフォルトポートが 8080でした。Webサーバーのデフォルトポートは 80と思ってたので意外でした)。

なお、Pythonに関しては Python2, 3は別枠のようで、
別途 choco install python2 で同居させることができました (PATH の優先順位も後勝ちなので、
デフォルト利用したいグローバル Pythonバージョンによって、PATH の優先順位は変更する必要があります)。

このため、JDKApache, Tomcatなど、
開発のため複数バージョンが必要となりそうなものは Chocolateyで管理しない方がよさそうです。

Chocolateyの可能性

触っていて困ったことの一つが、依存が多いパッケージをアンインストールしたとき、
依存解決のために一緒にインストールされたけどもう使わないパッケージが残っていて面倒だな、
と思ったことです。
一つずつアンインストールしなければいけない、というのは従来の GUIでのアンインストールも同じなので、
プラマイゼロですが少し残念でした。

しかしふと、Chocolateyはコマンドラインツールなので、batを組んで自動化できるのではと思いました。
しっかり試してませんが、こんな感じでいい感じにできそうかも。

  1. choco list -l の結果を出力
    cmd choco list -l > uninstallChocoPackage.bat
  2. エディタで uninstallChocoPackage.batを編集し、choco uninstall ${packageName} -y と記述 (矩形選択できるエディタを使う)
  3. uninstallChocoPackage.batを管理者権限で実行


この他にも batを作ればあれこれできそうですね。
少しのアイディアがあればずいぶん楽になりそうです。

Chocolateyのアンインストール

Chocolatey自身をアンインストールしたい時は、フォルダ削除のみで大丈夫です。
詳しくは公式サイトの Uninstalling Chocolatey にありますが、
大体 C:\Program Data\chocolatey にあるのでこのフォルダの削除で問題ありません。

まとめ

様々なメリットがあり、可能性も感じる Chocolateyですので、
開発者の方は一度触ってみると楽しいと思います。
ただし、まだまだ注意点や発展途上の部分もあるので、
従来通りのインストーラーと使い分けながら運用をする必要があります。

以下、よく使う Chocolateyコマンドを、最後にまとめておきます。

Chocolateyコマンドまとめ

機能 コマンド
インストール済みパッケージの一覧 choco list -l
リポジトリ上のパッケージを検索 choco list ${packageName}
パッケージのインストール choco install ${packageName} -y
最新版でないインストール済みパッケージの一覧 choco outdated
パッケージの更新 choco upgrade ${packageName}
最新版でないインストール済みパッケージの一括更新 choco upgrade all
パッケージのアンインストール choco uninstall ${packageName}

参考

chocolatey.org ※本記事の画像出典もこちらから

*1:インストールするつもりがないソフトがインストールされていた。それはインストーラに潜む罠の仕業です。チェックボックスには気をつけましょう

*2:チョコラテと発音してたけど、チョコレーティがネイティブっぽいです

*3:正確に言うと、chocolatey-core.extensionが依存解決するための chocolateyのパッケージで、依存解決が必要なパッケージを初めてインストールしたときにインストールされます