Executar tarefas de gole ou grunhir com make

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. Makejá 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 installtodas as dependências de runtime e dev serão instaladas nesse node_modulesdiretório, e cada pacote que deveria ser instalado globalmente terá um executável em node_modules/.bin. Sabendo disso, você pode escrever Makefiles 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 runou 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/.bintodas as vezes. Portanto, embora ainda não estejamos usando o seguinte Makefileem nosso projeto, achei o exercício de escrever um make“invólucro” gulpmuito interessante.

bin = node_modules/.bin/gulp
files
=$(filter-out Makefile,$(wildcard *))
install
:; @npm install
$
(files) %:;@$(bin) $@
.PHONY: install $(files)

Dissecando:

  1. bin = node_modules/.bin/gulp: aponta para o executável do gulp em node_modules/.bin– poderia ser, grunt-clise você quiser.
  2. files=$(filter-out Makefile,$(wildcard *)): isso seleciona todos os arquivos, exceto o próprio Makefile, no diretório raiz.
  3. install:; @npm install: define uma meta padrão; ao rodar apenas makevai npm installtodas as suas dependências.
  4. $(files) %:;@$(bin) $@: É aqui que reside o wrapper real, ele simplesmente redireciona todas as chamadas para o que for definido como $(bin).
  5. .PHONY: install $(files): diz ao make que installe 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