Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
64
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

@whitphx

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

問題

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
64
Help us understand the problem. What are the problem?