問題
Windows版のvagrantでproviderをvirtualboxにした場合、共有フォルダにはシンボリックリンクを作成することができません。そのため、npmやbundler、composer等でパッケージを導入する際、シンボリックリンクを作成するようなパッケージが依存関係に含まれていると導入できずに困るケースがあります。これについては、
- 共有フォルダでシンボリックリンクを有効にする(https://qiita.com/tuttieee/items/ab9b198cd2aaccb446ff)
- vagrant-winnfsdを利用する(https://qiita.com/fagai/items/9d491c139298e6f6e527)
- npm、bundlerの導入先を別ディレクトリにする
など、いくつか解決方法があるようですが、プラグインの導入が必要だったり、Windowsの管理者権限での操作が必要だったりちょっと面倒だなと感じていました。
mount --bindを使った解決方法
最初に挙げたリンク先のコメントで
こちらの記事を知ったのですが、この方法をベースにVagrantfileの記述のみで共有フォルダの下にゲストマシンの特定ディレクトリをマウントすることができます。
設定例
共有フォルダ:
/home/vagrant/webroot
のnode_modules以下をゲストマシンの/home/vagrant/mount_point/node_modulesにマウントする場合、以下のようにVagrantfileを編集します。
Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
# ..中略.. #
config.vm.synced_folder "./", "/home/vagrant/webroot"
config.vm.provision :shell,
inline: "mkdir -p /home/vagrant/mount_point/node_modules"
config.vm.provision :shell,
inline: "mount --bind /home/vagrant/mount_point/node_modules /home/vagrant/webroot/node_modules",
run: "always"
# 実際のprovisonはmountの後に記述します
# ..中略.. #
end