731 votes

Comment utiliser les exécutables d'un paquet installé localement dans node_modules ?

Comment puis-je utiliser une version locale d'un module dans node.js . Par exemple, dans mon application, j'ai installé coffee-script :

npm install coffee-script

Cela l'installe dans ./node_modules et la commande du café est dans ./node_modules/.bin/coffee . Existe-t-il un moyen d'exécuter cette commande lorsque je suis dans le dossier principal de mon projet ? Je suppose que je cherche quelque chose de similaire à bundle exec dans bundler. En gros, j'aimerais spécifier une version de coffee-script que toutes les personnes impliquées dans le projet devraient utiliser.

Je sais que je peux ajouter le -g flag pour l'installer globalement afin que Coffee fonctionne bien partout, mais que faire si je veux avoir différentes versions de Coffee par projet ?

19 votes

Beaucoup d'instructions que je lis disent des choses comme npm install niftycommand et ensuite niftycommand . Mais cela ne fonctionnera jamais si vous n'avez pas ./node_modules/.bin dans votre chemin, n'est-ce pas ?

3 votes

Il y a un très bon article ici : firstdoit.com/ - En gros, il vous recommande de mettre votre coffee dans le npm scripts section, comme "build": "coffee -co target/directory source/directoy", so you can run npm run build` depuis le terminal ensuite.

0 votes

@BennyNeugebauer en effet, c'est ce que j'ai fait dernièrement au lieu de m'amuser avec PATH.

45voto

Linus G Thiel Points 18378

Mise à jour : Je ne recommande plus cette méthode, à la fois pour les raisons de sécurité mentionnées et pour les raisons plus récentes. npm bin commande. Réponse originale ci-dessous :

Comme vous l'avez constaté, tous les binaires installés localement sont dans le répertoire ./node_modules/.bin . Afin de toujours exécuter les binaires dans ce répertoire plutôt que les binaires disponibles globalement, s'ils sont présents, je vous suggère de mettre ./node_modules/.bin le premier sur votre chemin :

export PATH="./node_modules/.bin:$PATH"

Si vous mettez cela dans votre ~/.profile , coffee sera toujours ./node_modules/.bin/coffee si disponible, sinon /usr/local/bin/coffee (ou tout autre préfixe sous lequel vous installez les modules de Node).

1 votes

C'est probablement la meilleure solution. J'ai également créé un bash script appelé "watch" dans mon projet : ./node_modules/.bin/coffee --output lib/ --compile --bare --watch src

75 votes

Danger, Will Robinson ! L'utilisation de chemins relatifs dans votre $PATH ouvre une brèche de sécurité de la taille d'une planète, surtout si vous les placez en tête de liste. Si le répertoire dans lequel vous vous trouvez est accessible en écriture par tout le monde (disons quelque part dans le répertoire /tmp ), tout processus ou utilisateur peut détourner votre session en plaçant des versions malveillantes de commandes ordinaires (telles que ls , cp etc.). Ceux-ci peuvent générer des sous-shells "invisibles" capturant vos mots de passe, etc.

0 votes

Ne fonctionnera que dans la racine et pas ailleurs. la alias npm-exec='PATH=$(npm bin):$PATH' est plus lisse.

43voto

Shahar Or Points 166

Utilisez npm-run .

Dans le fichier lisez-moi :

npm-run

Trouver et exécuter des exécutables locaux à partir de node_modules

Tout exécutable disponible pour un script du cycle de vie de npm est disponible pour npm-run .

Utilisation

$ npm install mocha # mocha installed in ./node_modules
$ npm-run mocha test/* # uses locally installed mocha executable 

Installation

$ npm install -g npm-run

29voto

ssc-hrep3 Points 1236

TL;DR : Utiliser npm exec avec npm@>=7 .


Le site npx qui a été mentionnée dans d'autres réponses a été complètement réécrite en npm@7 qui est livré par défaut avec node@15 et peut être installé sur node@>=10 . L'implémentation est maintenant égale à la nouvelle npm exec qui est similaire mais pas égale à la précédente commande npx la mise en œuvre de la commande.

Une différence est par exemple qu'il demande toujours de manière interactive si une dépendance doit être téléchargée lorsqu'elle n'est pas déjà installée (peut également être écrasée avec les paramètres --yes ou --no ).

Voici un exemple pour npm exec . Les doubles tirets ( -- ) sépare les npm exec des paramètres de la commande réelle :

npm exec --no -- jest --coverage

Voir aussi le une documentation officielle et actualisée pour npm exec .

25voto

k0pernikus Points 2446

Si vous voulez garder npm, alors npx devrait faire ce dont vous avez besoin.


Si le passage à yarn (un remplacement de npm par facebook) est une option pour vous, alors vous pouvez appeler :

 yarn yourCmd

dans le package.json seront prioritaires, si aucun n'est trouvé, il cherchera dans le fichier ./node_modules/.bin/ dossier.

Il sort également ce qu'il a exécuté :

$ yarn tsc
yarn tsc v0.27.5
$ "/home/philipp/rate-pipeline/node_modules/.bin/tsc"

Ainsi, vous n'avez pas besoin de configurer des scripts pour chaque commande dans votre système de gestion de l'information. package.json .


Si vous aviez un script défini à .scripts à l'intérieur de votre package.json :

"tsc": "tsc" // each command defined in the scripts will be executed from `./node_modules/.bin/` first

yarn tsc serait équivalent à yarn run tsc ou npm run tsc :

 yarn tsc
 yarn tsc v0.27.5
 $ tsc

23voto

Bob9630 Points 235

La solution PATH a le problème que si $(npm bin) est placé dans votre .profile/.bashrc/etc, il est évalué une fois et est à jamais défini dans le répertoire dans lequel le chemin a été évalué pour la première fois. Si au lieu de cela vous modifiez le chemin actuel, alors chaque fois que vous exécutez le script, votre chemin s'agrandira.

Pour contourner ces problèmes, j'ai créé une fonction et l'ai utilisée. Elle ne modifie pas votre environnement et est simple à utiliser :

function npm-exec {
   $(npm bin)/$@  
}

Vous pouvez ensuite l'utiliser comme ceci sans apporter de modifications à votre environnement :

npm-exec r.js <args>

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