NPM ne peut pas installer de dépendances - Essayez de déverrouiller quelque chose qui n'a pas été verrouillé

192

J'ai essayé d'exécuter une installation npm sur mon fichier package.json, mais j'ai beaucoup de problèmes. Il continue de dire "Erreur: Tentative de déverrouillage de XXX, qui n'a pas été verrouillé" sur toutes mes dépendances. En voici un:

Error: Attempt to unlock tbd@~0.6.4, which hasn't been locked
        at unlock (/usr/local/lib/node_modules/npm/lib/cache.js:1304:11)
        at cb (/usr/local/lib/node_modules/npm/lib/cache.js:646:5)
        at /usr/local/lib/node_modules/npm/lib/cache.js:655:20
        at /usr/local/lib/node_modules/npm/lib/cache.js:1290:7
        at /usr/local/lib/node_modules/npm/node_modules/lockfile/lockfile.js:167:38
        at OpenReq.Req.done (/usr/local/lib/node_modules/npm/node_modules/graceful-fs/graceful-fs.js:144:5)
        at OpenReq.done (/usr/local/lib/node_modules/npm/node_modules/graceful-fs/graceful-fs.js:64:22)
        at Object.oncomplete (fs.js:107:15)

Si j'essaie de l'exécuter en tant que sudo, il semble aller plus loin et commencer à installer certains packages, mais de nouvelles erreurs apparaissent à la place:

> chokidar@0.8.1 postinstall /Users/tkirchner/Documents/Projects/mm-datatable/node_modules/karma/node_modules/chokidar
> node setup-deps.js

shell-init: error retrieving current directory: getcwd: cannot access parent directories: Permission denied

node.js:811
    var cwd = process.cwd();
                      ^
Error: EACCES, permission denied
    at Function.startup.resolveArgv0 (node.js:811:23)
    at startup (node.js:58:13)
    at node.js:902:3
npm ERR! error rolling back Error: ENOTEMPTY, rmdir '/Users/tkirchner/Documents/Projects/mm-datatable/node_modules/karma/node_modules/q'
npm ERR! error rolling back  karma@0.10.9 { [Error: ENOTEMPTY, rmdir '/Users/tkirchner/Documents/Projects/mm-datatable/node_modules/karma/node_modules/q']
npm ERR! error rolling back   errno: 53,
npm ERR! error rolling back   code: 'ENOTEMPTY',
npm ERR! error rolling back   path: '/Users/tkirchner/Documents/Projects/mm-datatable/node_modules/karma/node_modules/q' }
npm ERR! Error: ENOENT, chown '/Users/tkirchner/Documents/Projects/mm-datatable/node_modules/karma/node_modules/socket.io/lib/socket.io.js'

J'ai récemment mis à jour mes installations de nœuds et de npm. Alors peut-être que cela a quelque chose à voir avec ça. De plus, la majeure partie de mon développement a été au bureau et aujourd'hui, je travaille sur VPN, alors peut-être que cela a aussi quelque chose à voir avec cela.

Des idées?

TJ Kirchner
la source
Voici le fichier package.json, si cela aide ... (soupir), nvm, je n'arrive pas à le coller .. trop de caractères.
TJ Kirchner
quel os courez-vous
wayne

Réponses:

421

Selon photusenigma sur: https://github.com/npm/npm/issues/4815

Exécutez ces commandes dans une fenêtre de terminal (note - NE remplacez PAS la partie $ USER ... c'est une commande linux pour obtenir votre utilisateur!):

sudo chown -R $USER ~/.npm
sudo chown -R $USER /usr/local/lib/node_modules

... et ... si vous êtes sur un Mac (comme je le suis) et que vous voyez toujours des erreurs après avoir exécuté ces commandes, exécutez cette dernière et vous devriez être bon. (Je vous recommande d'essayer avant de faire celui-ci. Je n'aime pas changer les autorisations sur le répertoire ENTIRE / usr / local sauf si cela semble vraiment nécessaire!)

sudo chown -R $USER /usr/local
alexoviedo999
la source
7
Travaillé pour moi merci! Mon dossier node_modules était cependant à un endroit différent, peut-être que cela aidera quelqu'un d'autresudo chown -R `whoami` /usr/lib/node_modules/
Justen
4
Étrangement, récursif chownn'a pas changé les autorisations ~/.npm/_lockspour moi. J'ai fait travailler le mien en courantsudo chown -R myname ~/.npm/_locks
Sitati
7
Sachez que cette solution n'est pas adaptée aux plates-formes multi-utilisateurs. La première commande est ok, la seconde fait un utilisateur standard propriétaire des fichiers système. / usr / local / lib / node_modules n'est utilisé que par npm avec l'option --global, ce qui signifie également utiliser sudo. Malheureusement, certains scripts d'installation utilisant npm mélangent les commandes npm globales et non globales ... Création de ce gâchis.
Fafaman
5
D'accord, tout ce dont vous avez besoin est la première commande. Évitez les autres car ceux-ci ne devraient pas appartenir à votre utilisateur.
pyrospade
2
existe-t-il un moyen d'inverser les "effets" de la deuxième ligne sudo chown -R $USER /usr/local/lib/node_modules? Je l'ai couru avant de lire que ce n'était pas une bonne idée ..
shaneparsons
153

J'ai travaillé avec un collègue cet après-midi et compris quel était le problème. Mon dossier ".npm" dans mon répertoire personnel appartenait à l'utilisateur root au lieu de moi-même. Je ne sais pas ce qui est arrivé à cause de cela. Peut-être que j'ai installé node ou npm en tant qu'administrateur root à un moment donné. En tout cas, je viens de courir sudo chown -R [username] .npmet j'ai enfin pu exécuter à nouveau les npm installcommandes de mes projets!

TJ Kirchner
la source
11
Cela aide également si vous exécutez également la même commande ~/tmp/, ou quel que soit l'emplacement utilisé par Node comme emplacement temporaire
Jason
1
Merci pour votre réponse! M'a sauvé des maux de tête car le message d'erreur est mauvais. Mais je dirai que npm doit le faire par défaut car je suis presque sûr de ne pas l'avoir installé sous root moi-même. Et, pour être complet, vous devez chown -R <username> .npm
crowmagnumb
Heureux d'avoir pu aider :) Et, bonne prise! Je modifierai ma réponse pour le dire.
TJ Kirchner du
Épargnant de vie! Merci
Matthew Cullum
21

Dans mon cas, le problème invoquait npm avec un utilisateur qui n'a pas de répertoire HOME, donc par exemple la commande suivante échouerait:

sudo -u someUser npm install

La solution est de fournir un répertoire HOME, avec someUseraccès en écriture:

sudo -u someUser HOME=/some/directory npm install
Bjarke Walling
la source
Voté parce que cela a vraiment fonctionné pour moi, donc bravo et merci. Je déploie en production et l'utilisateur n'avait même pas de répertoire .npm (que je pourrais trouver, de toute façon)
Stuart Watt
Fonctionne sur ChromeOS avec l'utilisateur "chronos".
Kyle Coberly
J'ai pu contourner cela en spécifiant sudo -u someUser -i, ce qui démarre un nouveau shell de connexion. J'ai examiné cela un peu plus et le code de mise en cache dans npm utilise la variable npm.cache, que je suppose par défaut $HOME/.npm/. sudo peut également avoir un comportement différent avec ce à quoi la variable HOME est définie en fonction de la configuration et de la présence ou de l'absence d'options de ligne de commande.
jgibson
11

Eu le même problème et l'a corrigé en changeant les persmissions selon la réponse acceptée:

sudo chown -R $USER ~/.npm

Cependant, la deuxième commande doit être évitée car elle rétrograde les autorisations d'une ressource système ( sudo chown -R $USER /usr/local/lib/node_modules). Pas une bonne idée.

Pour mémoire: "usr" /usr/localsignifie Unix System Resources .

chris
la source
1
Cela devrait probablement être un commentaire sur la réponse acceptée plutôt que publié comme une nouvelle réponse.
Kmeixner
L'auteur de cette réponse le sait mais n'a pas mis à jour sa réponse, donc je dis qu'une réponse distincte est tout à fait justifiée.
Gui Prá
4

Rien de tout cela n'a fonctionné pour moi. J'ai dû exécuter littéralement en tant que root en procédant comme suit:

sudo su -
sudo npm install forever -g

Ensuite, le package installé sur Linux Ubuntu 14.04.

occasl
la source
Vous ne devriez vraiment pas exécuter npm en tant que root!
Antoine 'hashar' Musso
2

La commande suivante devrait résoudre les problèmes d'autorisation:

sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share}

Vous pouvez lire ici d'autres solutions officiellement recommandées:

https://docs.npmjs.com/getting-started/fixing-npm-permissions

Tim White
la source
1

Ma solution:

sudo chown -R $USER /usr/local/lib/node_modules/NAMEOFMODULE

dans mon cas était:

sudo chown -R $USER /usr/local/lib/node_modules/appium/

Mais j'ai eu le même problème, enfin après

npm cache clean

ça a marché !

mayo
la source
0

J'ai eu le même problème et j'ai essayé de corriger l'autorisation / la propriété des fichiers et répertoires liés à npm pendant des heures mais pas eu de chance avec cela.

Soudain, j'ai trouvé que j'avais un ~/.npmrcfichier dont l' cacheentrée pointait vers un répertoire inexistant. Suppression de cette cachepropriété pour utiliser l'emplacement de cache par défaut et maintenant c'est résolu.

cheolgook
la source
0

Avertissement

Je suis un utilisateur Windows . Cependant, mon équipe et moi avons rencontré un certain nombre de problèmes concernant les erreurs d'installation de npm.

Problèmes

Voici une liste des leçons apprises et une solution radicale possible qui nous a toujours sauvés:

  1. node_modules , le répertoire d'installation local de npm est protégé contre toute modification par une lacune du système d'exploitation telle que l'impossibilité de traiter les chemins de plus de 255 caractères.
  2. Si le dossier est effacé au moyen d'un outil de ligne de commande, il peut toujours apparaître comme si le dossier existe dans l'explorateur qui, en essayant d'y accéder, donne un certain nombre d'erreurs d'autorisation.
  3. En fonction de votre antivirus et / ou de votre gestionnaire de stratégies local, vous pourrez peut-être créer le dossier node_modules et, par la suite, reléguer l'accès ou les autorisations, ce qui entraînera un certain nombre d'erreurs d'installation.
  4. Activez les journaux npm pour mieux comprendre les problèmes possibles avec:

    npm install --loglevel verbose

Radical

Installer rimraf dans le monde

 npm install rimraf -g

Exécutez rimraf sur node_modules :

rimraf yourDir/node_modules

Essayez ensuite de lancer:

npm install

Avertissement!

Ou l'absence de. Soyez extrêmement prudent sur ce qui suit la commande rimraf. Il n'y a aucun avertissement, aucune invite, il n'y a rien. Il efface simplement le répertoire de la phase de la terre propre, comme s'il n'était jamais là. Essayez-le à vos risques et périls.

Wilmer Saint
la source