2018年9月にようやく正式リリースされた opam2。
公式が提供するスクリプトでインストールできれば問題ないのですが、それだとうまくいかない環境もあり、色々とインストールが面倒だったのでメモしておきます。
ちなみに以下の内容は次のスクリプトで成功する人には何の価値もない内容ですのでご注意ください。
sh <(curl -sL https://raw.githubusercontent.com/ocaml/opam/master/shell/install.sh)
で、どうやってインストールしたかというと、自分の場合はソースからインストールしました…
ocamlbrew
なる便利そうなのもあるのですが、ここ一年ぐらい更新されておらず、opam2が正式リリースされたのが先月(2018年9月)というのも考慮し、今回は見送りました。
なおopam2は4.02.3
以降じゃないとビルドできませんので、先に
opam switch
とやって表示される中で、4.02.3以降のコンパイラに変更する必要があります(もちろんこれは古いままのopamで実行しても問題なし)。
自分は素直に現時点での最新バージョンを入れました。
opam switch 4.07.0
コンパイラのバージョンに問題がないなら、opam2.0.0のソースディレクトリに入ってビルドします。
./configure make lib-ext make sudo make install
make
するまえにmake lib-ext
が入ることに注意してください。
ちなみに最後のsudo make install
なのですが、ホームディレクトリの.opam/<ocamlのバージョン>/bin/
以下にあるツール(jbuilder
やocamlfind
)を使うので、普通に実行しようとすると、おそらくrootがそれらを見つけられずにコケます。
よってsudoer
を編集します(他にもっといい方法が絶対にありそうなのですが、思いつかなかった…)。
visudo
を起動して
Defaults env_keep += "PATH"
を追加して、
#Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
をコメントアウト。ついでに.bashprofile
などに
PATH:=$PATH:~/.opam/4.07.0/bin export $PATH
みたいなのも追記しておきましょう(終わったらsource .bash_profile
も忘れずに)。
これでローカルのjbuilder
やらocamlfind
やらのパス解決もできて、sudo make install
が無事に通ります。
さて、インストールが終わると、新しいopamを利用するためのセットアップ処理が走るのですが、途中でbubblewrap
という、サンドボックス環境を使うための仕組みを設定するかどうかを聞かれます。
セキュリティーを考えたら使ったほうが良さそうなのですが、後で調べてみたら自分の環境ではインストールできないツールだったので、インストール後に.opam/config
から以下のbubblewrap
に関する設定を削除しました。
# 以下の3つの設定を消す wrap-build-commands: ["%{hooks}%/sandbox.sh" "build"] {os = "linux" | os = "macos"} wrap-install-commands: ["%{hooks}%/sandbox.sh" "install"] {os = "linux" | os = "macos"} wrap-remove-commands: ["%{hooks}%/sandbox.sh" "remove"] {os = "linux" | os = "macos"}
ちなみに理由はよくわかりませんが、先の質問に「No」と答えても、上の3つの設定は.opam/config
に追加されてしまうので注意してください。
セットアップ用の質問に答え終わると、すごく長い「何かしらの処理」が始まります。
途中経過とかが全く出てこないので「え、フリーズ?」と心配してしまうかもしれませんが、気長に待ってたらちゃんと終わるので、安心して下さい。
さて、初期化の処理が終わると、これまでopam1.2系列を使っていたことで止まっていたopam upgrade
が、また進むようになります。
拙作のjinja2互換テンプレートエンジンであるjingooも、opam1.2系列では1.2.18
までしかインストールできませんが、opam2にすると1.2.19
以降もインストールできるようになります。
公式の説明を見る限り、もうopam1.2系列はサポートしないらしいですし、既に新しいパッケージを公開する際は、opam2.0系列を強制されてしまいます。
これで先月はopam-repository
への新パッケージの申請が軒並みコケていて、大混乱でしたね。自分もその一人でした。
バージョン2系列はバージョン1系列のopamファイルと互換性がなく、微妙にフィールド名が変わっていたりするので注意が必要です。
自分の場合は、とりあえずopam-repositoryにopam1のままのpull requestを投げてみて、弾かれたらエラーログを見ながら直す、みたいにして、体で覚えました。