devboxとatlasでNimをやる

複数プロジェクトの依存パッケージをまとめて管理するnimの新しいツールatlas
を試す。
devbox init
devbox generate direnv
devbox add nim-atlas
devboxを初期化、atlasをインストールする(インストール時はatlasじゃなくnim-atlasであることに注意)。
devbox generate direnv
は任意。

atlas init --deps:_deps
atlasのワークスペースを現在のディレクトリで開始。
--deps:_deps
フラグでワークスペースの依存パッケージが_deps/
配下にインストールされるようにする。

atlas env 任意のバージョン
でnimのインストールができるが、clang由来のエラーが出て安定してなさそうだったのでいつも通りnim, nimbleはdevboxでインストール。
devbox add nim@2.0.4 nimble@0.14.2

mkdir myproject
cd myproject
atlas init
したディレクトリの直下にプロジェクトを作成。nimble initなどでmyproject.nimbleを作成する。

パッケージの追加
ここからプロジェクトで使用するパッケージをインストールしていくが、やりたいことによってコマンドが異なることに注意。
追記: プロジェクトルートでテストやコンパイルをする場合、同じくプロジェクトルートにnim.cfgがないと追加したパッケージが実行時に認識されないので以下のいずれかのコマンドを--cfgHereフラグ付きでプロジェクトルートで実行すること。
- コード上で依存するパッケージをインストールする場合
atlas use パッケージ名/URL
nimbleファイルに記述がなければ、自動でrequires パッケージ
を追記してくれる。
- 開発環境に依存するパッケージをインストールする場合
atlas clone パッケージ名/URL
LSPなどはこちら。
こちらはnimbleファイルへの追記はされない。
- nimbleファイルに記述されている
requires XXX
をまとめてインストールする場合
atlas install プロジェクト名.nimble
いずれの場合にもプロジェクト名/src/nim.cfg
にライブラリやコマンドのPATHが追記されるため、importやコマンドの使用ができるようになっている(はず)。

langserverのexecutableがない、、手動でbuildする?

おそらくグローバルにnimbleをインストールしていれば_deps
配下のlangserverでexcutableをbuildできたはずだが、今回はnimbleもローカルでインストールしているので難しそうだった。
devbox add nimlangserver
なのでlangserverもdevboxでインストールした。

パッケージの追加に追記した通り、--cfgHereでプロジェクトルートにnim.cfgが生成されればプロジェクトルートでプロジェクトをコンパイルできるが、nimble経由でパッケージをインストールしていないため、nimbleコマンドとnimbleファイルで定義したtaskは使えない。taskについては、代わりにプロジェクトルートにconfig.nimsを定義して同じtaskを定義すれば問題ない。

既存のプロジェクトもこのワークスペースに移動した。atlas install XX.nimble --cfgHere
さえ実行すればセットアップが完了するので移行もかんたん。以前はプロジェクト毎にやっていたdevbox init
→nimble install ..
を省けるのでストレスなく新しいプロジェクトを始められる。また、今回は1つのワークスペースにつき1バージョンのNimをインストールしたがnim本体もatlasでの管理にすればプロジェクト毎にバージョンを変更できる(たぶん)

同一ワークスペース内のプロジェクト間の依存関係
あるワークスペースに、いずれもnimbleでインストール可能なパッケージ
- プロジェクトA
- プロジェクトB
- プロジェクトC
- プロジェクトD
があり、AがB, C, Dと、他人のプロジェクトFに依存している場合を考える。なお依存パッケージは_deps/
以下にインストールされる。
試しに、すべての依存パッケージをプロジェクトA.nimbleに記述してatlas install プロジェクトA.nimble
を実行すると、atlasはワークスペース内にB, C, Dがあることを確認してFだけ_deps/にインストールする。また、生成されるnim.cfgにもB, C, Dのローカルのパスが記述される。
依存関係の解決の優先度は、ローカルのパッケージ→オンライン。以下の操作を試す:
- プロジェクトBをワークスペースから除外したあともう一度
atlas install プロジェクトA.nimble
を実行するとBが_deps/にインストールされる。nim.cfgのパスも_deps/以下に変更される。 - その後、プロジェクトBをワークスペースに追加して
atlas install ...
とするとワークスペース直下と_deps/以下のどちらにもプロジェクトBが存在するが、優先度に従いnim.cfg内のプロジェクトBのパスがローカルのパスに変更される。

あと、nim.cfg内に勝手に--noNimblePath
が書かれるけどパッケージの使用者がatlasを使ってない場合邪魔になってしまうので.gitignoreへの追加を推奨