チーム共有の devcontainer 環境に無理やり Neovim をねじ込む
はじめに
チームで共有されているVSCode前提のdevcontainer設定を、devcontainer-cliを使ってNeovimで使えるようにした際の工夫をまとめておきます。
背景
最近、devcontainerを採用しているチームに異動しました。チームではVSCodeでdevcontainerを使っているのですが、私はVSCodeに慣れておらず、Neovimで開発したいと考えていました。devcontainer CLI を使えばVSCode以外でもdevcontainerの恩恵を受けられるのですが、いくつか工夫が必要でした。
チームで共有している設定に外部から機能を追加する
devcontainerの構成を管理するdevcontainer.jsonはgit管理されているため、個人用の設定を直接書き込むのはあまり推奨されません。そこで、必要なオプションはすべてエイリアスを使って実行時に渡してあげることにしました。devcontainerにはFeaturesという拡張機能の仕組みがあり、今回はこれを使います。devcontainer-cliでは --additional-features オプションを使うことで、設定ファイルに追加せずともビルド時に外部からFeatureを追加することができます。
# ~/.zshrc または ~/.bashrc に追加
ndevcontainer_up () {
devcontainer up \
--additional-features='{"ghcr.io/jungaretti/features/ripgrep:1": {}, "ghcr.io/duduribeiro/devcontainer-features/neovim:1": {}}' \
--mount="type=bind,source=${HOME}/dotfiles/.config/nvim,target=/root/.config/nvim" \
--workspace-folder .
}
alias ndevup='ndevcontainer_up'このエイリアスを使うことでチーム共有の設定ファイルは変更せずに自分に必要な設定だけを追加できます。追加しているfeatureは2つあります。1つは当然Neovimです。もう一つはripgrepを追加しています。Neovimでファイル検索するにはripgrepを使用していますが、チーム共有の設定には入っているわけがないので追加します。ありがたいことにfeatureとして公開されているので、わざわざ手動で追加する必要もありません。
余談ですがNeovimのfeatureは2種類あります。ソースからビルドするかaptからインストールするかの違いなので、好みに合わせて選ぶといいと思います。
上記のように--additional-featuresオプションでFeatureを指定すれば、コンテナビルド時に自動でNeovimとripgrepがインストールされます。また、以下のようなエイリアスを設定しておいて起動できるようにしておくと便利かもしれません。
ndevcontainer_exec () {
devcontainer exec --workspace-folder . nvim
}
alias ndev='ndevcontainer_exec'XDG_CONFIG_HOMEとgit設定の衝突
私はXDG_CONFIG_HOME(~/.config)にgit設定を配置していましたが、チームの設定では~/.gitconfigと~/.gitignoreを前提としていました。チームの設定どおりに~/.gitconfigをマウントしようとすると、私のホスト側の環境にはそれらのファイルは存在しないため、ホスト側にディレクトリとして作成されてしまいます。そうするとホスト側でgitに依存したあらゆるプログラムでエラーを吐きまくります。こちらは素直に ~/.gitconfig にエイリアスを貼ることにしました。
さいごに
正直なところdevcontainerには不満も多いですが、チームで採用されている以上は付き合っていくしかありません。devcontainer-cliを使えば、VSCode以外のエディタでもdevcontainerを使えます。NeovimやripgrepのようなツールはFeaturesを使って外から追加できます。エイリアスやdotfilesで管理することで、チーム共有の設定ファイルに手を加えずに自分好みの環境を作れます。この方法なら、チームメンバー共通の環境を壊すことなく、好みのツールで開発できます。