Windows
vagrant
npm

Windowsホスト上のVagrantの共有フォルダでnpmに失敗する問題の解決

More than 3 years have passed since last update.

問題

ホスト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

  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からシンボリックリンクを貼る