日曜プログラミング

休日趣味でやってるプログラミング関連記事をダラダラと

プロファイル設定

Java さえ入っていれば Clojure を始める分には特に困らない leiningen だけど、
しばらく遊んでいるとプロジェクト作成時毎度同じような設定をする事がちょくちょく出てきたのでプロジェクトを作ったらデフォルトで設定してくれる方法を改めてまとめてみた。

leiningen は現行の最新である 2.1.3 を想定しとります。
例は Windows のコマンドプロンプトになってるけど Unix 系 OS でも多分そんなに変わらないかと。

自分が差し当たりやりたかった事

  • leiningen 管理下での Java 起動時は文字エンコーディングを UTF-8 にする
  • nrepl.el で最初から clojure.repl, clojure.pprint を使うようにする
    • どうも Clojure か nrepl.el どっちかは良く分からんがいつの頃からか明示的に use or require しないといけなくなったので予め読み込んでおくように
    • nrepl.el でも出来そうな気はするけどプロファイルの使い方はちょっと知っておきたかったので

講釈はいいから設定見せて

↓はい。

; ~/.lein/profiles.clj
{:user {:plugins [[lein-pprint "1.1.1"]]
        :jvm-opts ["-Dfile.encoding=UTF-8"]}}

結局出来たのは JavaUTF-8 起動する事だけしかできてないけど
プロファイルをこれからカスタマイズしたい場合に思い出せるので書き留めておく。

以下はここに辿り着くまでの手順みたいなもので詳しく知りたい方はどうぞ。

アップグレード*1

C:\>lein upgrade
The script at D:\home\tools\bin\lein.bat will be upgraded to the latest version in series 2.1.2.
Do you want to continue (Y/N)?y
Downloading latest Leiningen batch script...
        1 個のファイルを移動しました。
Upgrading...
Downloading Leiningen now...
        1 個のファイルを移動しました。
        1 個のファイルを移動しました。

バージョン確認

C:\>lein -v
Leiningen 2.1.3 on Java 1.7.0_21 Java HotSpot(TM) 64-Bit Server VM

設定方法

参考: leiningen/doc/PROFILES.md at stable · technomancy/leiningen · GitHub

ここの説明では大きく 3 通り設定の仕方があるようで。

  1. project.clj に直接書く
  2. プロジェクトルート(project.clj)に profiles.clj を置く
  3. ~\.lein\ 以下に profiles.clj を置くか profiles.d\PROFILE-NAME.clj を置く

プロファイルは Clojure のマップ形式で記述する形で、key がプロファイル名、value が設定内容
に相当する。

プロファイルの有効化

参考: leiningen/doc/PROFILES.md at stable · technomancy/leiningen · GitHub

手順は lein の with-profiles で :profiles に記載されたプロファイル名を指定するだけ。
公式ではカンマ区切りで複数ファイル指定する方法とコロン区切りで from-to を指定する方法があ
るみたいだが、後者はつまりプロファイル名が数字でないと管理が難しくなるんかな。

プロファイルの合成

参考: leiningen/doc/PROFILES.md at stable · technomancy/leiningen · GitHub

まだ試してみた事はないが複数のプロファイルを組み合わせて新しいプロファイルを作る事も可能。
ただ複数指定する時は Vector 指定になるんで重複しないように頼んますとの事。


さて、ここまでの説明でじゃあ自分用のプロファイルをいっちょ作ってみるかとなりました?
自分はならなかったので整理の為にこの記事起こしました。以降は補足と言うか説明を並び替えてみ
たと言うか。

デフォルトプロファイル設定のまとめ

自分の中でプロファイルに手を出す気にならなかったのはデフォルトで存在しているプロファイルは
何でどう設定されてるのかがよく分からなかった事にこれ書いてて気づいたので以下にまとめる。

デフォルトプロファイルとは

leiningen のどのタスクでも有効になるが、配布する際には影響しないものっぽい事を最初の方に書
いてある(ちょっと自信なし)。
名前としては以下のものがある。

  • :dev, :provided, :user, :base

設定の中身があるかどうかは show-profiles で一覧に出てくるかどうかで分かる。

C:\>lein show-profiles
base
debug
default
offline
test

2.1.3 だと :base 以外は中身は無い模様。

:dev と :user の扱い

leiningen/doc/PROFILES.md at stable · technomancy/leiningen · GitHub
の後半を読むと :user は project.clj に、:dev は profiles.clj(profiles.d)では設定しないでね、
と書いてある。

ここで解釈するなら、常に有効にしておきたいプラグインは :user プロファイルに設定しておけば
良さそうな感じに読めるのでそうする事にした。サンプルを見た感じ :dev は個別プロジェクトにお
いて開発時にのみ使うテストライブラリとかリソースフォルダを参照する時に使う事を想定している
っぽい。

:provided と :base は書かれてないから分かりまへん。

デフォルトプロファイルの設定内容を確認する

profiles.clj(profiles.d) に設定されていればそのファイルの中身を見るだけで済むのだが、じゃ
デフォルトで設定されているプロファイルって中身どうなってるのよと言うのが不明なのでどうすりゃいいのと言うのはここに書いてある。これによると lein-pprint プラグイン入れて下さいとあるのでその通りにする。

lein-pprint インストール

ここまでまとめた内容を踏まえて ~/.lein/profiles.clj に書く事にしましょ。

; profiles.clj
{:user {:plugins [[lein-pprint "1.1.1"]]}}

確認。

C:\>lein
Retrieving lein-pprint/lein-pprint/1.1.1/lein-pprint-1.1.1.pom from clojars
Retrieving lein-pprint/lein-pprint/1.1.1/lein-pprint-1.1.1.jar from clojars
Leiningen is a tool for working with Clojure projects.

Several tasks are available:
(略)
pom                 Write a pom.xml file to disk for Maven interoperability.
pprint              Pretty-print a representation of the project map.
repl                Start a repl session either with the current project or stan
(略)
C:\>

初めてプラグイン入れてみたけど最初はやっぱり取りに行くのね

デフォルトプロファイルの中身

default は [:dev :provided :user :base] の組み合わせらしいので見てみる。
因みに lein-pprint はどっかの leiningen プロジェクトフォルダに入っていないと動作しない模様。
まあそりゃそうか。

C:\some\where\lein\project>lein with-profile default pprint
Performing task 'pprint' with profile(s): 'default'
{; (略)
 :plugins ([lein-pprint/lein-pprint "1.1.1"]),
 :description "FIXME: write description",
 ; (略)
 :aliases nil}

あー、合体後の中身が見えるだけなのか。
ただまあ lein-pprint は project.clj に設定せずとも入っているようなので良しとしよう。

ついでに show-profiles 見ても user が一覧に出てくるようになってる。

C:\some\where\lein\project>lein show-profiles
base
debug
default
offline
test
update
user
C:\some\where\lein\project>

設定あれこれ

ようやく本題。

Java 起動時は文字エンコーディングを UTF-8 にする

Java 実行プロパティを指定してあげましょう。

; ~/.lein/profiles.clj
{:user {:plugins [[lein-pprint "1.1.1"]]
        :jvm-opts ["-Dfile.encoding=UTF-8"]}}

これで leiningen 管理外での java 実行は java の方のデフォルトエンコーディングになる。

一応 nrepl 起動して確認。

user> "こんにちわ"
"こんにちわ"
user> (as-> (into {} (System/getProperties)) m (find m "file.encoding"))
["file.encoding" "UTF-8"]

なってますな。

コマンドプロンプトjava 関連コマンド見ても文字化けしなくなったので OK。

2 つ目にやりたかった起動時に clojure.repl と clojure.pprint 読んでおくのは :injection で
出来るんじゃないかと思ってたんだがどうも挙動がヘンになったので一旦保留。

*1:少し前までは Windows ではアップグレード動いてなかった気がするけど今は大丈夫みたい。