Comment 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 coffee 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
bundler. En gros, je voudrais 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
drapeau pour l'installer à l'échelle mondiale afin que le café fonctionne bien n'importe où, mais que faire si je voulais avoir différentes versions de café par projet?
node.js
coffeescript
npm
node-modules
typeoneerror
la source
la source
npm install niftycommand
et ensuiteniftycommand
. Mais cela ne fonctionnera jamais à moins que vous ayez ./node_modules/.bin sur votre chemin, n'est-ce pas?coffee
commande dans lanpm scripts
section, comme"build": "coffee -co target/directory source/directoy", so you can run
npm run build` depuis le terminal.npx
fournie avecnpm 5.2.0
medium.com/@maybekatz/…Réponses:
MISE À JOUR : Comme Seyeong Jeong le souligne dans sa réponse ci-dessous, depuis npm 5.2.0, vous pouvez utiliser
npx [command]
, ce qui est plus pratique.ANCIENNE REPONSE pour les versions antérieures à 5.2.0 :
Le problème avec mettre
dans votre PATH est qu'il ne fonctionne que lorsque votre répertoire de travail actuel est la racine de la structure de votre répertoire de projet (c'est-à-dire l'emplacement de
node_modules
)Indépendamment de votre répertoire de travail, vous pouvez obtenir le chemin des binaires installés localement avec
Pour exécuter un
coffee
binaire installé localement indépendamment de l'endroit où vous vous trouvez dans la hiérarchie du répertoire du projet, vous pouvez utiliser cette construction bashJ'ai donné un alias à npm-exec
Donc maintenant je peux
pour exécuter la bonne copie de café, peu importe où je suis
la source
alias coffee="npm-exec coffee"
npm bin
recherche dans la chaîne des «répertoires ancêtres» vers le cwd un répertoire node_modules. C'est exactement le comportement souhaité si vous souhaitez spécifiquement utiliser les binaires des modules répertoriés dans le package.json du projet.PATH
sera de retour à ce qu'il était avant l'invocation de la commande. La définition d'une variable d'environnement sur la même ligne, avant d'exécuter une commande, affecte uniquement l'environnement de cette commande.Plus besoin de manipuler
$PATH
!À partir de [email protected] , npm est fourni avec un
npx
package qui vous permet d'exécuter des commandes à partirnode_modules/.bin
d'un cache local ou central.Exécutez simplement:
Par défaut,
npx
vérifiera s'il<command>
existe dans$PATH
ou dans les binaires du projet local et l'exécutera.L' appel
npx <command>
quand<command>
est pas déjà dans votre$PATH
installera automatiquement un paquet avec ce nom du registre de NPM pour vous, et l' invoquer. Une fois terminé, le package installé ne se trouvera nulle part dans vos pays, vous n'aurez donc pas à vous soucier de la pollution à long terme. Vous pouvez empêcher ce comportement en fournissant une--no-install
option.Pour
npm < 5.2.0
, vous pouvez installer lenpx
package manuellement en exécutant la commande suivante:la source
npm
etpackage.json
fournit presque les mêmes fonctionnalités.npx
est boiteux. Cela aurait dû êtrenpm run
ounpm exec
ou quelque chose.npm run [my-local-package]
ne fonctionne pas sur mon Ubuntu, bien qu'il semble fonctionner sur un appareil Windows.Utilisez la
npm bin
commande pour obtenir le répertoire node modules / bin de votre projetpar exemple
la source
export PATH="./node_modules/.bin:$PATH"
$(npm bin)/jasmine
pasnode $(npm bin)/jasmine
(vous l'avez probablement compris mais clarifiez pour les autres).Utilisation
npm run[-script] <script name>
Après avoir utilisé npm pour installer le paquet bin dans votre
./node_modules
répertoire local , modifiezpackage.json
pour ajouter<script name>
comme ceci:Ce serait bien si l'installation de npm avait une option --add-script ou quelque chose ou si l'exécution de npm fonctionnerait sans ajouter au bloc de scripts.
la source
npm install
alors accès à vos dépendances de développement. Le seul inconvénient mineur est que vous deveznpm run eslint
(ou peu importe). Vous pouvez créer un script appelé "start" qui exécute gulp afin que vous n'ayez qu'à tapernpm start
pour démarrer votre serveur de développement. Des trucs assez cool et pas de bonté, donc vos amis Windows vous aiment toujours. :)--
comme:npm run learnyounode -- --normal-switches --watch -d *.js
npm run ts-node
ne fonctionne pas pour moi. Je vais juste devoir passer à npx.Utilisation
npm-run
.Du fichier Lisezmoi:
npm-run
Rechercher et exécuter des exécutables locaux à partir de node_modules
Tout exécutable disponible pour un script de cycle de vie npm est disponible pour
npm-run
.Usage
Installation
la source
Mise à jour: je ne recommande plus cette méthode, à la fois pour les raisons de sécurité mentionnées et non des moindres
npm bin
commande . Réponse originale ci-dessous:Comme vous l'avez découvert, tous les binaires installés localement sont disponibles
./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 en./node_modules/.bin
premier sur votre chemin:Si vous mettez ceci dans votre
~/.profile
,coffee
sera toujours./node_modules/.bin/coffee
si disponible, sinon/usr/local/bin/coffee
(ou quel que soit le préfixe sous lequel vous installez les modules de noeud).la source
./node_modules/.bin/coffee --output lib/ --compile --bare --watch src
/tmp
), tout processus ou utilisateur peut pirater votre session en mettant les versions malveillantes des commandes ordinaires (commels
,cp
, etc.). Ceux-ci peuvent engendrer des sous-coquilles «invisibles» capturant vos mots de passe, etc.alias npm-exec='PATH=$(npm bin):$PATH'
est plus lisse.PATH
, mais en dernier (en utilisant le$(npm bin)
formulaire)? donc ils ne peuvent pas écraser vos trucs existants, et vous auriez déjà fait confiance aux exécutables dunpm bin
répertoire indépendamment de laPATH
var; le modèle de menace serait-il que a) une personne malveillante accède à votre système de fichiers, b) elle ajoute des exécutables avec des noms proches de ces outils système, et c) vous vous trompez? Essayer de comprendre les scénarios qui rendent cela mauvais, étant donné que vous faites déjà confiance aux exécutables étrangers lorsque vous utilisez desnpm
programmes installés.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 toujours défini dans le répertoire dans lequel le chemin a été évalué pour la première fois. Si vous modifiez plutôt le chemin actuel, chaque fois que vous exécutez le script, votre chemin se développe.
Pour contourner ces problèmes, je crée une fonction et l'utilise. Il ne modifie pas votre environnement et est simple à utiliser:
Cela peut ensuite être utilisé comme ceci sans apporter de modifications à votre environnement:
la source
n
Si vous souhaitez conserver npm, alors npx devrait faire ce dont vous avez besoin.
Si le passage au fil (un remplacement npm par Facebook) est une option pour vous, alors vous pouvez appeler:
les scripts à l'intérieur du package.json auront priorité, si aucun n'est trouvé, ils regarderont à l'intérieur du
./node_modules/.bin/
dossier.Il affiche également ce qu'il a exécuté:
Vous n'avez donc pas à configurer de scripts pour chaque commande de votre
package.json
.Si vous aviez un script défini à l'
.scripts
intérieur de votrepackage.json
:yarn tsc
serait équivalentyarn run tsc
ounpm run tsc
:la source
mise à jour: si vous êtes sur le npm récent (version> 5.2)
Vous pouvez utiliser:
npx
recherche la commande dans le.bin
répertoire de votrenode_modules
ancienne réponse:
Pour les fenêtres
Stockez les éléments suivants dans un fichier appelé
npm-exec.bat
et ajoutez-les à votre%PATH%
Usage
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, procédez comme suit:c'est-à-dire qu'il fonctionnera
.\node_modules\.bin\wdio wdio.conf.js
la source
Je préfère ne pas compter sur des alias de shell ou un autre package.
En ajoutant une ligne simple à la
scripts
section de votrepackage.json
, vous pouvez exécuter des commandes locales npm commenpm run webpack
package.json
la source
Si vous souhaitez que votre variable PATH se mette à jour correctement en fonction de votre répertoire de travail actuel, ajoutez ceci à la fin de votre
.bashrc
équivalent (ou après tout ce qui définitPATH
):Cela peut ajouter un court délai chaque fois que l'invite bash est rendue (en fonction de la taille de votre projet, probablement), elle est donc désactivée par défaut.
Vous pouvez activer et désactiver au sein de votre terminal en cours d' exécution
node-mode
etnode-mode-off
, respectivement.la source
J'ai toujours utilisé la même approche que @guneysus pour résoudre ce problème, qui crée un script dans le fichier package.json et l'utilise en exécutant npm run script-name.
Cependant, ces derniers mois, j'utilise npx et je l'adore.
Par exemple, j'ai téléchargé un projet Angular et je ne voulais pas installer la CLI Angular globalement. Donc, avec npx installé, au lieu d'utiliser la commande global angular cli (si je l'avais installé) comme ceci:
Je peux le faire depuis la console:
Voici un article que j'ai écrit sur NPX et qui l'approfondit.
la source
zxc est comme "bundle exec" pour nodejs. Cela revient à utiliser
PATH=$(npm bin):$PATH
:la source
Même solution acceptée par @regular, mais saveur de coquille de poisson
la source
Vous pouvez également utiliser direnv et modifier la variable $ PATH uniquement dans votre dossier de travail.
la source
Ajoutez ce script à votre
.bashrc
. Ensuite, vous pouvez appelercoffee
ou n'importe quoi localement. C'est pratique pour votre ordinateur portable, mais ne l'utilisez pas sur votre serveur.note : ce script fait aliase de
cd
commande, et après chaque appelcd
il vérifienode_modules/.bin
et l'ajoute à votre$PATH
.note2 : vous pouvez changer la troisième ligne en
NODE_MODULES=$(npm bin);
. Mais cela rendrait lecd
commandement trop lent.la source
$(npm bin)
au lieu du codage en dur./node_modules/.bin
.$(npm bin)
semble trop lent à utiliser avec chaquecd
commande. J'ai restauré le code et ajouté une note à ce sujet.Pour Windows, utilisez ceci:
la source
J'ai rencontré le même problème et je n'aime pas particulièrement utiliser les alias (comme le suggèrent les habitués ), et si vous ne les aimez pas aussi, voici une autre solution de contournement que j'utilise, vous devez d'abord créer un minuscule script bash exécutable, dites setenv.sh :
puis vous pouvez ensuite utiliser tous les exécutables de votre section locale à l'
/bin
aide de cette commande:Si vous utilisez
scripts
dans package.json alors:la source
Je serais ravi de savoir si c'est une idée peu sûre / mauvaise, mais après y avoir réfléchi un peu, je ne vois pas de problème ici:
Modifier la solution non sécurisée de Linus pour l'ajouter à la fin, en utilisant
npm bin
pour trouver le répertoire, et en faisant que le script n'appelle quenpm bin
lorsque apackage.json
est présent dans un parent (pour la vitesse), voici ce que j'ai trouvé pourzsh
:Pour
bash
, au lieu d'utiliser leprecmd
crochet, vous pouvez utiliser la$PROMPT_COMMAND
variable (je n'ai pas testé cela mais vous avez l'idée):la source
npm bin
à la fin de$PATH
ne peut pas exécuter ce que l'utilisateur attend: fondamentalement un autre exécutable mais plus probablement un package installé mondialement avec une autre version!Je suis un
Windows
utilisateur et c'est ce qui a fonctionné pour moi:Bonne chance.
la source
Dans le cas où vous utilisez
fish shell
et ne souhaitez pas ajouter à$path
pour des raisons de sécurité. Nous pouvons ajouter la fonction ci-dessous pour exécuter des exécutables de nœuds locaux.Maintenant, vous pouvez exécuter quelque chose comme:
n coffee
ou plusieurs arguments comme:
n browser-sync --version
Notez que si vous êtes
bash
utilisateur, alors les réponses @ Bob9630 sont la voie à suivre en exploitant bash$@
, qui n'est pas disponible dansfishshell
.la source
Incluez coffee-script dans package.json avec la version spécifique requise dans chaque projet, généralement comme ceci:
Exécutez ensuite npm install pour installer les dépendances dans chaque projet. Cela installera la version spécifiée de coffee-script qui sera accessible localement à chaque projet.
la source
npm install svgo
aussi biennpm install
avec package.json. Les deux méthodes ont été installées «avec succès», mais la commande «svgo» n'est toujours pas disponible.grunt-cli
package globalement, puis dans votre répertoire de projet installez n'importe quelle version (modifiée) dugrunt
package, puis lorsque vous l'exécuterezgrunt
, il utilisera cette version locale.