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の方はフォルダが削除できないというような理由かなと思います。

https://amzn.to/2KZabWY

原因

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

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

 

解決策

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

管理者権限で動かす

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

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

SMBでフォルダ共有

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

【改訂新版】サーバ構築の実例がわかるSamba[実践]入門
(概要) 本書はSambaの基礎的な知識から,想定される具体的なシーン別のサーバ構築の実例を挙げて解説しています。前書から全面改訂を施し,最新Samba4.2/4.3に対応し,Ubuntu環境,Windows8.1/10の対応などの解説を追...

rsyncなどで同期する

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

 

VSCode+RemoteSSHを使う

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

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

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

まとめ

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

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