最近ずっと気になっていたWindowsのパッケージ管理マネージャーの Chocolatey を入れてみました。
インストール
公式にあるように、コマンドプロンプトを立ち上げて次のコマンドを貼り付けて エンターするだけです。
> @powershell -NoProfile -ExecutionPolicy unrestricted -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%systemdrive%\chocolatey\bin
追記: 2014/07/30
Chocolateyの最近のアップデートでインストール場所を
C:\ProgramData\Chocolatey
にするように推奨が変わっています。
(コレ以外の場所にインストールすると常にWarningが出る。。。)
インストールコマンドも
> @powershell -NoProfile -ExecutionPolicy unrestricted -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%systemdrive%\ProgramData\chocolatey\bin
の様にProgramData
を加えて行うのが現在の通常のインストール方法です。
追記ここまで
この過程で、
システムのプロパティ
詳細設定
環境変数
の
ユーザー環境変数
として
ChocolateyInstall
:C:\Chocolatey
Path
:C:Chocolatey\bin:
の二つの新たな変数が追加されます。もし、Pathを他の所で使っていればその Pathに追加される形になっているはずです。
追記: 2014/07/30
これらもアップデートにより、システム環境変数の方に追加される様になっています。
追記ここまで
上のコマンドの中でSET PATH
をしているので立ち上げたコマンドプロンプトの中では
Chocolateyのコマンドへのパスが通ってますが、上の環境変数は
再起動後に有効になるので、新たにコマンドプロンプトを立ち上げるとまだ使えません。
(直接ディレクトリに行けば勿論使えますが。)
GUIバージョンのChocolateyGUI
と言うのがあって、
真っ先にインストールして使ってみたいわけですが、
これも環境変数が有効になってないと立ち上がりすらしないので、
Chocolatey本体をインストール出来たら一度Windowsを再起動します。
ChocolateyのインストールはPowerShellを直接使ったりする方法も有りますが 1、 実行ポリシーの問題など、ちょっとややこしいので特別PowerShellで行う必要が無ければ コマンドプロンプトに上記コマンドを貼り付けてしまうのが簡単です。
インストールされるもの
Chocolatey本体や関連ファイル等はC:\Chocolatey
の下に置かれます。
上のChocolateyInstall
の環境変数で指定されているフォルダです。
この値をインストール時に変更すればインストール場所を変えることも可能ですが、 色々な理由2:
- プログラムじゃないし、
Program Files
フォルダは管理者権限が無いと扱えないから駄目。 - でもユーザー限定のものじゃなくてシステムワイドな物だからユーザーディレクトリも嫌。
- DOSコマンドだと、余り長いパスを扱えない事があるのでなるべくパスは短く。
と言った様な事があるみたいですが、取り敢えず三番目は結構重要なので
デフォルト通りC:
直下に置いておくのが無難です。
Chorolatey
フォルダの中は
1 2 3 4 5 |
|
こんな感じの構造になっていて、chocolateyinstall
の中に
本体であるPowerShellのスクリプト等が入っています。
1 2 3 4 5 |
|
chocolatey.ps1
が中心となるPowerShellスクリプトで、
ここから更に各ツール等を呼んでいます(chocolateyinstallフォルダの中にある)。
chocolatey.cmd
はコマンドプロンプト用のラッパーです。
chocolatey.config
には使うソース先の設定等が書かれています3。
インストールの時にパスを通したbin
フォルダには
1 2 3 4 5 6 7 8 9 10 |
|
と言った形でコマンドが入っていて、bat
ファイルはchocolatey.cmd
へのラッパー
(cinst.bat
ならchocolatey.cmd install
を呼んでる)、
bat
がついてないものは単に付いてる物を呼び出してるだけの短縮コマンドです。
残りのlib
にはパッケージインストール時に出来るもので、
各パッケージのインストール用の設定ファイルが
ダウンロードされてきて配置されます。
lib-bad
は何らかの問題があった物が入ります。
基本的なコマンド
ヘルプ
ここまで来たら(再起動後)、コマンドプロンプトを開いて 取り敢えず
> choco /?
とすればヘルプが見れます。
リスト/サーチ
インストールするにはChocolateyで決められたパッケージ名が必要ですが、
これはChocolatey Galleryで探すか、
コマンドではlist
を使って
> choco list Firefox
adblockpluschrome 0.0.0.2
adblockplusfirefox 0.0.0.1
...
Firefox 25.0.1
...
Reading environment variables from registry. Please wait... Done.
>
と言った形でFirefoxに関係するパッケージのリストを取得できますが、
Firefoxの場合でも20個位リストされます。
このlist
コマンドは都度サーバーとやりとりしてるらしく、結構時間がかかります。
最後に引数を与えないと全リストを表示するので物凄く時間がかかるので注意を。。。
(search
コマンドもv0.9.8.21から追加されたと有りますが、現状list
の単なる別名です。)
一方、インストール済のパッケージをリストするには-localonly
か-lo
を使って
> choco list -lo
Firefox 25.0.1
thunderbird 24.1.1
...
>
とすると表示されます。
インストール
差し当たりパッケージのインストールは
> cinst Firefox
等とすればFirefoxがインストールされます(cinst
=chocolatey install
=choco install
)。
インストールされる先は基本的には通常インストール通りProgram Files
以下になります。
既に手動でインストール済だがChocolateyとしてはインストールしてないプログラムを Chocolateyからインストールすると、
What if I install X and I already have X installed?
With most packages when you already have something installed, the chocolatey process will just perform the install again silently. Most times this means that it does nothing and in the end you have what you already had.
とあるように、基本的にはパッケージのインストール用ファイルを取ってきた後に
'7zip 9.22.01.20130618' already installed.
If you want to reinstall the current version of an existing package, please use the -force command.
こんな感じでもうインストールしてある、と言って止まります4。
複数のパッケージをインストールしたい場合には、以前はループを回したりしなくては 行けなかったみたいですが、v0.9.8.21から
> cinst Firefox thunderbird
と加えて書くだけでOK。
また、
1 2 3 4 5 |
|
と言ったXML形式のファイルをpackages.config
と言う様に.config
と言う拡張子にして
保存し、
> cinst packages.config
とすると、中身に書いてあるパッケージを一度にインストールしてくれます。
list
とこのconfigファイルを適当に扱うスクリプトでも書けば
brewall
的な一元管理が出来る様になると思うので、そのうち。。。
(下に書くようにCygwinから簡単に使えたのでShellスクリプトとかで書けば簡単に
出来そうですが、せっかくだから最終的にはPowerShellで書けたら。全く使ったことないですが。)
アップデート
これも短縮コマンドが用意されてて(cup
=chocolatey update
)、コマンドに
パッケージ名を与えると各パッケージのアップデード、全てアップデートしたい場合には
> cup all
とall
を与えます。何も引数を与えないとChocolatey自身をアップデートします。
アンインストール
これも短縮コマンドcuninst
=chocolatey uninstall
を使って
> cuninst package
とするとアンインストール出来ます。
ChocolateyGUI
ここで、GUIの管理プログラムがあるのでインストールしてみます。
> cinst ChocolateyGUI
通常のプログラム同様、スタートアップに登録されてるはずですが、 上に書いたとおり、一度再起動して環境変数を有効にしておかないと動かない (うんともすんとも言わない)ので注意して下さい。
これを立ち上げるとこんな感じで、
現在インストールされているもの、ソース先にパッケージ登録されているもの 一覧を見ることが出来、それぞれの場所で、インストールやアンインストールを ボタンひとつで出来ます。 最初、小数のパッケージを試してみる分には分かりやすいと思います。
Cygwinから使う
さて、こんな感じでコマンドラインから管理出来るわけですが、 流石にWindowsのコマンドプロンプトを使うのは怠いし、 PowerShellも良くわからない。。。
ということで、Cygwinからbash(別に何でもいいわけですが)で使います。
PATHがWindowsの環境変数で通ってるのでchoco等のコマンドが Cygwinの中でも直接見えます(Cygwinの中でも最初に設定されるPATHとして有効)。
ただ、これらはコマンドプロンプト用のコマンドなので、
$ cmd /c choco...
としてあげないと行けません5。
また、最初にこのコマンドを打ってみた時、
$ cmd /c choco list -lo
Item has already been added. Key in dictionary: 'TEMP' Key being added: 'temp'
Reading environment variables from registry. Please wait... Done.
$
こんな感じのメッセージが出て何も表示されませんでした。
取り敢えず、temp等を調べてみると
$ echo $TEMP
/tmp
$ echo $temp
C:\Users\user\AppData\Local\Temp
と、$tmp
にWindowsのパスが直接そのまま入っていて
これは
Windowsの環境変数で、ユーザーの環境変数として
`TEMP`: %USERPROFILE%\AppData\Local\Temp
`TMP`: %USERPROFILE%\AppData\Local\Temp
として指定されている値です。
Cygwinの中ではTEMP
という値を/tmp
ディレクトリにするのは決まっているからか、
これらのユーザー環境変数は小文字になって設定されているちょっと特殊な感じになっています
6。
環境変数のところにあるように、Cygwinの中でtmp
と言う値も同様に
この値になっています。
これらの小文字の値はCygwinのなかでは正しく無いパス表記(バックスラッシュを使ってる) ですし、使わないので、
unset tmp temp
としてもう一度試してみると
$ cmd /c choco list -lo
7zip 9.22.01.20130618
...
と上手く行きました 7。
以上で使える様になったので、簡単に使うため、.bashrc
に
1 2 3 4 5 6 7 8 9 10 11 |
|
とか書いておくと幸せになれます。
既にインストールされてるプログラムを登録する
Cygwinから使える様になったので、適当なコマンドでざっと 現在インストールされてるファイルをChocolatey管理にしてみました。
$ ls /cygdrive/c/Program\ Files > programfiles.txt
$ while read a;do choco list "$a";done < programfiles.txt 2>&1|tee log.txt
と、取り敢えずC:\Program\ Files
にあるフォルダ名(130個程)を全部取ってきて
listしてみます。
すると、上にも書いたように各プログラム毎に幾つものパッケージが該当するので、 そのままだと多すぎ(~1万程)。 重複も多くあるので取り敢えず
$ sort log.txt |uniq > packages.txt
これで千行くらいになりました。
こうすると元のプログラムとパッケージの対応が分からなくなる部分もありますが、 取り敢えずプログラムとパッケージが同じや似たようなのは近くに残るし、 後は適当に目で必要そうなのを探ってみました。 見てる中で知らなかった面白そうなプログラムも見つけられることもあるかもしれないので、 ざっと見て仕分けするのは悪く無いと思います。
結局50程残りました。
取り敢えず、必要そうなパッケージを残して、適当に上のxml形式に変換します。 (Vimでrecordingを使ってやったのでコマンドはありません、すいません。)
出来たらpackages.config
と名前を変えてやって
$ cinst packages.config
とすると、片っ端からインストールを行っていきます。
無理にxmlにしないでも、ただのリストにして
$ while read a;do cinst $a;done < packages.config
でも全く同じことです(50個くらいを引数として全部一気に渡しても良いのかもしれませんが。。。)
既にインストールされてるものに関しては大概パッケージ情報だけを取ってきて スルーしてくれますが、 上に書いたように中にはインストーラーが立ち上がって対話的に処理する必要が あるものもあるかもしれません。
一方で、パッケージが見つからなかったものもメモしておきます
$ grep -B1 "No packages found" log.txt |grep -v "No packages"|grep -v "\-\-" > notfound.txt
こんな感じで一覧を作成。 次は自分用にパッケージを作成してこれらのプログラムも 簡単に入れられるようになれば、と。
まとめ
昨年出来たばかりで今年前半にはまだ登録パッケージが少ないな、という印象でしたが、 アクティブに動いてるみたいで、主要なプログラムは大体入っている感じです。 日本発のフリーソフトみたいのは流石に入ってないのが多いですが、 問題ないようなもの(他のソフトをバンドルしてインストールするようなのは 公式には禁止、とのこと) まず自分用に作って公式に挙げていったりもしてみたいですね。
取り敢えず使える事は確認して満足したので、 適当な取りまとめスクリプトでも作ったら次はMacでBoxenを。。。
-
初期値はChocolateyのサイトだけ:https://chocolatey.org/api/v2/ ↩
-
ただ、物によって少々動きが違って、Avastなんかはインストールしてあっても インストーラーが立ち上がりました(さらにこの場合は勝手にインストールされないで 対話的に進めていく様な形になった)。 また、Evernoteなんかは定義が古いので新しいものがあるから入れたいなら手動で、 みたいなメッセージが出てきました。 ↩
-
実際には直接
choco
としても実行出来るのですが、最後に: numeric argument required
というメッセージが出たりしてエラー終了になります。 ↩
-
実際、
ChocolateyInstall
という変数はCygwinのなかでも大文字がこの通り出ないと 表示されません。 ↩ -
temp
の方だけunsetすると同じようなメッセージがTMP
tmp
で出るので、 両方共unsetする必要があります。 ↩