Windowsホスト&VirtualBoxの共有フォルダー内でcomposerやnpmが動かない

VirtualBox ロゴ

いろいろ試して、WindowsホストでVirtualBoxの共有フォルダー機能は使ってはいけないという結論になりました。
なぜダメなのかと解決方法(代替案)を記事にしました。

composerやnpmが動かない

Windows環境でVirtualBoxやvagrantでLinux系OSを設定してゲストOS上でWebサーバーを構築してWebアプリを作るといった場合があるかと思います。その場合、ソースファイルをVirtualBoxの共有フォルダー機能を使ってホストOS上で簡単に扱えるようにすると便利です。
実際、そのように解説しているブログやサイトは結構あるのですが、実際ホストがWindowsの環境でやってみると謎のエラーが発生してcomposerやnpmでのインストールができない場合があります。

CakePHP4をcomposer経由でインストール

$ composer create-project --prefer-dist cakephp/app:4.* my_app_name
省略
 - Removing cakephp/plugin-installer (1.3.1)
    Install of cakephp/plugin-installer failed
  [RuntimeException]
  Could not delete /home/vagrant/code/my_app_name/vendor/cakephp/plugin-installer/src:

Laravelでnpm install

$ laravel new test
省略
$ cd test
$ npm install
省略
npm ERR! code ENOENT
npm ERR! syscall open
npm ERR! path /home/vagrant/code/test/node_modules/yargs/node_modules/yargs-parser/package.json.2689028738
npm ERR! errno -2
npm ERR! enoent ENOENT: no such file or directory, open '/home/vagrant/code/test/node_modules/yargs/node_modules/yargs-parser/package.json.2689028738'
npm ERR! enoent This is related to npm not being able to find a file.
npm ERR! enoent

ホストOSとの共有フォルダ下で実行するとこのように失敗するのに、共有フォルダ外で実行すると何の問題もなく成功します。
Laravelの方はよくわからないのですが(直接の問題はファイルがないということのようですが、なぜ存在しないのか不明)、Cakeの方はフォルダが削除できないというような理由かなと思います。

実践 Vagrant | Mitchell Hashimoto, Sky株式会社 玉川 竜司 |本 | 通販 | Amazon
AmazonでMitchell Hashimoto, Sky株式会社 玉川 竜司の実践 Vagrant。アマゾンならポイント還元本が多数。Mitchell Hashimoto, Sky株式会社 玉川 竜司作品ほか、お急ぎ便対象商品は当日お届けも可能。また実践 Vagrantもアマゾン配送商品なら通常配送無料。

原因

直接的な原因はよくわからないのですが、どうもホストOSとVMのゲストOSとでファイルやフォルダのパーミッションの扱いが違うために不具合が出るようです。
バージョン管理ソフトでパーミッションの変更や削除などを行うときに、仕様の違いから異常値が返ってしまい、停止してしまうことがあるようです。

VMでの開発環境の構築方法を紹介しているブログなどは結構あるのですが、ホストOSに関する情報は、書いていないか、Macを使っていることが多いような気がします。設定ファイルの記述方法を見ても、Linux系の書き方をしている場合が多いので、おそらくMacを使っているのだろうと予想されます。

 

解決策

いくつかの解決策(代替案)を考えてみます。

管理者権限で動かす

VirtualBoxやvagrantを管理者権限で起動すると解決するという内容を、いくつかのサイトで見ました。
ただ、実際やってみたのですが、少なくとも私の環境ではうまくいきませんでした。
そもそも、タスクマネージャで見る限り、VMは管理者権限で動いているように見えます。
うまくいかなかったのは何か別の要因が関係しているのかもしれませんが、一応試してみるのもよいかと思います。

また、共有フォルダのパスに日本語が含まれていると問題が出る場合があるらしいということも記載しておきます。
ホームディレクトリなどを指定した場合、ユーザー名がパスに乗ってしまうのですが、2バイト文字(全角文字)を使っていると問題が出るようです。

SMBでフォルダ共有

ゲストOSにSMBをインストールしてWindowsのファイル共有を利用してソースファイルのフォルダにアクセスする方法です。
共有フォルダはゲストOS内のフォルダになるので特に問題なく使えます。
ただし、パーミッションの扱いには注意が必要です。ファイルやフォルダをSMB経由で作成した場合、Webサーバーで読めないパーミッションになってしまうと正常に動作しませんので、SMBクライアントやHTTPサーバーのパーミッションに関する設定を理解して正しく設定しないと思わぬトラブルになる場合があります。

【改訂新版】サーバ構築の実例がわかるSamba[実践]入門 | 髙橋基信 | 工学 | Kindleストア | Amazon
Amazonで髙橋基信の【改訂新版】サーバ構築の実例がわかるSamba[実践]入門。アマゾンならポイント還元本が多数。一度購入いただいた電子書籍は、KindleおよびFire端末、スマートフォンやタブレットなど、様々な端末でもお楽しみいただけます。

rsyncなどで同期する

次に考えられるのがrsyncなどのファイル同期ソフトを使ってホストのフォルダと同期させる方法です。
設定がやや面倒なのと、こちらもパーミッションの問題でエラーになってしまう可能性はあるので、あまりお勧めはできませんが、検討には値します。

 

VSCode+RemoteSSHを使う

次は、エディタにVisualStudioCodeを使っている場合限定ですが、Remote SSHを使ってSSH経由でサーバーにログインしてフォルダを開く方法です。
Remote SSH
ファイルやフォルダを開くのが若干遅いですが、ローカルのフォルダを開いて作業するのとほぼ同じ感覚で使えます。

また、ターミナルもVSCode上から使えるので、別途接続せずにそのまま作業ができて非常に便利です。
使い方も直感的にすぐわかるレベルなので、他のエディターや統合環境を使っている人でもスムーズに移行できるかと思います。

VisualStudioCodeは近年非常に人気が高まっていますので、まだ使っていないひとはぜひ一度試してみることをお勧めします。拡張機能も非常に充実しており、入力補完もかなりサクサク動くのでコーディングスピードが上がること間違いなしです!

まとめ

今回、残念ながら問題の解決はできませんでした。
ただ、最後にご紹介したVisualStudioCode経由でアクセスする方法は非常にお勧めですので、ぜひ一度使ってみてください!

タイトルとURLをコピーしました