23
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

IntelliJで開発時に、SFTPで高速なファイル同期によるディスク共有をする

Last updated at Posted at 2015-10-06

概要

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 に書きます。

/etc/rc.local
mount -t vboxsf workspace /mnt/workspace

このディレクトリは、あくまでもVM上からWindowsのファイルを操作する事が目的です。IntelliJで開発中のコードを直で確かめたり git pullしたりする時に利用します。
コンパイルしたりビルドしたり実行したりするディレクトリではありません。

SFTP同期をする

IntelliJにはSFTP同期機能があるので、これを利用します。

メニューより、[Tools] -> [Deployment] -> [Configuration] を開きます。

以下のようにVM上の同期したいディレクトリを設定します。

image

image

完了したら、「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

でインストールはサクッとやりましょう。
この状態で、

  1. tmux コマンドでtmuxを起動
  2. [C-b] ["] で、画面分割
  3. それぞれの画面でcd workspace1, cd workspace2 をして同期したいディレクトリを開きます。ウィンドウ移動は [C-b] [o] です。
  4. 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を使って同期するのが無難だと思います。

23
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?