明けましておめでとうございます。本年もよろしくお願いいたします。早いもので前回投稿してから丸一年放置してしまいました(苦笑) ありがたいことにまだ検索で訪れてくれる方がいるみたいですし、今年は更新していきたいと思います。
Web 開発界隈は私の観測範囲では結構 Mac 派の方が多いですが、最近 Windows を使い始めたという記事を続けて見かけたので、ずっと Windows 環境で開発を続けてきた Windows 派の私の環境についてもちょっと書いてみたいと思います。ちなみに今の職場は周りは全員 Mac です。
以前win-sshfs の記事を書いたりしましたが、最近は使わなくなっています。最近は Docker を使うことが多いですが、この方法は Docker でも単純な仮想環境でもどちらでも対応可能です。加えて言うと、別に Windows じゃなくて Mac でも可能です(笑) ただし IntelliJ IDEA かあるいは RubyMine 等の JetBrains 製の IDE にある deployment 機能ありきのものです。類似の機能があれば他の IDE でも対応可能かと思いますが、ご了承ください m(_ _)m
ちなみに私の現在の開発環境はホストは Windows 10 Pro で、ゲストとして仮想環境(VirtualBox)に Ubuntu18.04 を使っています。更にその上に Docker を動かしていて、そこで Rails を走らせています。
何故マウントしないのか
上でも触れましたが、私は過去に sshfs や、更に前は samba や仮想環境独自のマウント機能を使ってマウントしたりしてきました。ただそれぞれ問題がありました。共通しているのはディスクアクセスが遅くなることです。それがホスト側で問題になること、ゲスト側で問題になること、両方ありました。
色々悩んだ結果、ソースコードはそれぞれの環境で別々に持った方が速度的に問題なくなるということになったのですが、それはそれで今度はソースコードの不整合が発生することになります。
それを対処するために rsync みたいな sync 機能があればいいなと考えていたのですが、IntelliJ IDEA が便利な deployment 機能を搭載していてくれたおかげで簡単に実現できました。今回紹介する方法はその機能を使った方法ですが、これも上で書いたとおり類似した機能があれば何でも実現可能です。
現在の大まかな構成

ホスト上とゲスト上両方にソースコードを置くことになるのがこの構成の特徴です。Docker を使う場合は仮想環境上で動かし、仮想環境上のソースコードを置いたディレクトリを Docker にマウントすることで対応します。Docker が仮想環境上のファイルを見る分には特にディスクアクセスの速度に問題は起こっていません。コマンドラインから立ち上げる時は-v オプション、docker-compose.yml で設定する場合は volumes で設定する感じですね。
まずホストからゲストと繋げるために SSH が繋げるようにしておきます。これは個人的に SSH を導入するのが一番楽だったり、その他開発する上で便利かと思って使っていますが、FTP を使っても対応可能です。
続いてホストとゲストそれぞれの環境で git clone しておきます。その方が改行コードの問題とか起こりづらいです、多分。
その後 IntelliJ IDEA の deployment 機能を使います。「Tools > Deployment > Configuration」から設定します。ホスト環境とゲスト環境のそれぞれのコードの置き場を設定すれば、初期設定は完了です。ついでに Excluded Paths タブでホスト環境の.idea ディレクトリと、ゲスト環境の tmp ディレクトリ、log ディレクトリを指定しておけば大まかに大丈夫かと思います。
ここまで設定すれば実際 deployment ツールを実行することが出来るはずです。実行して問題が無ければ設定成功です。最後に「Tools > Deployment > Automatic Upload (always)」を選択すれば、上書き保存する度に勝手にアップロードされます。多分これだけで設定完了です。便利!簡単!
注意点
上記までで一通り使えるようになったかと思いますが、少し注意点があります。
まず気をつけれなければいけないことは、deployment 機能は万能ではないということです。上書き保存時にアップロードしてくれますが、ゲスト側で新規にファイルを作ってもホスト環境にダウンロードしてくれません。rails g 等でゲスト側でファイルを作成した後には手動で同期を行う必要があります。私は Settings の Keymap で「Sync with Deployed to…」を設定して、すぐに deploy メニューを呼び出せるようにしています。
それからホスト側の文字コードや改行コードにも、特に Windows では気をつける必要があります。Windows 上でテキストファイルを新規作成すると改行コードは CRLF になってしまいます。IDE の設定で LF に設定しておくのが無難で、且つファイル作成は IDE から行うように徹底しておいた方が良いと思います。
あとファイル権限周りは同期に失敗する原因になります。特に Docker を使っていると仮想環境と Docker でユーザが違ったりして、ファイルを新規作成する時に毎回設定する必要があったりします。まぁそこら辺は慣れれば毎回意識して設定出来るかと。ちなみに私は常にホスト側で git commit, push するようにしています。
まとめ
私の Windows と仮想環境を使った開発環境の構成を紹介しましたが、完全に我流の構成です。Windows と仮想環境を使ってどうやって Web(Rails)開発が楽に出来るかとあれこれ試行錯誤した結果ではあるものの、これよりも便利に開発できる方法があるかもしれないので、これがベストだと主張するつもりもありません。
Mac でもまったく同じことが出来るので、個人の趣味嗜好で環境を選択できれば良いんじゃないかなと思います。アプリと違って Web 開発はあまり OS に縛られないのが楽なところかと思います。私は以前 Mac を買って使ってみたものの肌に合わなかったので、今後もしばらくは Windows 環境でやっていけたらと思います。