Editar 2014.10.30: É possível passar argumentos para a npm run
partir do npm 2.0.0
A sintaxe é a seguinte:
npm run <command> [-- <args>]
Observe o necessário --
. É necessário separar os parâmetros passados para se npm
comandar e os parâmetros passados para o seu script.
Então, se você tem package.json
"scripts": {
"grunt": "grunt",
"server": "node server.js"
}
Em seguida, os seguintes comandos seriam equivalentes:
grunt task:target
=> npm run grunt -- task:target
node server.js --port=1337
=> npm run server -- --port=1337
Para obter o valor do parâmetro, consulte esta pergunta . Para ler parâmetros nomeados, provavelmente é melhor usar uma biblioteca de análise como yargs ou minimist ; O nodejs expõe process.argv
globalmente, contendo valores de parâmetros da linha de comandos, mas essa é uma API de baixo nível (matriz de cadeias separada por espaço em branco, conforme fornecido pelo sistema operacional ao executável do nó).
Editar 2013.10.03: atualmente não é possível diretamente. Mas há um problemanpm
relacionado ao GitHub aberto para implementar o comportamento que você está solicitando. Parece que o consenso é que isso seja implementado, mas isso depende de outro problema que foi resolvido antes.
Resposta original: Como uma solução alternativa (embora não muito útil), você pode fazer o seguinte:
Diga o nome do seu pacote de package.json
is myPackage
e você também
"scripts": {
"start": "node ./script.js server"
}
Em seguida, adicione package.json
:
"config": {
"myPort": "8080"
}
E no seu 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
Dessa forma, por padrão npm start
, usará 8080. No entanto, você pode configurá-lo (o valor será armazenado npm
em seu armazenamento interno):
npm config set myPackage:myPort 9090
Em seguida, ao chamar npm start
, 9090 será usado (o padrão de package.json
será substituído).
yargs
; todos os parâmetros após o--
podem ser analisados perfeitamente em seu script.-- --args
porcaria santa que é estranho, mas tudo bem #Você pediu para poder executar algo parecido
npm start 8080
. Isso é possível sem a necessidade de modificarscript.js
ou configurar os arquivos da seguinte maneira.Por exemplo, no seu
"scripts"
valor JSON, inclua--E então a partir da linha de comando:
Eu confirmei que isso funciona usando o bash e o npm 1.4.23. Observe que esta solução alternativa não exige que o problema npm 3494 do GitHub seja resolvido.
fonte
node ./script.js server ${PORT:-8080}
torná-lo opcional.NODE_PORT=${PORT=8080}
(notive a igual), mas não o: - sintaxenode ./script.js server %PORT%
. Considere usar cross-var e cross-env .Você também pode fazer isso:
Em
package.json
:Em
cool.js
:Na CLI:
Saída deve:
Atualização: Usando o npm 3.10.3, parece que ele apresenta minúsculas as
process.env.npm_config_
variáveis? Também estou usandobetter-npm-run
, por isso não tenho certeza se esse é o comportamento padrão da baunilha ou não, mas esta resposta está funcionando. Em vez deprocess.env.npm_config_myVar
, tenteprocess.env.npm_config_myvar
fonte
process.env.npm_config_myVar
retorna verdadeiro, não o valor.A resposta de jakub.g está correta, no entanto, um exemplo usando o grunhido parece um pouco complexo.
Então, minha resposta mais simples:
- Enviando um argumento de linha de comando para um script npm
Sintaxe para enviar argumentos de linha de comando para um script npm:
Imagine que temos uma tarefa de inicialização do npm em nosso package.json para iniciar o servidor de desenvolvimento webpack:
Executamos isso a partir da linha de comando com
npm start
Agora, se queremos passar uma porta para o script npm:
executando isso e passando a porta, por exemplo, 5000 via linha de comando, seria o seguinte:
- Usando a configuração package.json:
Como mencionado no jakub.g , você pode definir parâmetros na configuração do seu package.json
npm start
usará a porta especificada em sua configuração ou, em alternativa, você pode substituí-la- Definindo um parâmetro no seu script npm
Um exemplo de leitura de uma variável definida no seu script npm. Neste exemplo
NODE_ENV
leia NODE_ENV em server.js quer prod ou dev
fonte
"start:prod": "NODE_ENV=prod node server.js"
empackage.json
não funcionará no Windows, a menos que você use cross-env"start": "webpack-dev-server --port process.env.npm_package_config_myPort || 8080" },
deve estar de"start": "webpack-dev-server --port $npm_package_config_myPort || 8080" },
acordo com o meu uso explicado neste tutorial . O processo ref pode ser usado dentro do javascript aparentemente.npm 2.x cli args de suporte
Comando
npm run-script start -- --foo=3
Package.json
"start": "node ./index.js"
Index.js
console.log('process.argv', process.argv);
fonte
Use
process.argv
no seu código e forneça apenas uma$*
entrada para o valor dos scripts.Como exemplo, tente com um script simples que apenas registra os argumentos fornecidos para padronizar
echoargs.js
:package.json:
Exemplos:
process.argv[0]
é o executável (nó),process.argv[1]
é o seu script.Testado com npm v5.3.0 e nó v8.4.0
fonte
--
de argumentos, por exemplo -npm run demo.js --skip
, ele funciona se acrescentou um extra--
, por exemplo -npm run demo.js -- --skip
echoargs.js
arquivo de script separado ?adb
para enviar um.db
arquivo para o emulador do Android e aceita um parâmetro para o caminho local do.db
arquivo para enviar para ele, que é o primeiro parâmetro deadb push
. Algo assim:"db:push": "adb push process.argv.slice(2) /data/data/com.cntral.app/databases/database.db"
e eu quero chamá-lo comnpm run db:push /Users/joshuapinter/Downloads/updated.db
. Alguma ideia?Se você deseja passar argumentos para o meio de um script npm, em vez de apenas anexá-los ao final, as variáveis de ambiente embutidas parecem funcionar bem:
Aqui,
npm run dev
passa a-w
bandeira de observação para babel, masnpm run start
apenas executa uma compilação regular uma vez.fonte
npm run dev
,npm start
Eu estava usando essa linha única no passado e, depois de um tempo longe do Node.js, tentei redescobri-la recentemente. Semelhante à solução mencionada por @francoisrv, utiliza as
node_config_*
variáveis.Crie o seguinte
package.json
arquivo mínimo :Execute o seguinte comando:
Observe a seguinte saída:
Tudo isso está bem documentado na documentação oficial do npm:
Nota: O cabeçalho Variáveis de ambiente explica que as variáveis contidas nos scripts se comportam de maneira diferente do que está definido na documentação. Isso é verdade quando se trata de distinção entre maiúsculas e minúsculas e também se o argumento é definido com um sinal de espaço ou igual .
Nota: Se você estiver usando um argumento com hífens, eles serão substituídos por sublinhados na variável de ambiente correspondente. Por exemplo,
npm run example --foo-bar=baz
corresponderia a${npm_config_foo_bar}
.Nota: Para usuários não Windows do WSL, consulte os comentários do @Doctor Blue abaixo ... TL; DR substitua
${npm_config_foo}
por%npm_config_foo%
.fonte
npm run argument --foo=bar
), mas a variável não é substituído:"The value of --foo is '${npm_config_foo}'"
. Executando no Windows 10, se isso importa, com a versão 6.9.0 do NPM.%npm_config_foo%
lugar. Linha de comando / PowerShell do Windows puro aqui. (Não tenha escolha também.)Isso realmente não responde à sua pergunta, mas você sempre pode usar variáveis de ambiente:
Em seguida, no seu arquivo server.js:
fonte
A maioria das respostas acima cobre apenas passar os argumentos para o script do NodeJS, chamado por npm. Minha solução é para uso geral.
Apenas envolva o script npm com uma
sh
chamada de interpretador de shell (por exemplo ) e passe os argumentos como de costume. A única exceção é que o primeiro número do argumento é0
.Por exemplo, você deseja adicionar o script npm
someprogram --env=<argument_1>
, ondesomeprogram
apenas imprime o valor doenv
argumento:package.json
Quando você o executa:
fonte
Pelo que vejo, as pessoas usam scripts package.json quando desejam executar o script de maneira mais simples. Por exemplo, para usar
nodemon
o instalado no node_modules local, não podemos chamarnodemon
diretamente do cli, mas podemos chamá-lo usando./node_modules/nodemon/nodemon.js
. Então, para simplificar essa digitação longa, podemos colocar isso ...... então chame
npm start
para usar 'nodemon', que tem app.js como o primeiro argumento.O que estou tentando dizer, se você apenas deseja iniciar seu servidor com o
node
comando, acho que não precisa usá-loscripts
. Digitandonpm start
ounode app.js
tem o mesmo esforço.Mas se você deseja usar
nodemon
e deseja passar um argumento dinâmico, também não usescript
. Tente usar o link simbólico.Por exemplo, usando a migração com
sequelize
. Eu crio um link simbólico ...ln -s node_modules/sequelize/bin/sequelize sequelize
... E eu posso aprovar qualquer discussão quando eu chamo ...
etc ...
Nesse ponto, usar o link simbólico é a melhor maneira de descobrir, mas realmente não acho que seja a melhor prática.
Também espero a sua opinião para a minha resposta.
fonte
Nota: Essa abordagem modifica o seu
package.json
em tempo real, use-o se você não tiver alternativa.Eu tive que passar argumentos de linha de comando para meus scripts, que eram algo como:
Então, isso significa que inicio meu aplicativo
npm run start
.Agora, se eu quiser passar alguns argumentos, começaria talvez:
O que isto faz é:
npm run build && npm run watch -- --config=someConfig
. O problema é que ele sempre anexa os argumentos ao final do script. Isso significa que todos os scripts encadeados não recebem esses argumentos (Args pode ou não ser exigido por todos, mas isso é uma história diferente). Além disso, quando os scripts vinculados são chamados, esses scripts não receberão os argumentos passados. ou seja, owatch
script não receberá os argumentos passados.O uso de produção do meu aplicativo é como um
.exe
, portanto, passar os argumentos no exe funciona bem, mas se você quiser fazer isso durante o desenvolvimento, fica problemático.Não consegui encontrar uma maneira adequada de conseguir isso, então é isso que tentei.
Criei um arquivo javascript:
start-script.js
no nível pai do aplicativo, tenho um "default.package.json" e, em vez de manter "package.json", mantenho "default.package.json". O objetivo destart-script.json
é lerdefault.package.json
, extrairscripts
e procurarnpm run scriptname
e anexar os argumentos passados a esses scripts. Depois disso, ele criará um novopackage.json
e copiará os dados de default.package.json com scripts modificados e depois chamaránpm run start
.Agora, em vez de fazer
npm run start
, eu façonode start-script.js --c=somethis --r=somethingElse
A execução inicial parece boa, mas não foi testada completamente. Use-o, se quiser, para o desenvolvimento de aplicativos.
fonte
Eu encontrei essa pergunta enquanto tentava resolver meu problema com o comando sequelize seed: generate cli:
Deixe-me ir direto ao ponto. Eu queria ter um comando de script curto no meu arquivo package.json e fornecer o argumento --name ao mesmo tempo
A resposta veio após algumas experiências. Aqui está o meu comando no package.json
... e aqui está um exemplo de executá-lo no terminal para gerar um arquivo inicial para um usuário
Para sua informação
fonte
-- --arg1, ...
?npm executa script_target - <argumento> Basicamente, esta é a maneira de passar os argumentos da linha de comando, mas funcionará apenas no caso em que o script tenha apenas um comando em execução, como eu estou executando um comando, ou seja, npm run start - 4200
Isso funcionará para passar parâmetros de linha de comando, mas e se executarmos mais de um comando juntos, como npm run build c: / workspace / file
mas interpretará assim enquanto estiver executando cópia c: / file && ng build c: / espaço de trabalho / arquivo e espera-se que algo parecido com esta cópia c: / arquivo c: / espaço de trabalho / arquivo && ng build
Nota: - portanto, o parâmetro da linha de comando funciona apenas com o anúncio esperado no caso de apenas um comando em um script.
Eu li algumas respostas acima, nas quais alguns deles estão escrevendo que você pode acessar o parâmetro da linha de comando usando o símbolo $, mas isso não vai funcionar
fonte
Eu sei que já existe uma resposta aprovada, mas meio que gosto dessa abordagem JSON.
Normalmente, tenho 1 var de que preciso, como o nome de um projeto, então acho isso rápido e simples.
Também frequentemente tenho algo parecido com isto no meu package.json
E sendo ganancioso, quero "tudo", NODE_ENV e a linha CMD arg.
Você simplesmente acessa essas coisas no seu arquivo (no meu caso, local.js)
Você só precisa ter esse bit acima dele (estou executando a v10.16.0 btw)
Anyhoo, pergunta já respondida. Pensei em compartilhar, pois uso muito esse método.
fonte