理系学生日記

おまえはいつまで学生気分なのか

忍者TOOLS

Cask とは何であるのか、および init.el が非常にシンプルになった件

.emacs のモダン化の一環として、依存パッケージの管理を Cask 化しました。
このエントリでは、

  1. Cask とは何か
  2. インストールおよび依存関係の記述
  3. Cask のユースケースとそれに対するコマンド

あたりを書いていきたいと思います。

現在の init.el は以下のように、cask と init-loader 設定のみからなるシンプルなものになっています。

;;; Cask 設定
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(require 'cask "~/.cask/cask.el")
(cask-initialize)

;;; init-loader 設定
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(require 'init-loader)

(setq init-loader-show-log-after-init "error-only")
(init-loader-load "~/.emacs.d/inits")

一方で Cask ファイルには以下のように依存関係のみが記述され、設定と依存関係がきれいに分離できるのがうれしいところ。

(source gnu)
(source melpa)

(depends-on "anzu")
(depends-on "auto-complete")
(depends-on "auto-highlight-symbol")
(depends-on "cask")
(depends-on "exec-path-from-shell")
... (snip)

Cask とは何か

Cask はパッケージ管理と文脈においてのみ捉えられがちですが、実際には Java でいう Maven のようなプロジェクト管理用のツールです。依存するライブラリ管理はもちろん、パッケージングや配布、テストといった機能も持っています(持っているらしいです)。
しかしながら、Emacs のパッケージを自分で作る、という猛者は絶対数が少ないこともあり、多くの場合は、このうちの依存関係管理においてのみ用いられます。ぼくも例外に漏れずその用途のみを考えており、本エントリでも、それ以外のことには深く言及しません。

Cask is an Emacs Lisp project management tool, similar to Maven or Leiningen. It aims to control and automate the entire life cycle of an Emacs Lisp package, including dependency management, packaging, distribution and testing.

Introduction — Why Cask? — Cask 0.7.2

インストール

インストールは非常に簡単で、方法としては

  1. git clone でインストール
  2. (Mac の場合) homebrew でインストール
  3. コマンドラインでインストール

が選択できます。
homebrew でインストールできると個人的には都合が良かったのですが、homebrew の cask は homebrew の emacs に依存しており、この emacs のバージョンはまだ日本語サポートが不安定という話のある 24.4 になっています。

$ brew deps cask
emacs
$ brew info emacs | head -2
emacs: stable 24.4 (bottled), HEAD
https://www.gnu.org/software/emacs/

なので、現段階では、git clone かコマンドラインでインストールした方が良いと思います。
コマンドラインの場合は、以下でインストールが可能で、$HOME/.cask 以下に git clone がなされます。

curl -fsSL https://raw.githubusercontent.com/cask/cask/master/go | python

あとは、パスを通してあげれば良いでしょう。

export PATH="/Users/kiririmode/.cask/bin:$PATH"

また、Cask は対象の Emacs を emacs コマンドで判断しています。これを変更したい (Mac であれば Cocoa Emacs を使いたい) といった場合は、EMACS 環境変数に設定すればよろしい。

export EMACS=/Applications/Emacs.app/Contents/MacOS/Emacs

依存関係の記述

依存関係を記述するのは Cask というファイルです。
必ずしも 1 から作る必要はなく、

$ cask init

を使用すると、当該ディレクトリに Cask ファイルが作成されます。ファイルには、Cask お勧めのパッケージが既に依存関係として記述されているため、それをベースにして好みの依存関係を記述していけば良いでしょう。
最初から記述されているパッケージの概要については、こちらのエントリが分かりやすいです。

依存関係は、depends-on という関数によって記述します。
depends-on の詳細は Cask Domain Specific Language — Cask 0.7.2 を参照すれば良いのですが、日本語の資料としては

が直感的に分かりやすいと思います。

MELPA にあるパッケージだけでなく、git や Bazzar、hg といった VCS でホストされているところからもインストールが可能なのが良いですね。


Cask を記述した後は、

$ cask install

を実行すれば、Cask に記述された依存パッケージがダウンロード、インストールされます。

$ cask install
Wrote /Users/kiririmode/repo/emacs/.cask/24.3.1/elpa/archives/gnu/archive-contents
Wrote /Users/kiririmode/repo/emacs/.cask/24.3.1/elpa/archives/melpa/archive-contents
Making version-control local to yasnippet-autoloads.el while let-bound!
Wrote /Users/kiririmode/repo/emacs/.cask/24.3.1/elpa/yasnippet-20141223.303/yasnippet-autoloads.el
Wrote /Users/kiririmode/repo/emacs/.cask/24.3.1/elpa/wgrep-20141016.1656/wgrep-autoloads.el
... (snip)

この後、init.el あたりに以下のような記述をすれば、インストールしたパッケージに (emacs としての)パスが通ります。

(require 'cask "~/.cask/cask.el")
(cask-initialize)

ユースケースとコマンド

運用上、良く使うだろうと思われるコマンドをまとめておきます。

古くなったライブラリ一覧
$ cask outdated

cask outdated で古くなったライブラリを一覧できます。存在するようなら、後述する cask update を実行すれば良いでしょう。

ライブラリのアップデート
$ cask update

全依存ライブラリを一斉に update します。

Cask そのものの update
$ cask upgrade-cask

Cask そのものを upgrade してくれるようです。まだ試せてませんが。

依存ライブラリのリスト一覧
$ cask list

Cask ファイルを見ても良いのですが、コマンドラインから実行するとクールですね。

ロードパスの設定を参照
$ cask load-path | perl -ple 's/:/\n/g' | head -3
/Users/kiririmode/repo/emacs/.cask/24.3.1/elpa/yasnippet-20141223.303
/Users/kiririmode/repo/emacs/.cask/24.3.1/elpa/wgrep-20141016.1656
/Users/kiririmode/repo/emacs/.cask/24.3.1/elpa/web-mode-20141227.1426

cask load-path で、Cask がどのディレクトリに対してパスを通すのかを参照できます。
個々のパスは ":" で連結されているので、好みに合わせて加工してください。