概要
WindowsでIntelliJ IDEAで開発をしたい。でもVirtual Box 上に構築したLinux環境を開発環境としたい といったケースにオススメ。
VirtualBoxには、共有ディレクトリ機能があり、ホストOSとゲストOSのディスク共有は出来ます。
欠点としては、共有ディレクトリのファイル容量が増えるほどディスクスピードが落ちます。
まじで遅い!!! 遅すぎる!!!
どのくらい遅いかというと、コンパイル時間が10倍になりました。
という事で、こんな劣悪環境のディスクで開発なんかやってられないので、対策をします。
なお、WindowsのIntelliJでネットワークドライブを使うとプチフリーズしまくりで使い物になりません。
つまりsambaは使えませんでした。。。orz
このページでは目標として、以下が達成できることとします。
- Windowsで、IntelliJで、コーディングして開発する。
- VM内コーディング用ディレクトリを作る
- mount でWindowsファイルをVMで操作できるようにするディレクトリです。
- VM内実行・テスト・操作用ディレクトリを作る
- VM内で、Linux用バイナリを実行したりshを走らせるディレクトリです。
- VM内で、コーディング用ディレクトリと、実行・テスト・操作用ディレクトリを同時に操作できるようにする
なぜディレクトリを2つに分けるかというと、ディスク速度(コンパイル速度)に大きな差があるからです。
WindowsファイルをVMで操作できるリポジトリはディスク共有のため、ディスク速度が非常に遅くなります。
そのため、コンパイルするディスクは共有しないディレクトリを作ります。が、いちいち手動でコピーするのは大変なので自動でファイル同期が走るようにします。
共有フォルダの設定をする
同期をするとはいっても、Windows上のファイルを全くVMで使えないのは面倒です。
なので、VirtualBoxの設定から共有フォルダを指定し、mountしましょう。
VM立ち上げ時に自動でmountするようにします。設定は、/etc/rc.local に書きます。
mount -t vboxsf workspace /mnt/workspace
このディレクトリは、あくまでもVM上からWindowsのファイルを操作する事が目的です。IntelliJで開発中のコードを直で確かめたり git pullしたりする時に利用します。
コンパイルしたりビルドしたり実行したりするディレクトリではありません。
SFTP同期をする
IntelliJにはSFTP同期機能があるので、これを利用します。
メニューより、[Tools] -> [Deployment] -> [Configuration] を開きます。
以下のようにVM上の同期したいディレクトリを設定します。
完了したら、「Sync」を実行し、初めの同期をしてみましょう。無事にファイルが同期されたら成功です。
しかし、毎回手動ではやりたくないので、自動で同期が走るようにします。
[Tools] -> [Deployment] -> [Automatic Upload(always)] にチェックを入れると、
コード変更がある度に自動的に同期が走るようになります。(素晴らしい!)
tmuxで同時にファイルを扱う
基本的にはこれまでの動作で同期は完了していますが、
Windowsのディレクトリをmountしたディレクトリと、IntelliJでSFTP同期をしているディレクトリの、両方のディレクトリをいじる必要がある事は割と多いです。
例えば、「git pull をして最新のコードを取得する」という場合です。
cd workspace1; git pull; cd workspace2; git pull
みたいな事を毎回やるのは面倒臭すぎます。
そこでtmuxのコマンド同期を使います。
sudo yum -y install tmux
でインストールはサクッとやりましょう。
この状態で、
-
tmux
コマンドでtmuxを起動 - [C-b] ["] で、画面分割
- それぞれの画面でcd workspace1, cd workspace2 をして同期したいディレクトリを開きます。ウィンドウ移動は [C-b] [o] です。
-
tmux set-window-option synchronize-panes
でコマンド同期をします。
これで上と下の2画面で同時に操作が出来ます。(素晴らしい!)
コーディング用ディレクトリと、実行用ディレクトリに差異が出てしまった!
SFTP 同期をしているディレクトリ上で何かファイル変更を行っても、VM上のディレクトリに反映はされません。
#! /bin/bash
\cp -f ~/workspace2/$1 ~/workspace1/$1
のようなファイルをbin に置いて、workspace2上で
git st | sed -e "s/modified:/sync_workspace/" | grep sync | sh
のように実行すると、workspace2のgit差分があるファイルがworkspace1 にコピペされます。
正直かなりの手抜きなので、これ以上頑張りたいなら、rsyncやlsyncを使って同期するのが無難だと思います。