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!