Executando tarefas gulp com make
Um dos meus objetivos ao desenvolver qualquer coisa é tornar a vida de outros desenvolvedores mais fácil. Quero que eles possam clonar um repo e, com um único comando, estar prontos para uso. Make
já existe há algum tempo e ainda é muito útil.
Tenho alguns projetos de brinquedo usando Node.js e uma coisa que gosto npm
é que você pode ter todas as suas dependências dentro do escopo (diretório) do seu projeto em node_modules
. Algumas dessas dependências de desenvolvimento devem ser instaladas como módulos globais ( npm install -g <module>
), exigindo que você as instale de antemão – e é isso que me esforço para evitar.
Se você simplesmente executar npm install
todas as dependências de runtime e dev serão instaladas nesse node_modules
diretório, e cada pacote que deveria ser instalado globalmente terá um executável em node_modules/.bin
. Sabendo disso, você pode escrever Makefile
s muito simples com objetivos como test:;@node_modules/.bin/mocha
¹ . O próprio NPM fornece uma maneira de executar scripts , mas é um tanto limitante.
O projeto no qual estou trabalhando atualmente está usando o gulp para construir nossos ativos de cliente da web e é essencialmente um módulo de linha de comando, exigindo que seja instalado globalmente para que possa ser executado gulp run
ou gulp test
, por exemplo. No espírito de tentar evitar dependências externas ao projeto, achei que seria bom se pudéssemos executar o gulp tasks sem ter que instalá-lo globalmente ou ter que preceder node_modules/.bin
todas as vezes. Portanto, embora ainda não estejamos usando o seguinte Makefile
em nosso projeto, achei o exercício de escrever um make
“invólucro” gulp
muito interessante.
bin = node_modules/.bin/gulp
files=$(filter-out Makefile,$(wildcard *))
install:; @npm install
$(files) %:;@$(bin) $@
.PHONY: install $(files)
Dissecando:
bin = node_modules/.bin/gulp
: aponta para o executável do gulp emnode_modules/.bin
– poderia ser,grunt-cli
se você quiser.files=$(filter-out Makefile,$(wildcard *))
: isso seleciona todos os arquivos, exceto o próprio Makefile, no diretório raiz.install:; @npm install
: define uma meta padrão; ao rodar apenasmake
vainpm install
todas as suas dependências.$(files) %:;@$(bin) $@
: É aqui que reside o wrapper real, ele simplesmente redireciona todas as chamadas para o que for definido como$(bin)
..PHONY: install $(files)
: diz ao make queinstall
e todos os nomes de arquivos existentes não estão associados aos arquivos.
Com certeza há espaço para melhorias, mas isso atendeu às minhas necessidades até agora.
Felicidades,
– g