Exécution de `grunt` sur le répertoire partagé de la VM

En utilisant Vagrant avec un hôte Windows et un invité Linux, grunt renvoyé l’erreur suivante lors de la tentative d’exécution d’un travail.

Si j’ai bien compris, ce chemin de fichier dépasse la limite de 255 caractères de Windows sur un répertoire partagé hôte-invité.

 npm ERR! Error: EPERM, open '/u01/aa/bb/build/share/app-core/app- ui/node_modules/grunt-consortingb-imagemin/node_modules/pngquant-bin/node_modules/bin- wrapper/node_modules/download/node_modules/request/node_modules/form- data/node_modules/combined-stream/test/integration/test-delayed-streams-and-buffers- and-ssortingngs.js' 

Je pourrais développer sur un répertoire non partagé sur ma machine virtuelle invitée, mais je préférerais utiliser un répertoire partagé car j’utilise un IDE sur l’hôte.

Comment puis-je résoudre ce problème afin de pouvoir exécuter grunt sur le répertoire partagé?

J’ai rencontré un problème similaire en utilisant mon générateur angular. La solution que j’ai trouvée en ce moment est un petit truc exploitant la manière dont npm gère ses dépendances et sa structure de dossiers .

Veuillez considérer que le problème que vous rencontrez n’affecte probablement que quelques fichiers (et probablement uniquement le module imagemin).

Pour Yeoman, ma solution consistait d’abord à générer, en ignorant l’installation lancée automatiquement:

 yo angular appname --skip-install 

Démarrer l’installation de la tondeuse manuellement:

 bower install 

À partir de là, cela devrait vous intéresser: Installez le module npm “request” en tant que module de premier niveau (au lieu d’une dépendance profondément résolue dans imagemin plus tard):

 npm install request --save-dev 

Donc, si vous exécutez maintenant l’installation npm standard pour récupérer les modules restants, le module de demande déjà existant est utilisé.

 npm install --no-bin-links 

Veuillez noter que l’utilisation de --no-bin-links est également une bonne idée si vous ne souhaitez pas exécuter VirtualBox en tant qu’administrateur .

Donc, pour répondre à votre question. En cours d’exécution grunt devrait fonctionner si vous configurez correctement vos paquets et appelez npm install avant. Le module “request” est un module arbitraire qui empêche le gros chemin du fichier test-delayed-streams-and-buffers-and-ssortingngs.js .

Si vous utilisez le type de dossier synchronisé par défaut de vboxsf , vous pouvez utiliser le nouveau dossier synchronisé basé sur rsync pour contourner le problème.

rsync type rsync surveillera les dossiers entre l’hôte et l’invité, copiera les répertoires de fichiers pour les maintenir synchronisés.

La différence entre vboxsf et rsync par défaut est que ce dernier provoquera l’exécution de l’application Linux (grunt dans votre cas) à partir de son système de fichiers natif (par exemple ext4 ) au lieu de vboxsf (fourni par VirtualBox Guest Additions). sur Windows).

rsync dossier synchronisé rsync utilise essentiellement l’utilitaire rsync CLI pour copier / synchroniser les fichiers et les répertoires entre les hôtes. Donc, il y a 2 copies de tout. Lorsque vous exécutez votre grunt contre le système de fichiers de l’invité, il s’agit d’un système de fichiers Linux natif qui ne devrait pas être affecté par un long chemin (mais ext4 ne possède pas une longueur de fichier maximale de 255 octets).

Par défaut, Vagrant ne synchronise que les dossiers sur le vagrant reload ou vagrant reload . Mais vous pouvez exécuter vagrant rsync pour forcer manuellement la synchronisation ou le vagrant rsync-auto pour surveiller les changements et la synchronisation en temps réel.

Référence: http://docs.vagrantup.com/v2/synced-folders/rsync.html

Vous pouvez définir le type de dossier synchronisé sur rsync dans votre Vagrantfile ci-dessous

 Vagrant.configure("2") do |config| config.vm.synced_folder ".", "/vagrant", type: "rsync", rsync__exclude: ".git/" end 

Mettre à jour

Testé lors de la création de l’arborescence de répertoires et d’un fichier, pas de problème pour l’ouvrir depuis une perspective Linux, le système de fichiers est ext4. Je pense que c’est un problème avec npm.

 terry@arch:/$ uname -a Linux arch.apac.lab 3.14.1-1-ARCH #1 SMP PREEMPT Mon Apr 14 20:40:47 CEST 2014 x86_64 GNU/Linux terry@arch:/$ cat /u01/aa/bb/build/share/app-core/app-ui/node_modules/grunt-consortingb-imagemin/node_modules/pngquant-bin/node_modules/bin-wrapper/node_modules/download/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-delayed-streams-and-buffers-and-ssortingngs.js test 

Mise à jour – test du dossier synchronisé rsync

J’ai fait le test précédent sur une installation physique Linux. Ce qui suit est un test rapide sur Mac, invité est le même que ci-dessus.

Configuration du dossier synchronisé rsync

 config.vm.synced_folder ".", "/u01/aa/bb/build/share/app-core/app-ui/ node_modules/grunt-consortingb-imagemin/node_modules/pngquant-bin/node_modules/bin- wrapper/node_modules/download/node_modules/request/node_modules/form-data/ node_modules/combined-stream/test/integration", type: "rsync 

NOTE: Je chown -R vagrant:vagrant /u01/ récursivement au préalable pour éviter les problèmes de permission lors de la synchronisation.

synchro sur vagrant up

 $ vagrant up Bringing machine 'default' up with 'virtualbox' provider... ==> default: Clearing any previously set forwarded ports... ==> default: Clearing any previously set network interfaces... ==> default: Preparing network interfaces based on configuration... default: Adapter 1: nat ==> default: Forwarding ports... default: 22 => 2222 (adapter 1) ==> default: Running 'pre-boot' VM customizations... ==> default: Booting VM... ==> default: Waiting for machine to boot. This may take a few minutes... default: SSH address: 127.0.0.1:2222 default: SSH username: vagrant default: SSH auth method: private key default: Warning: Connection timeout. Retrying... default: Warning: Connection timeout. Retrying... default: Warning: Connection timeout. Retrying... ==> default: Machine booted and ready! ==> default: Checking for guest additions in VM... ==> default: Rsyncing folder: /ops/arch64/ => /u01/aa/bb/build/share/app-core/app-ui/node_modules/grunt-consortingb-imagemin/node_modules/pngquant-bin/node_modules/bin-wrapper/node_modules/download/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration ==> default: Mounting shared folders... default: /vagrant => /ops/arch64 ==> default: VM already provisioned. Run `vagrant provision` or use `--provision` to force it $ vagrant ssh Last login: Sun Apr 27 10:36:10 2014 from 10.0.2.2 vagrant@archlinux:~$ cd /u01/aa/bb/build/share/app-core/app-ui/node_modules/grunt-consortingb-imagemin/node_modules/pngquant-bin/node_modules/bin-wrapper/node_modules/download/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration vagrant@archlinux:/u01/aa/bb/build/share/app-core/app-ui/node_modules/grunt-consortingb-imagemin/node_modules/pngquant-bin/node_modules/bin-wrapper/node_modules/download/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration$ ls -l total 12 -rw-r----- 1 vagrant vagrant 14 Apr 27 10:35 test-delayed-streams-and-buffers-and-ssortingngs.js -rw-r----- 1 vagrant vagrant 5018 Apr 27 10:22 Vagrantfile vagrant@archlinux:/u01/aa/bb/build/share/app-core/app-ui/node_modules/grunt-consortingb-imagemin/node_modules/pngquant-bin/node_modules/bin-wrapper/node_modules/download/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration$ cat test-delayed-streams-and-buffers-and-ssortingngs.js stackoverflow 

Le résultat est le même. Comme mentionné précédemment, je soupçonne que cela peut être un problème npm.

Pour une solution concrète à cela, consultez ce commentaire ou continuez à lire ici:

 config.vm.provider "virtualbox" do |v| v.customize ["sharedfolder", "add", :id, "--name", "www", "--hostpath", (("//?/" + File.dirname(__FILE__) + "/www").gsub("/","\\"))] end config.vm.provision :shell, inline: "mkdir /home/vagrant/www" config.vm.provision :shell, inline: "mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` www /home/vagrant/www", run: "always" 

Dans le code ci-dessus, j’ajoute \\? \ Au chemin absolu du répertoire en cours. Cela forcera l’API Windows à autoriser une augmentation de la variable MAX_PATH (normalement limitée à 260). En savoir plus sur le chemin max . Cela se produit pendant la création du dossier partagé qui est intentionnellement géré par VBoxManage et non par la méthode “synced_folder” de Vagrant. Le dernier morceau est assez explicite; Nous créons le nouveau dossier partagé et nous nous assurons qu’il est monté chaque fois que la machine est accédée ou touchée, car Vagrant aime recharger ses dossiers montés / partagés sur chaque chargement.

J’espère que ça aide!