【Chocolatey入門】導入から注意点、今後の可能性まで

ソフトウェアインストール時、MacOSだと homebrew、Linuxだと apt-getや yumで、コマンドラインから実行できます。
一方、Windowsではインストーラをダウンロードし、GUIで一つずつインストール・アンインストールを行わなければなりません。

そこで、以前から気になっていた、**Windowsでもコマンドラインでパッケージ管理可能なツール、Chocolatey** を使ってみました。

可能性や気になる点など感じましたので、本記事でまとめてみます。
あまり冗長になっても読みづらいので、ここではできるだけ簡潔に紹介しますが、ブログ (https://kan-getsu.hatenablog.com/entry/2018/09/02/140530) でもう少し丁寧に紹介してますので、興味を持たれた方はよかったらこちらもご覧ください。

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

# 環境情報など
- Windows10  
※なお、本記事の情報は執筆時点 (2018/9/6) 時点のものです

# Chocolateyの導入方法
## Chocolateyのインストール
[公式ページの Install] (https://chocolatey.org/install) にある 5ステップ (実質 4ステップ) に従います。なお、PowerShellを使う方法とコマンドプロンプトを使う方法がありますが、ここではコマンドプロンプトを使った方法を紹介します。  

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

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

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

### 2. Chocolateyインストールコマンドのコピー
公式サイトの <b>Install with cmd.exe</b> にあるコマンドをコピーします。  
**(copy command text)** 左のアイコンをクリックするとコマンドがクリップボードにコピーされます。内容は以下

```cmd:chocolateyインストールコマンド
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"
```

### 3. Chocolateyインストールコマンドの実行
1で起ち上げたコマンドプロンプトに、2でコピーしたコマンドをペーストして実行します。
警告が 3つ出ますが気にしなくて大丈夫です。簡単に説明すると、  

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

程度です。

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

## Chocolateyの使い方
まず覚えるべきコマンドは以下の 7つです。

### パッケージの一覧
- <b>`choco list -l`</b>  
  インストール済みパッケージの一覧。`-l` は `--localonly` のエイリアス
- <b>`choco list ${packageName}`</b>  
  Chocolateyリポジトリから、${packageName} にマッチするものを検索  

### パッケージのインストール
- <b>`choco install ${packageName}`</b>  
  ${packageName} で指定したパッケージをインストール

### パッケージの更新
- <b>`choco outdated`</b>  
  最新版でないインストール済みのパッケージを一覧
- <b>`choco upgrade ${packageName}`</b>  
  ${packageName} に完全一致するパッケージを更新。半角スペースで複数パッケージ名を並べて、一括更新も可能
- <b>`choco upgrade all`</b>  
  最新版でないインストール済みパッケージを<b>すべて</b>更新、便利。

### パッケージのアンインストール
- <b>`choco uninstall ${packageName}`</b>  
  インストール済みパッケージのアンインストール  
  ※Chocolateyの弱いところとして、<b>アンインストール機能が発展途上</b>という点があります。中にはうまくアンインストールできないものもあるので、その場合は GUIから消す必要があります。

## Chocolateyでインストール・実践例
### ChocolateyGUIのインストール
実際に Chocolateyでソフトウェアをインストールしてみます。  
まずは、Chocolateyを GUIで管理できる <b>chocolateygui</b> を入れてみましょう。  
これは Chocolateyのパッケージを GUIで管理できるだけでなく、<b>Chocolateyを使った別マシンへのソフトウェア環境の引っ越しに必要</b>なモジュールになっています。  

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

```cmd: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のようです。  
名前が分かったので `choco install ChocolateyGUI` でインストールします。  

```cmd: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).

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

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

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

```cmd: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).

c:\workdir>
```
chocolateyでは 2018/9/6現在、デフォルトで Python3が入ります。  
指定したソフトウェ以外にも 2つインストールされていますが、これは **依存関係を解決** してくれているためです (chocolatey-core.extensionが依存解決するための chocolateyのパッケージで、依存解決が必要なパッケージを初めてインストールしたときにインストールされるようです)。
インストール時に `PATH` も通してくれますが、そのままでは未反映なので `refreshenv` (chocolateyのコマンド) で環境変数をリフレッシュするか、プロンプトを開き直して反映できます。 

## ChocolateyGUIを使ったソフトウェア環境エクスポート・インポート
先ほどインストールした ChocolateyGUIを起動します。  
![chocolateygui.PNG](https://qiita-image-store.s3.amazonaws.com/0/141199/b3e232dd-5c7e-d3d3-9e06-071f79695601.png)

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

```cmd
>choco install ${configFileName}
```

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

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

### Chocolateyの注意点
#### インストール済み同一パッケージとの競合に注意
レジストリや環境変数を編集する都合上、インストール済みのソフトを Chocolateyでさらにインストールするのは避けた方が良いかもしれません。
先にインストール済みソフトをアンインストールをしてから Chocolateyでインストールする場合はリスクが減るかもしれませんが、慎重にご判断ください。

#### アンインストールは発展途上
基本的に、**アンインストール機能はまだ満足できるものではない** と感じます。
Chocolateyでのアンインストールは失敗することがあり、その場合はやはり GUIで消すしかありません。
また、これは Windowsアンインストーラーでも同じかと思いますが、環境変数の削除や、依存関係にあったソフトウェアの一括アンインストールなどもできません。

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

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

#### 同一パッケージの複数バージョンは同居できない？
開発者のみに関係する問題かと思いますが、**同一パッケージの複数バージョンの同居はできなさそう** です。
試しに apache-httpdのマイナーバージョンを指定して バージョン 2.4.32と バージョン 2.4.34をインストールしてみましたが、後勝ちで上書きされました。
 
なお、Pythonに関しては Python2, 3は別枠のようで、別途 `choco install python2` で同居させることができました。

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

### Chocolateyの可能性
<b>Chocolateyはコマンドラインツールなので、batを組んで処理を自動化</b>できます。
例えば、複数パッケージの一括アンインストールができないという弱味がありますが、`choco list -l` の結果を利用してテキストエディタなどで処理を追記し、`-f` オプションや `-y` オプションを工夫して利用することで上手くいきそうです。

この他にも batを作れば、コマンドラインツールならではの便利なことができるかもしれません。

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

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

## 参考
公式サイト: https://chocolatey.org/