Windows+Vagrant環境で共有したディレクトリでnpmインストール時に発生する「text file is busy」のエラーを回避する方法

2018/10/08

環境

  • Windows 10
  • Vagrant 2.1.2
  • CentOS 7.4
  • Node.js 8.12
  • npm 6.4.1

※ NodeはCentOS環境にてインストール。

現象

開発はWindows環境で、その作業用ディレクトリを仮想マシン側にマウントさせることってあると思います。 そのマウントしているディレクトリ以下でnpm install実行するとエラーになります。 共有設定は以下のような感じ。
Vagrantfile

config.vm.synced_folder "./vue-develop", "/vue-develop"

npm installすると以下のエラーが発生します。

npm ERR! path /vue-develop/hoge/node_modules/aproba/package.json.3829397977
npm ERR! code ETXTBSY
npm ERR! errno -26
npm ERR! syscall rename
npm ERR! ETXTBSY: text file is busy, rename '/vue-develop/hoge/node_modules/aproba/package.json.3829397977' -> '/vue-develop/hoge/odules/aproba/package.json'

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/vagrant/.npm/_logs/2018-10-07T15_59_36_809Z-debug.log

以下で回避できるとの記事もありましたが、私の環境では解決せず。。

npm install --no-bin-links

色々試した結果、2パターンありました。

方法1. Windows上でnpm installする

一番簡単な方法はこちら。
Windows用のNodeをインストールしホストのWindows上でnpmコマンドを実行すればいいだけです。

方法2. 共有方式をnfsへ変更する

今回の本題はこちら。 私はなるべく環境をゲストOS側に押し込めたい!

1.Vagrantのnfs用プラグインをインストール

vagrant plugin install vagrant-winnfsd
vagrant plugin update

2.Vagrantfile内の共有設定部にnfsを指定する

config.vm.synced_folder "./vue-develop", "/vue-develop"
   ↓
config.vm.synced_folder "./vue-develop", "/vue-develop", type: "nfs"

3.リロード

vagrant reload

以上です。