問題
ホストOSはWindows,仮想マシンはLinuxでVagrantの共有フォルダをそのまま作業フォルダ(プロジェクトルート)にしている.
この作業フォルダを/mnt/project
とする.
cd /mnt/project
npm init
npm install <some package>
とかやるとエラーになる.
エラーの原因は
http://eiua-memo.tumblr.com/post/117361529158/npm-vagrant-vagrant-npm
に考察があるとおり,
- VirtualBoxの共有フォルダではシンボリックリンクの作成が禁止されている
-
--no-bin-links
オプションでシンボリックリンクの作成を回避しても,パスの長さがホストOS(Windows)の制限に引っかかってファイルを作成できないと言われる-
Permissionエラーが出て,rootで実行しろと言われる.rootで実行しても同じPermissionエラーになるので,最初は混乱した.
- ↓例えば
npm install webpack
したら,こんなの
- ↓例えば
-
npm ERR! Linux 2.6.32-431.el6.x86_64
npm ERR! argv "/home/vagrant/.nvm/versions/node/v0.12.7/bin/node" "/home/vagrant
/.nvm/versions/node/v0.12.7/bin/npm" "install" "webpack"
npm ERR! node v0.12.7
npm ERR! npm v2.11.3
npm ERR! path /mnt/project/node_modules/webpack/node_modules/watchpack/node_modu
les/chokidar/node_modules/anymatch/node_modules/micromatch/node_modules/braces/n
ode_modules/expand-range/node_modules/fill-range/node_modules/randomatic/package
.json.da1e639d20f3c4cf3eae17544a0d3871
npm ERR! code EPERM
npm ERR! errno -1
...
# 対策
共有フォルダ`/mnt/project`でシンボリックリンクを張れるよう設定し,
`/mnt/project/node_modules`を共有フォルダの下にないディレクトリを指すシンボリックリンクにする.
ホストがWindowsだと,シンボリックリンクを許可したところでパス長の制限に引っかかるので,
`node_modules`をWindowsファイルシステムが見えないところに移すようにした.
## 方法
http://qiita.com/fagai/items/82e3e660ebf3702e782a
を参考にさせていただいた.
`Vagrantfile`に
```rb
config.vm.provider :virtualbox do |vb|
vb.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate//mnt/project","1"]
end
を追記する.(/mnt/project
の部分は環境に合わせて変える)
また,管理者権限のプロンプトで
fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1
を実行する.
(これはページによって書いてあったりなかったりなので必要かはわからない.色々やっていたらできたので)
既にvagrantが立ち上がっている場合は,管理者権限で起動したプロンプトからプロビジョニングしなおす(vagrant reload --provision
)
VirtualBoxにシンボリックリンクを許可しても,Windowsは管理者権限でしかシンボリックリンクを作れないので,管理者権限でvagrantを起動する必要がある.
最後に,/mnt/project
の下でない適当な場所にnode_modules
ディレクトリを作成し,/mnt/project
からシンボリックリンクを貼る