普段、Vimを使った開発を行っている中で、複数の開発プロジェクトを1つのVim環境でやっていくことが辛くなりもっと効率化できないかを常々考えてました。
例えばVSCodeにはRemote Container機能がありますが、それと同じような、プロジェクトごとに独立したワークスペースの中でVimでコーディングできないか、開発環境作りを模索しています。
ある程度方式が固まり落ち着いてきたので、共有 & 記録として投稿します。
求めたこと
自分の開発環境を作るにあたってこれらのことを必須要件として、開発環境を整備しました。
- 普段Macなので、Macで使えること
- プロジェクトごとに環境を分けられること
- プロジェクトごとで利用する開発言語のLanguage Serverを使用できること
- 各プロジェクトのリポジトリに何かこのためにファイル追加したりしないこと
- 使い捨てられること
作った開発環境
ソースコードはこちら。
ポイント
1. コンテナ上にVimを立てる
プロジェクトごとに環境を分けて独立させたいということで、コンテナでワークスペースを作るのがやはり良いと考えました。プロジェクトごとに作成し、また、不要になったらすぐに使い捨てられるようにしました。
開発時は、プロジェクトごとに作成されるワークスペース用のコンテナイメージを起動し、そのコンテナ内にソースコードのディレクトリをマウントしています。
2. 設定ファイルで初期設定
ワークスペース用にプロジェクトごとのコンテナイメージを作ります。そのビルドの際にプロジェクトに合わせた開発環境をセットアップするよう setup_config.json
というconfigファイルを指定するようにします。
configファイルには開発言語を指定するようになっており、例えばPythonプロジェクトであればそれを指定することでPythonの環境とLanguage Serverが入ります。
3. 言語のインストールや各種コマンドの管理はasdfで
「asdf」で全て管理するようにしています。
4. クリップボードをホスト環境と共有
X11で繋げば、コンテナ内のVim上でヤンクした内容をホスト側でペーストしたり、逆にホスト側でコピーした内容をコンテナ内のVim内にペーストできるようになります。なので、MacでXQuartzを立ち上げてVimを使用するようにしています。
参考:
https://blog.zoe.tools/entry/2017/07/24/220515
https://qiita.com/m-tmatma/items/944237003fc2d6182eca
https://qiita.com/fu-a-sak/items/1946c3b9f0e15d56e817
しばらく経つと共有できなくなることがあり、これがなぜなのか調査は必要。再度両方立ち上げ直したら有効化される。
いろいろな制約
今は自分のコーディング状況やプロジェクトの状況にフィットさせているため大きく問題はないですが、現状さまざまな制約があり、より柔軟な環境構築のために将来的には解消したいものがいくつかあります。
- vimrcは固定
- わたいのお手製のvimrcのみが利用可能となっている状況ですが、特定のプロジェクトでvimrcを変えるというケースにも対応しておきたい。
- 対応する開発言語が限られている
- 今はPythonやJavaScript、Go言語など、普段使うような言語のみ対応している状況。もう少し増やしたい
- 未対応の開発言語については、Language Serverが使えない状況
今後
一旦、今の形に落ち着いており、割といい形になったと個人的には思ってます。
ただ、今は各ワークスペースごとにコンテナイメージを作るようになっているためプロジェクトの数が増えるとその分イメージが作成され、ストレージが逼迫してしまいます。マルチステージビルドを使ってイメージ単体の軽量化は行ってはいますが、イメージの共通化などを進めたいです。
そして、Dev Containerを活用する手も考えましたが、少し複雑になる印象があったため、一旦避けました。もう少し理解深めてこれを活用することも考えていきたいですね。
完全に自前でこういうの作ってみましたが、すでにこういうのあるよーとか、ここはこうしたらいいとかアドバイスありますと嬉しいです。コメントお待ちしております。