Edit 2014.10.30: Il est possible de passer des arguments à npm run
partir de npm 2.0.0
La syntaxe est la suivante:
npm run <command> [-- <args>]
Notez le nécessaire --
. Il est nécessaire de séparer les paramètres passés à la npm
commande elle-même et les paramètres passés à votre script.
Donc, si vous avez package.json
"scripts": {
"grunt": "grunt",
"server": "node server.js"
}
Les commandes suivantes seraient alors équivalentes:
grunt task:target
=> npm run grunt -- task:target
node server.js --port=1337
=> npm run server -- --port=1337
Pour obtenir la valeur du paramètre, consultez cette question . Pour lire les paramètres nommés, il est probablement préférable d'utiliser une bibliothèque d'analyse comme yargs ou minimist ; nodejs expose process.argv
globalement, contenant des valeurs de paramètres de ligne de commande, mais il s'agit d'une API de bas niveau (tableau de chaînes séparées par des espaces, tel que fourni par le système d'exploitation à l'exécutable du nœud).
Edit 2013.10.03: Ce n'est actuellement pas possible directement. Mais un problèmenpm
lié à GitHub est ouvert pour implémenter le comportement que vous demandez. Il semble que le consensus est de mettre cela en œuvre, mais cela dépend d'un autre problème résolu auparavant.
Réponse originale: En guise de solution de contournement (mais pas très pratique), vous pouvez procéder comme suit:
Dites que le nom de votre colis package.json
est myPackage
et vous avez également
"scripts": {
"start": "node ./script.js server"
}
Ajoutez ensuite package.json
:
"config": {
"myPort": "8080"
}
Et dans votre script.js
:
// defaulting to 8080 in case if script invoked not via "npm run-script" but directly
var port = process.env.npm_package_config_myPort || 8080
De cette façon, par défaut npm start
utilisera 8080. Vous pouvez cependant le configurer (la valeur sera stockée par npm
dans sa mémoire interne):
npm config set myPackage:myPort 9090
Ensuite, lors de l'appel npm start
, 9090 sera utilisé (la valeur par défaut de package.json
est remplacée).
yargs
; tous les paramètres après le--
peuvent être parfaitement analysés dans votre script.-- --args
merde sacrée qui est bizarre mais okVous avez demandé à pouvoir exécuter quelque chose comme
npm start 8080
. Ceci est possible sans avoir à modifierscript.js
ou à configurer les fichiers comme suit.Par exemple, dans votre
"scripts"
valeur JSON, incluez--Et puis à partir de la ligne de commande:
J'ai confirmé que cela fonctionne en utilisant bash et npm 1.4.23. Notez que cette solution de contournement ne nécessite pas la résolution du problème n ° 3494 de GitHub npm .
la source
node ./script.js server ${PORT:-8080}
le rendre facultatif.NODE_PORT=${PORT=8080}
(notez l'égal) mais pas le: - syntaxenode ./script.js server %PORT%
. Pensez à utiliser cross-var et cross-env .Vous pouvez également faire cela:
Dans
package.json
:Dans
cool.js
:En CLI:
Devrait produire:
Mise à jour: En utilisant npm 3.10.3, il semble qu'il minuscule les
process.env.npm_config_
variables? J'utilise aussibetter-npm-run
, donc je ne sais pas si ce comportement est par défaut vanille ou non, mais cette réponse est active. Au lieu deprocess.env.npm_config_myVar
, essayezprocess.env.npm_config_myvar
la source
process.env.npm_config_myVar
renvoie vrai, pas la valeur.La réponse de jakub.g est correcte, cependant un exemple utilisant grunt semble un peu complexe.
Donc, ma réponse la plus simple:
- Envoi d'un argument de ligne de commande à un script npm
Syntaxe pour l'envoi d'arguments de ligne de commande à un script npm:
Imaginez que nous ayons une tâche de démarrage npm dans notre package.json pour lancer le serveur de développement webpack:
Nous l'exécutons à partir de la ligne de commande avec
npm start
Maintenant, si nous voulons passer un port au script npm:
exécuter cela et passer le port par exemple 5000 via la ligne de commande serait comme suit:
- Utilisation de la configuration de package.json:
Comme mentionné par jakub.g , vous pouvez également définir des paramètres dans la configuration de votre package.json
npm start
utilisera le port spécifié dans votre configuration, ou bien vous pouvez le remplacer- Définition d'un paramètre dans votre script npm
Un exemple de lecture d'un ensemble de variables dans votre script npm. Dans cet exemple
NODE_ENV
lire NODE_ENV en server.js soit prod ou dev
la source
"start:prod": "NODE_ENV=prod node server.js"
danspackage.json
ne fonctionnera pas sur Windows, sauf si vous utilisez cross-env"start": "webpack-dev-server --port process.env.npm_package_config_myPort || 8080" },
Devrait être en"start": "webpack-dev-server --port $npm_package_config_myPort || 8080" },
fonction de mon utilisation expliquée par ce tutoriel . La référence de processus peut apparemment être utilisée dans le javascript.npm 2.x support cli args
Commander
npm run-script start -- --foo=3
Package.json
"start": "node ./index.js"
Index.js
console.log('process.argv', process.argv);
la source
Utilisez-le
process.argv
dans votre code, puis fournissez simplement un suivi$*
de l'entrée de valeur de vos scripts.À titre d'exemple, essayez-le avec un script simple qui enregistre simplement les arguments fournis pour standardiser
echoargs.js
:package.json:
Exemples:
process.argv[0]
est l'exécutable (nœud),process.argv[1]
est votre script.Testé avec npm v5.3.0 et node v8.4.0
la source
--
des arguments, par exemple -npm run demo.js --skip
, cela fonctionne si ajouté un supplément--
, par exemple -npm run demo.js -- --skip
echoargs.js
fichier de script séparé ?adb
pour pousser un.db
fichier vers l'émulateur Android et accepte un paramètre pour le chemin local du.db
fichier à pousser, qui est le premier paramètre deadb push
. Quelque chose comme ça:"db:push": "adb push process.argv.slice(2) /data/data/com.cntral.app/databases/database.db"
et je veux l'appeler avecnpm run db:push /Users/joshuapinter/Downloads/updated.db
. Des pensées?Si vous souhaitez passer des arguments au milieu d'un script npm, au lieu de les avoir simplement ajoutés à la fin, les variables d'environnement en ligne semblent fonctionner correctement:
Ici,
npm run dev
passe le-w
drapeau de surveillance à babel, maisnpm run start
exécute simplement une génération régulière une fois.la source
npm run dev
,npm start
J'avais utilisé ce one-liner dans le passé, et après un peu de temps loin de Node.js a dû essayer de le redécouvrir récemment. Semblable à la solution mentionnée par @francoisrv, il utilise les
node_config_*
variables.Créez le
package.json
fichier minimal suivant :Exécutez la commande suivante:
Observez la sortie suivante:
Tout cela est bien documenté dans la documentation officielle de npm:
Remarque: L'en- tête Variables d'environnement explique que les variables à l'intérieur des scripts se comportent différemment de ce qui est défini dans la documentation. Cela est vrai en ce qui concerne la casse , que l'argument soit défini avec un espace ou un signe égal .
Remarque: Si vous utilisez un argument avec des tirets, ceux-ci seront remplacés par des traits de soulignement dans la variable d'environnement correspondante. Par exemple,
npm run example --foo-bar=baz
correspondrait à${npm_config_foo_bar}
.Remarque: Pour les utilisateurs non-WSL de Windows, voir les commentaires de @Doctor Blue ci-dessous ... TL; DR remplacer
${npm_config_foo}
par%npm_config_foo%
.la source
npm run argument --foo=bar
), mais la variable n'est pas remplacé:"The value of --foo is '${npm_config_foo}'"
. Fonctionnant sur Windows 10 si cela est important, avec la version 6.9.0 de NPM.%npm_config_foo%
place. Ligne de commande Windows pure / PowerShell ici. (Vous n'avez pas le choix non plus.)Cela ne répond pas vraiment à votre question, mais vous pouvez toujours utiliser des variables d'environnement à la place:
Puis dans votre fichier server.js:
la source
La plupart des réponses ci-dessus couvrent simplement le passage des arguments dans votre script NodeJS, appelé par npm. Ma solution est à usage général.
Enveloppez simplement le script npm avec un
sh
appel d' interpréteur de shell (par exemple ) et passez les arguments comme d'habitude. La seule exception est que le premier numéro d'argument est0
.Par exemple, vous souhaitez ajouter le script npm
someprogram --env=<argument_1>
, oùsomeprogram
imprime simplement la valeur de l'env
argument:package.json
Lorsque vous l'exécutez:
la source
D'après ce que je vois, les gens utilisent des scripts package.json lorsqu'ils souhaitent exécuter le script de manière plus simple. Par exemple, pour utiliser
nodemon
celui installé dans les node_modules locaux, nous ne pouvons pas appelernodemon
directement à partir du cli, mais nous pouvons l'appeler en utilisant./node_modules/nodemon/nodemon.js
. Donc, pour simplifier ce long typage, on peut mettre ça ...... puis appelez
npm start
pour utiliser 'nodemon' qui a app.js comme premier argument.Ce que j'essaie de dire, si vous voulez juste démarrer votre serveur avec la
node
commande, je ne pense pas que vous ayez besoin de l'utiliserscripts
. Tapernpm start
ounode app.js
avoir le même effort.Mais si vous voulez utiliser
nodemon
et passer un argument dynamique, n'utilisez pas nonscript
plus. Essayez plutôt d'utiliser un lien symbolique.Par exemple, utiliser la migration avec
sequelize
. Je crée un lien symbolique ...ln -s node_modules/sequelize/bin/sequelize sequelize
... Et je peux passer tout argument quand je l'appelle ...
etc...
À ce stade, l'utilisation de symlink est la meilleure façon de comprendre, mais je ne pense pas vraiment que ce soit la meilleure pratique.
J'espère également avoir votre avis sur ma réponse.
la source
Remarque: Cette approche modifie votre
package.json
à la volée, utilisez-la si vous n'avez pas d'alternative.J'ai dû passer des arguments de ligne de commande à mes scripts qui ressemblaient à:
Donc, cela signifie que je démarre mon application avec
npm run start
.Maintenant, si je veux passer quelques arguments, je commencerais par peut-être:
Ce que cela fait est:
npm run build && npm run watch -- --config=someConfig
. Le problème, c'est qu'il ajoute toujours les arguments à la fin du script. Cela signifie que tous les scripts chaînés n'obtiennent pas ces arguments (Args peut ou non être requis par tous, mais c'est une autre histoire.). De plus, lorsque les scripts liés sont appelés, ces scripts n'obtiendront pas les arguments passés. ie lewatch
script n'obtiendra pas les arguments passés.L'utilisation de la production de mon application est en tant que
.exe
, donc passer les arguments dans l'exe fonctionne bien mais si vous voulez le faire pendant le développement, cela devient problématique.Je n'ai pas trouvé de moyen approprié pour y parvenir, c'est donc ce que j'ai essayé.
J'ai créé un fichier javascript:
start-script.js
au niveau parent de l'application, j'ai un "default.package.json" et au lieu de maintenir "package.json", je maintiens "default.package.json". Le but destart-script.json
est de liredefault.package.json
, d'extrairescripts
et de recherchernpm run scriptname
puis d'ajouter les arguments passés à ces scripts. Après cela, il en créera un nouveaupackage.json
et copiera les données de default.package.json avec les scripts modifiés, puis appelleranpm run start
.Maintenant, au lieu de faire
npm run start
, je faisnode start-script.js --c=somethis --r=somethingElse
L'exécution initiale semble bonne, mais n'a pas été testée de manière approfondie. Utilisez-le si vous le souhaitez pour le développement d'applications.
la source
J'ai trouvé cette question alors que j'essayais de résoudre mon problème avec l'exécution de la commande sequelize seed: generate cli:
Permettez-moi d'aller droit au but. Je voulais avoir une courte commande de script dans mon fichier package.json et fournir l'argument --name en même temps
La réponse est venue après quelques expériences. Voici ma commande dans package.json
... et voici un exemple de l'exécuter dans le terminal pour générer un fichier de départ pour un utilisateur
FYI
la source
-- --arg1, ...
?npm run script_target - <argument> Fondamentalement, c'est la façon de passer les arguments de la ligne de commande, mais cela ne fonctionnera que si le script n'a qu'une seule commande en cours d'exécution comme j'exécute une commande, c'est-à-dire npm run start - 4200
Cela s'exécutera pour transmettre les paramètres de ligne de commande, mais que se passe-t-il si nous exécutons plus d'une commande ensemble, comme npm run build c: / workspace / file
mais il interprétera comme ceci lors de l'exécution de la copie c: / fichier && ng build c: / espace de travail / fichier et nous attendons quelque chose comme cette copie c: / fichier c: / espace de travail / fichier && ng build
Remarque: - le paramètre de ligne de commande ne fonctionne donc que si une seule commande d'un script est attendue
J'ai lu quelques réponses ci-dessus dans lesquelles certains écrivent que vous pouvez accéder au paramètre de ligne de commande en utilisant $ symbol mais cela ne fonctionnera pas
la source
Je sais qu'il y a déjà une réponse approuvée, mais j'aime un peu cette approche JSON.
Habituellement, j'ai comme 1 var dont j'ai besoin, comme un nom de projet, donc je trouve cela rapide et simple.
J'ai aussi souvent quelque chose comme ça dans mon package.json
Et étant gourmand, je veux "tout ça", NODE_ENV et les trucs d'argument de la ligne CMD.
Vous accédez simplement à ces choses comme ça dans votre fichier (dans mon cas local.js)
Vous avez juste besoin d'avoir ce bit au-dessus (j'utilise v10.16.0 btw)
Anyhoo, la question a déjà répondu. Je pensais partager, car j'utilise beaucoup cette méthode.
la source