Normalmente, podemos executar a tarefa gulp no console através de algo parecido gulp mytask. Existe alguma maneira que eu possa passar parâmetro para gulp task? Se possível, por exemplo, mostre como isso pode ser feito.
Resposta muito bem escrita, obrigado pelos exemplos!
Allen Rice
como alguém acessa isso em javascript?
vini
Se você usar gole com yargs, observe o seguinte: Se você tem uma tarefa 'cliente' e luto para usar yargs construção em Parâmetro verificação de comandos necessários: comando ( "cliente", "Criar um diretório do cliente")
Suther
Veja meu comentário abaixo, se você quiser usar o parâmetro yargs embutido, verifique os 'comandos' necessários, juntamente com o gulp: stackoverflow.com/a/41412558/1256697
Se você tiver certeza de que o parâmetro desejado está na posição correta, os sinalizadores não serão necessários. ** Basta usar (neste caso):
var option = process.argv[4];//set to '123'
MAS: como a opção pode não estar definida ou estar em uma posição diferente, considero que uma idéia melhor seria algo como:
var option, i = process.argv.indexOf("--option");if(i>-1){
option = process.argv[i+1];}
Dessa forma, você pode lidar com variações em várias opções, como:
//task should still find 'option' variable in all cases
gulp mytask --newoption somestuff --option 123
gulp mytask --option 123--newoption somestuff
gulp mytask --flag --option 123
** Edit: true para scripts de nó, mas o gulp interpreta qualquer coisa sem um "-" inicial como outro nome de tarefa. Portanto, o uso gulp mytask 123falhará porque o gulp não consegue encontrar uma tarefa chamada '123'.
Há um erro de digitação em "var option, i = process, argv.indexOf (" - option ");". Eu acredito que deveria ser proccess.argv.
Luis Paulo Lohmann 16/10
Ah, deveria. Corrigido. Obrigado @luis
Trevedhek
Eu só queria verificar o sinalizador --dev, para poder distinguir entre produção e ambientes mais baixos. Isso faz o truque sem adicionar dependências extras. Obrigado!
b01
1
Para mim, gulp myTask --productionresulta em process.argvigual a[pathToNode, pathToGulp, 'myTask', '--production']
Sung Cho
2
Provavelmente mudou, já vi alguns exemplos antigos com a mesma diferença. De qualquer forma, você pode simplesmente depurá-lo e ver o seu caso. Esta deve ser a resposta aceita, pois possui zero dependências.
Juan
19
Passar um parâmetro para o gulp pode significar algumas coisas:
Da linha de comando para o gulpfile (já exemplificado aqui).
Do corpo principal do script gulpfile.js para tarefas de gulp.
De uma tarefa de gole para outra tarefa de gole.
Aqui está uma abordagem da passagem de parâmetros do gulpfile principal para uma tarefa gulp. Movendo a tarefa que precisa do parâmetro para seu próprio módulo e agrupando-a em uma função (para que um parâmetro possa ser passado) .:
// ./gulp-tasks/my-neat-task.js file
module.exports =function(opts){
opts.gulp.task('my-neat-task',function(){
console.log('the value is '+ opts.value );});};
//main gulpfile.js file//...do some work to figure out a value called val...var val ='some value';//pass that value as a parameter to the 'my-neat-task' gulp task
require('./gulp-tasks/my-neat-task.js')({ gulp: gulp, value: val});
Isso pode ser útil se você tiver muitas tarefas de gulp e quiser passar algumas configurações ambientais úteis. Não tenho certeza se ele pode funcionar entre uma tarefa e outra.
A resposta de @ Ethan funcionaria completamente. Da minha experiência, a maneira mais nó é usar variáveis de ambiente. É uma maneira padrão de configurar programas implantados em plataformas de hospedagem (por exemplo, Heroku ou Dokku).
Para passar o parâmetro da linha de comando, faça o seguinte:
Desenvolvimento:
gulp dev
Produção:
NODE_ENV=production gulp dev
A sintaxe é diferente, mas muito Unix, e é compatível com Heroku, Dokku, etc.
Você pode acessar a variável em seu código em process.env.NODE_ENV
Eu precisava adivinhar o ambiente a partir do nome da tarefa, tenho uma tarefa 'dev' e uma tarefa 'prod'.
Quando eu corro gulp prod, deve ser definido como ambiente de prod. Quando eu corro gulp devou qualquer outra coisa, deve ser definido como ambiente de desenvolvimento.
Para isso, basta verificar o nome da tarefa em execução:
Sei que estou atrasado para responder a essa pergunta, mas gostaria de acrescentar algo à resposta de @ Ethan, a resposta mais votada e aceita.
Podemos usar yargspara obter o parâmetro da linha de comando e, com isso, também podemos adicionar nosso próprio alias para alguns parâmetros como follow.
var args = require('yargs').alias('r','release').alias('d','develop').default('release',false).argv;
A seguir está o uso do alias, conforme fornecido na documentação de yargs. Também podemos encontrar mais yargsfunções lá e tornar a experiência de passagem da linha de comando ainda melhor.
.alias (chave, alias)
Defina os nomes das chaves como equivalentes, de forma que as atualizações em uma chave sejam propagadas para aliases e vice-versa.
Opcionalmente .alias () pode levar um objeto que mapeia chaves para aliases. Cada chave deste objeto deve ser a versão canônica da opção e cada valor deve ser uma sequência ou uma matriz de sequências.
Respostas:
É um recurso que os programas não podem ficar sem. Você pode tentar yargs .
Você pode usá-lo assim:
No código, por exemplo:
Para seu entendimento:
Espero que você possa levá-lo daqui.
Há outro plugin que você pode usar, minimista. Há outro post onde há bons exemplos para yargs e minimist: ( É possível passar uma sinalização para o Gulp para que ele execute tarefas de maneiras diferentes? )
fonte
(argv.production === undefined) ? false : true;
é equivalente aargv.production !== undefined
.Se você quiser evitar adicionar dependências extras, achei os nós
process.argv
úteis:Então, o seguinte:
deve exibir:
Se você tiver certeza de que o parâmetro desejado está na posição correta, os sinalizadores não serão necessários. ** Basta usar (neste caso):
MAS: como a opção pode não estar definida ou estar em uma posição diferente, considero que uma idéia melhor seria algo como:
Dessa forma, você pode lidar com variações em várias opções, como:
** Edit: true para scripts de nó, mas o gulp interpreta qualquer coisa sem um "-" inicial como outro nome de tarefa. Portanto, o uso
gulp mytask 123
falhará porque o gulp não consegue encontrar uma tarefa chamada '123'.fonte
gulp myTask --production
resulta emprocess.argv
igual a[pathToNode, pathToGulp, 'myTask', '--production']
Passar um parâmetro para o gulp pode significar algumas coisas:
Aqui está uma abordagem da passagem de parâmetros do gulpfile principal para uma tarefa gulp. Movendo a tarefa que precisa do parâmetro para seu próprio módulo e agrupando-a em uma função (para que um parâmetro possa ser passado) .:
Isso pode ser útil se você tiver muitas tarefas de gulp e quiser passar algumas configurações ambientais úteis. Não tenho certeza se ele pode funcionar entre uma tarefa e outra.
fonte
Há uma receita oficial de gole para isso usando minimist .
https://github.com/gulpjs/gulp/blob/master/docs/recipes/pass-arguments-from-cli.md
O básico está usando o minimist para separar os argumentos cli e combiná-los com opções conhecidas:
O que analisaria algo como
Informações mais completas na receita.
fonte
Se você deseja usar parâmetros de ambiente e outros utilitários, como também o log, pode usar o gulp-util
Atualizar
Agora o gulp-util está obsoleto. Você pode usar o minimist .
fonte
A resposta de @ Ethan funcionaria completamente. Da minha experiência, a maneira mais nó é usar variáveis de ambiente. É uma maneira padrão de configurar programas implantados em plataformas de hospedagem (por exemplo, Heroku ou Dokku).
Para passar o parâmetro da linha de comando, faça o seguinte:
Desenvolvimento:
gulp dev
Produção:
NODE_ENV=production gulp dev
A sintaxe é diferente, mas muito Unix, e é compatível com Heroku, Dokku, etc.
Você pode acessar a variável em seu código em
process.env.NODE_ENV
MYAPP=something_else gulp dev
definiria
process.env.MYAPP === 'something_else'
Essa resposta pode lhe dar outras idéias.
fonte
Aqui está minha amostra de como eu o uso. Para a tarefa css / less. Pode ser aplicado para todos.
fonte
Aqui está outra maneira sem módulos extras:
Eu precisava adivinhar o ambiente a partir do nome da tarefa, tenho uma tarefa 'dev' e uma tarefa 'prod'.
Quando eu corro
gulp prod
, deve ser definido como ambiente de prod. Quando eu corrogulp dev
ou qualquer outra coisa, deve ser definido como ambiente de desenvolvimento.Para isso, basta verificar o nome da tarefa em execução:
fonte
Se você usa gulp com yargs, observe o seguinte:
Se você possui uma tarefa 'customer' e não deseja usar o yargs build na verificação de parâmetros para os comandos necessários:
.command("customer <place> [language]","Create a customer directory")
chame-o com:yargs sempre emitirá um erro, indicando que não há comandos suficientes atribuídos à chamada, mesmo que você tenha !! -
Experimente e adicione apenas um dígito ao comando (para torná-lo diferente do nome da tarefa gulp) ... e ele funcionará:
.command("customer1 <place> [language]","Create a customer directory")
Isso é porque o gulp parece acionar a tarefa, antes que o yargs possa verificar esse parâmetro necessário. Me custou horas extras para descobrir isso.
Espero que isso ajude você..
fonte
Sei que estou atrasado para responder a essa pergunta, mas gostaria de acrescentar algo à resposta de @ Ethan, a resposta mais votada e aceita.
Podemos usar
yargs
para obter o parâmetro da linha de comando e, com isso, também podemos adicionar nosso próprio alias para alguns parâmetros como follow.Consulte este link para obter mais detalhes. https://github.com/yargs/yargs/blob/HEAD/docs/api.md
A seguir está o uso do alias, conforme fornecido na documentação de
yargs
. Também podemos encontrar maisyargs
funções lá e tornar a experiência de passagem da linha de comando ainda melhor.fonte
Basta carregá-lo em um novo objeto no processo ..
process.gulp = {}
e fazer com que a tarefa procure lá.fonte