rcmdnk's blog
Last update

20131122_chocolatey_200_200

最近ずっと気になっていたWindowsのパッケージ管理マネージャーの Chocolatey を入れてみました。

Sponsored Links

インストール

公式にあるように、コマンドプロンプトを立ち上げて次のコマンドを貼り付けて エンターするだけです。

> @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
Chocolatey
├── bin
├── chocolateyinstall
├── lib
└── lib-bad

こんな感じの構造になっていて、chocolateyinstallの中に 本体であるPowerShellのスクリプト等が入っています。

1
2
3
4
5
chocolateyinstall/
├── chocolatey.cmd
├── chocolatey.config
├── chocolatey.ps1
...

chocolatey.ps1が中心となるPowerShellスクリプトで、 ここから更に各ツール等を呼んでいます(chocolateyinstallフォルダの中にある)。 chocolatey.cmdはコマンドプロンプト用のラッパーです。

chocolatey.configには使うソース先の設定等が書かれています3

インストールの時にパスを通したbinフォルダには

1
2
3
4
5
6
7
8
9
10
bin
├── _processed.txt
├── choco.bat
├── chocolatey
├── chocolatey.bat
├── cinst
├── cinst.bat
├── clist
├── clist.bat
...

と言った形でコマンドが入っていて、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。

また、

packages.config
1
2
3
4
5
<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Firefox"/>
  <package id="thunderbird"/>
</packages>

と言った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から使う

追記: 2014/07/30

この項目もアップデートにより使えなくなってるので aliasを新しくしました。

Chocolateyのアップデート

追記ここまで

さて、こんな感じでコマンドラインから管理出来るわけですが、 流石に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
if [[ "$OSTYPE" =~ "cygwin" ]];then
  # Chocolatey
  alias choco='cmd /c choco'
  alias cinst='cmd /c cinst'
  alias cup='cmd /c cup'
  alias cuninst='cmd /c cuninst'

  # unset tmp/temp (=C:\Users\user\AppData\Local\Temp)
  # for Chocolatey (otherwise it complains...)
  unset tmp temp
fi

とか書いておくと幸せになれます。

既にインストールされてるプログラムを登録する

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を。。。

Sponsored Links
  1. Installing Chocolatey

  2. Default Chocolatey Installation

  3. 初期値はChocolateyのサイトだけ:https://chocolatey.org/api/v2/

  4. ただ、物によって少々動きが違って、Avastなんかはインストールしてあっても インストーラーが立ち上がりました(さらにこの場合は勝手にインストールされないで 対話的に進めていく様な形になった)。 また、Evernoteなんかは定義が古いので新しいものがあるから入れたいなら手動で、 みたいなメッセージが出てきました。

  5. 実際には直接chocoとしても実行出来るのですが、最後に

    : numeric argument required
    

    というメッセージが出たりしてエラー終了になります。

  6. 実際、ChocolateyInstallという変数はCygwinのなかでも大文字がこの通り出ないと 表示されません。

  7. tempの方だけunsetすると同じようなメッセージがTMPtmpで出るので、 両方共unsetする必要があります。

Sponsored Links

« 追記を書くためのプラグイン: octopress-postscript Mac OS X 10.9 MavericksでGimpでファイルを保存したりするときに文字が打てない問題の解消法 »