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.

732voto

regular Points 1063

UPDATE : Comme le souligne Seyeong Jeong dans sa réponse ci-dessous, depuis npm 5.2.0 vous pouvez utiliser npx [command] ce qui est plus pratique.

ANCIENNE RÉPONSE pour les versions antérieures à 5.2.0 :

Le problème de mettre

./node_modules/.bin

dans votre PATH est qu'il ne fonctionne que lorsque votre répertoire de travail actuel est la racine de la structure du répertoire de votre projet (c'est-à-dire l'emplacement du fichier node_modules )

Indépendamment de votre répertoire de travail, vous pouvez obtenir le chemin des binaires installés localement avec

npm bin

Pour exécuter un programme installé localement coffee indépendamment de l'endroit où vous vous trouvez dans la hiérarchie du répertoire du projet, vous pouvez utiliser cette construction bash

PATH=$(npm bin):$PATH coffee

J'ai aliasé ceci à npm-exec

alias npm-exec='PATH=$(npm bin):$PATH'

Donc, maintenant je peux

npm-exec coffee

pour lancer la bonne copie du café, où que je sois.

$ pwd
/Users/regular/project1

$ npm-exec which coffee
/Users/regular/project1/node_modules/.bin/coffee

$ cd lib/
$ npm-exec which coffee
/Users/regular/project1/node_modules/.bin/coffee

$ cd ~/project2
$ npm-exec which coffee
/Users/regular/project2/node_modules/.bin/coffee

23 votes

Vous pouvez même aller plus loin et alias coffee="npm-exec coffee"

0 votes

npm bin n'est pas indépendant du répertoire de travail actuel, cependant ; sa sortie change en fonction du répertoire actuel. Vous vouliez peut-être dire npm bin -g ?

6 votes

La sortie change lorsque vous vous connectez à un autre projet. Il ne change pas lorsque vous vous connectez à l'intérieur d'un projet. npm bin recherche la chaîne des 'répertoires ancêtres' jusqu'au cwd pour un répertoire node_modules. C'est exactement le comportement souhaité si vous voulez spécifiquement utiliser les binaires des modules listés dans le package.json du projet.

621voto

Seyeong Jeong Points 1817

Nice example

Vous n'avez pas à manipuler $PATH plus jamais !

De npm@5.2.0 , npm navires avec npx qui vous permet d'exécuter des commandes à partir d'un fichier local. node_modules/.bin ou à partir d'un cache central.

Il suffit de courir :

$ npx [options] <command>[@version] [command-arg]...

Par défaut, npx vérifiera si <command> existe dans $PATH ou dans les binaires du projet local, et exécutez-le.

Appel à npx <command> quand <command> n'est pas déjà dans votre $PATH installera automatiquement un paquet avec ce nom à partir du registre NPM pour vous, et l'invoquera. Une fois l'opération terminée, le paquet installé ne figurera nulle part dans vos globales, de sorte que vous n'aurez pas à vous soucier de la pollution à long terme. Vous pouvez empêcher ce comportement en fournissant --no-install option.

Pour npm < 5.2.0 vous pouvez installer npx manuellement en exécutant la commande suivante :

$ npm install -g npx

123voto

jassa Points 5600

Utilisez le npm bin pour obtenir le répertoire /bin des modules de nœuds de votre projet.

$ $(npm bin)/<binary-name> [args]

par exemple

$ $(npm bin)/bower install

85voto

jla Points 575

Utilisez npm run[-script] <script name>

Après avoir utilisé npm pour installer le paquet bin dans votre local ./node_modules modifier le répertoire package.json à ajouter <script name> comme ça :

$ npm install --save learnyounode
$ edit packages.json
>>> in packages.json
...
"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "learnyounode": "learnyounode"
},
...
$ npm run learnyounode

Ce serait bien si npm install avait une option --add-script ou quelque chose ou si npm run fonctionnait sans ajouter au bloc de scripts.

64voto

Dheeraj Bhaskar Points 5244

Mise à jour : Si vous utilisez la version récente de npm (version >5.2)

Vous pouvez utiliser :

npx <command>

npx cherche la commande dans .bin de votre node_modules

ancienne réponse :

Pour Windows

Enregistrez les éléments suivants dans un fichier appelé npm-exec.bat et l'ajouter à votre %PATH%

@echo off
set cmd="npm bin"
FOR /F "tokens=*" %%i IN (' %cmd% ') DO SET modules=%%i
"%modules%"\%*

Utilisation

Ensuite, vous pouvez l'utiliser comme npm-exec <command> <arg0> <arg1> ...

Par exemple

Pour exécuter wdio installé dans le répertoire local node_modules, faites :

npm-exec wdio wdio.conf.js

c'est-à-dire qu'il va exécuter .\node_modules\.bin\wdio wdio.conf.js

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