187 votes

Erreurs d'installation de npm avec Error : ENOENT, chmod

J'essaie d'installer globalement un module npm que je viens de publier. Chaque fois que j'essaie d'installer, que ce soit à partir de npm ou du dossier, j'obtiens cette erreur.

npm ERR! Error: ENOENT, chmod '/usr/local/lib/node_modules/takeapeek/lib/cmd.js'
npm ERR! If you need help, you may report this log at:
npm ERR!     <http://github.com/isaacs/npm/issues>
npm ERR! or email it to:
npm ERR!     <npm-@googlegroups.com>

npm ERR! System Linux 3.8.0-19-generic
npm ERR! command "node" "/usr/local/bin/npm" "install" "-g" "takeapeek"
npm ERR! cwd /home/giodamlio
npm ERR! node -v v0.10.6
npm ERR! npm -v 1.3.6
npm ERR! path /usr/local/lib/node_modules/takeapeek/lib/cmd.js
npm ERR! code ENOENT
npm ERR! errno 34
npm ERR! 
npm ERR! Additional logging details can be found in:
npm ERR!     /home/giodamlio/npm-debug.log
npm ERR! not ok code 0

J'utilise sudo et j'ai vérifié trois fois tout ce qui se trouve dans le paquet, tout devrait fonctionner. J'ai fait quelques recherches et j'ai vu quelques cas similaires dont aucun n'a été résolu. Voici ce que j'ai essayé.

  • Mettre à jour npm ( sudo npm install -g npm )
  • Effacer le cache global de npm ( sudo npm cache clear )
  • Effacer le cache npm de l'utilisateur ( npm cache clear )

J'ai remarqué que l'erreur avait à voir avec le fichier que je lie au chemin, en particulier lorsque npm a essayé de faire un chmod. Cela ne devrait pas être un problème, mon lib/cli.js a des permissions normales, et npm a des permissions de superutilisateur pendant cette installation.

Après avoir fouillé dans la documentation de npm, j'ai trouvé une option qui empêcherait npm de créer les liens bin( --no-bin-links ), quand j'ai essayé de l'installer avec, ça a bien marché.

Alors, qu'est-ce qui se passe ? Est-ce que c'est un bogue de cas de frange bizarre qui n'a pas encore de solution ?

Edit : Pour référence, ici est le module que j'ai téléchargé

0 votes

Votre paquet utilise-t-il node-gyp ? Je pense que l'appel no-bin-links est lié si c'est le cas.

0 votes

Non, pas de code natif dans le module. Ici est la source du module de référence.

1 votes

Le site --no-bin-links empêche simplement npm d'établir des liens symboliques avec des fichiers dans le fichier package.json. bin au chemin de l'installation globale.

180voto

badsyntax Points 4441

Ok, il semble que NPM utilise votre .gitignore comme base pour le .npmignore et ignore donc /lib . Si vous ajoutez un .npmignore dans la racine de votre application, tout devrait fonctionner.

Une meilleure approche, plus explicite, consiste à utiliser une liste d'autorisations plutôt qu'une liste de refus, et à utiliser le champ "files" dans package.json pour spécifier les fichiers de votre paquet.

[edit] - plus d'informations sur ce comportement ici : https://docs.npmjs.com/misc/developers#keeping-files-out-of-your-package

0 votes

Mince, ça doit être ça. Il semble que cette façon de faire soit un peu confuse. Je ne suis pas devant un ordinateur pour le moment, mais je vais essayer dans quelques heures.

0 votes

Oui, ça m'a pris du temps pour le découvrir. Des gars plus expérimentés que moi l'ont suggéré sur le fil Reddit.

0 votes

J'ai testé ceci en utilisant votre dépôt et en installant localement en utilisant npm install ../takeapeek et l'ajout du fichier vide .npmignore fonctionne.

131voto

FrozenFlame Points 962

J'ai rencontré un problème similaire,

npm cache clean

l'a résolu.

29 votes

J'ai essayé npm cache verify et ça a marché. Merci pour l'astuce.

3 votes

À partir de npm@5, le cache de npm se guérit lui-même des problèmes de corruption et la validité des données extraites du cache est garantie. Si vous voulez vous assurer que tout est cohérent, utilisez plutôt 'npm cache verify'. D'un autre côté, si vous déboguez un problème avec l'installateur, vous pouvez utiliser npm install --cache /tmp/empty-cache pour utiliser un cache temporaire au lieu de détruire le cache actuel.

16voto

user1978019 Points 222

Ce problème s'est posé pour moi sur Mac lorsque j'ai essayé d'exécuter npm install -g bower . Il me donnait un certain nombre d'erreurs pour ne pas être capable de trouver des choses comme graceful-fs. Je ne suis pas sûr de la façon dont j'ai installé npm à l'origine, mais il semble qu'il soit peut-être arrivé avec node en utilisant homebrew. J'ai d'abord exécuté

brew uninstall node

Cela a permis de supprimer les deux node et npm de mon chemin. A partir de là, je l'ai réinstallé

brew install node

Quand il s'est terminé, j'ai eu node et npm sur mon chemin et j'ai pu courir

rm -rf ~/.npm
npm install -g bower

Cela a ensuite installé bower avec succès.

La mise à jour des formules de brassage et la mise à niveau des installations n'ont pas semblé fonctionner pour moi, je ne sais pas pourquoi. La suppression de la .npm Le dossier était quelque chose qui avait fonctionné pour d'autres personnes, et je l'avais essayé sans succès. Je l'ai fait cette fois-ci, juste au cas où. Notez également qu'aucune des solutions suivantes n'a résolu le problème pour moi, bien qu'elles l'aient fait pour d'autres :

npm cache clean
sudo npm cache clean

2voto

leeway Points 376

Je pense que votre café compilé script est absent du paquet npm publié. Essayez d'écrire un prépublier commandement.

0 votes

Non, le dossier lib était là quand je l'ai publié. D'ailleurs, j'obtiens la même erreur lorsque j'essaie d'installer à partir du dossier local. Même si le dossier lib est là.

1 votes

@giodamelio Je suis d'accord avec Ryan sur ce point. L'erreur dit takeapeek/lib/cmd.js n'existe pas. Même si le dossier lib est "là" lorsque vous publiez, il ne sera pas "là" lorsque vous installerez via npm, à moins qu'il ne fasse partie du référentiel ou que vous n'utilisiez prepublish pour le créer.

2voto

paperclip Points 11

Dans mon cas (code multiple ENOENT errno 34) le problème était avec ~/.npm/ accès au répertoire. A l'intérieur, il y avait des sous-répertoires ayant root:root qui causaient des problèmes lorsque j'exécutais des commandes en tant qu'utilisateur normal (sans droits d'accès). sudo ). J'ai donc changé la propriété de tous les sous-répertoires et fichiers à l'intérieur de ~/.npm/ dir dans mon utilisateur et groupe local. Cela a fait l'affaire sur mon Ubuntu (sur Mac cela devrait fonctionner aussi).

$ sudo chown yourusername.yourgroupname ~/.npm/ -R

Tu devrais connaître ton nom d'utilisateur, non ? Si non, lancez $ whoami et remplacez le nom de votre groupe par celui-ci, comme ceci :

$ sudo chown johnb.johnb ~/.npm/ -R

EDIT :

Cas de test :

Depuis mon compte local /home/johnb J'ai installé globalement un générateur de NPM pour yeoman comme ceci :

$ sudo npm install -g generator-laravel

Nature du problème :

L'action ci-dessus a provoqué l'installation de certaines dépendances dans ~/.npm/ dir, ayant root:root propriété (en raison de sudo ... ). De toute évidence, npm ne s'exécute pas en tant qu'utilisateur local (et ne change pas la propriété des sous-répertoires de dépendances par la suite) lorsqu'il extrait des dépendances et les écrit dans un sous-répertoire d'utilisateur local. ~/.npm/ . Tant que npm sera aussi peu attentif aux questions fondamentales de sécurité des systèmes de fichiers Unix, le problème se reproduira.

Solution :

  1. Vérifiez continuellement si ~/.npm/ contient des sous-répertoires dont la propriété (et/ou les permissions) est différente de celle de votre compte d'utilisateur local, en particulier lorsque vous installez ou mettez à jour quelque chose à l'aide de la commande sodo (Racine). Si c'est le cas, changez la propriété à l'intérieur de ~/.npm/ à un utilisateur local de manière récursive.

  2. Demandez à npm, bower, grunt, ... communauté qu'ils abordent cette question comme je l'ai décrit ci-dessus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X