L'installation de Npm a échoué avec "impossible de s'exécuter dans wd"

153

J'essaie de configurer mon environnement de nœud sur une nouvelle instance d'Ubuntu 12.04, avec le nœud 0.8.14 déjà installé, mais j'ai rencontré des problèmes lorsque j'essaie de courir npm install. Donc, quand j'essaye npm install, cela dit que je dois l'exécuter en tant que root ou administrateur:

Error: EACCES, mkdir '/usr/local/lib/node_modules/coffee-script'
npm ERR!  { [Error: EACCES, mkdir '/usr/local/lib/node_modules/coffee-script']
npm ERR!   errno: 3,
npm ERR!   code: 'EACCES',
npm ERR!   path: '/usr/local/lib/node_modules/coffee-script',
npm ERR!   fstream_type: 'Directory',
npm ERR!   fstream_path: '/usr/local/lib/node_modules/coffee-script',
npm ERR!   fstream_class: 'DirWriter',
npm ERR!   fstream_stack: 
npm ERR!    [ 'DirWriter._create                 (/usr/local/lib/node_modules/npm/node_modules/fstream/lib/dir-writer.js:36:23)',
npm ERR!      '/usr/local/lib/node_modules/npm/node_modules/mkdirp/index.js:37:53',
npm ERR!      'Object.oncomplete (fs.js:297:15)' ] }
npm ERR! 
npm ERR! Please try running this command again as root/Administrator.

Mais lorsque vous essayez de l'exécuter en tant que sudo, cela dit:

npm WARN cannot run in wd PackNodeDev@0.0.1-166 npm install -g coffee-script node-gyp (wd=/home/ubuntu/PackNode)

Dans mon package.json, il contient les scripts suivants:

"scripts": {
    "preinstall": "npm install -g coffee-script node-gyp",
    "start": "node server.js",
    "test": "mocha --require should --compilers coffee:coffee-script --colors"
 },

Le reste des dépendances de développement est valide depuis que je l'ai installé sur ma propre machine (Mac) Quelqu'un a-t-il une idée de pourquoi cela se produit?

EH
la source

Réponses:

231

La documentation dit (également ici ):

Si npm a été appelé avec les privilèges root, alors il changera l'uid en compte d'utilisateur ou en uid spécifié par la userconfiguration, qui par défaut est nobody. Définissez l' unsafe-permindicateur pour exécuter des scripts avec les privilèges root.

Vos options sont:

  1. Courez npm installavec le --unsafe-permdrapeau:

    [sudo] npm install --unsafe-perm
  2. Ajoutez le unsafe-permdrapeau à votre package.json:

    "config": {
        "unsafe-perm":true
    }
    
  3. N'utilisez pas le preinstallscript pour installer les modules globaux, installez-les séparément, puis exécutez le script normal npm installsans privilèges root:

    sudo npm install -g coffee-script node-gyp
    npm install
    

Connexes :

Dmitry Pashkevich
la source
2
Désolé, je n'ai pas vu ça jusqu'à maintenant. J'ai essayé le "unsafe-perm" avant mais cela n'a pas fonctionné non plus. Le problème existe toujours
EH
10
Cela fonctionne pour moi: sudo npm install --unsafe-permmais sudo npm installpas, bien que j'ai ajouté "unsafe-perm":trueà package.json ... Je ne sais pas pourquoi
Dmitry Pashkevich
8
L'ajouter à la propriété "config" dans package.json définit en fait "npm_package_config_unsafe_perm" donc l'option 2 ne fonctionne pas. Voir: stackoverflow.com/questions/28763958/…
justmoon
'unsafe-perm': true a échoué pour moi aussi. Dommage qu'il n'ait pas donné l'erreur et le contexte (y compris son changement d'uid) dans le message d'erreur, au lieu de supprimer la cause de l'existence et de donner quelque chose d'énigmatique, de surprenant et d'hostile.
android.weasel
Bien que cela npm install --unsafe-permfonctionne pour moi, j'ai essayé de suivre l'implication concernant la modification de la userconfiguration par défaut . J'ai donc fait npm set user my_useret npm set group my_group, qui ajoute les entrées correspondantes dans le .npmrcfichier de l'utilisateur racine . Mais le problème est que le node_modulesdossier lui-même et ses sous-dossiers appartiennent toujours à root, donc cela n'aide pas. Je ne pouvais trouver aucun moyen de ne pas les faire appartenir à root.
fulv le
53

La seule chose qui a fonctionné pour moi a été d'ajouter un .npmrcfichier contenant:

unsafe-perm = true

L'ajout de la même configuration à package.jsonn'a eu aucun effet.

Undistraction
la source
36
dans docker:RUN npm set unsafe-perm true
Alexander Mills le
si vous utilisez WSL, tapez simplement set unsafe-perm true. Cela vous aidera
Stas Panyukov
26

J'ai rencontré le même problème en essayant de publier mon application nodejs sur un serveur privé exécutant CentOs en utilisant l'utilisateur root. La même erreur est déclenchée par "postinstall": "./node_modules/bower/bin/bower install" dans mon fichier package.json donc la seule solution qui fonctionnait pour moi est d'utiliser les deux options pour éviter l'erreur:

1: utilisez l'option --allow-root pour la commande d'installation de bower

"postinstall": "./node_modules/bower/bin/bower --allow-root install"

2: utilisez l'option --unsafe-perm pour la commande npm install

npm install --unsafe-perm
Yassine Khachlek
la source
12

OP ici, j'ai beaucoup appris sur le nœud depuis que j'ai posé cette question pour la première fois. Bien que la réponse de Dmitry ait été très utile, ce qui l'a finalement fait pour moi, c'est d'installer le nœud avec les autorisations appropriées.

Je recommande vivement de ne pas installer node à l'aide de gestionnaires de packages, mais plutôt de le compiler vous-même afin qu'il réside dans un répertoire local avec des autorisations normales.

Cet article fournit une instruction étape par étape très claire sur la façon de procéder:

https://www.digitalocean.com/community/tutorials/how-to-install-an-upstream-version-of-node-js-on-ubuntu-12-04

EH
la source
2

J'ai corrigé cela en changeant la propriété de /usr/localet ~/Users/user-namecomme ceci:

sudo chown -R my_name /usr/local

Cela m'a permis de tout faire sans sudo

Daniel O'Leary
la source