Eu criei um processo muito leve de agrupamento de arquivos JS criados a partir do Typescript. TLDR: corro tsc
para gerar js/foo.js
para cada arquivo src/foo.ts
. Então eu agrupo os arquivos JS usando esbuild
. Aqui está o gráfico aproximado de dependência:
pkg/ js/ src/
a.js -> a.js -. .-> a.ts
b.js -> b.js --> .compiled -+-> b.ts
c.js -> c.js -' '-> c.ts
Como tsc
o Java compila toda a base de código de uma só vez, incondicionalmente, em vez de arquivos de origem individuais, usei um .compiled
arquivo como proxy intermediário para indicar tsc
a compilação.
E aqui está o Makefile diluído, mas independente e funcional (ligeiramente editado desde a postagem original):
.PHONY: bundle
bundle: .bundled
src_stems := a b c
ts_files := $(addsuffix .ts,$(addprefix src/,$(src_stems)))
js_files := $(addsuffix .js,$(addprefix js/,$(src_stems)))
pkg_files := $(addsuffix .js,$(addprefix pkg/,$(src_stems)))
.bundled: $(pkg_files)
touch $@
pkg:
mkdir -p $@
pkg/%.js: js/%.js | pkg
cp $< $@
$(js_files): .compiled
# Simulate running tsc
.compiled: $(ts_files)
mkdir -p js
touch $(js_files)
touch $@
.PHONY:
clean:
rm -rf pkg js .compiled .bundled
Tudo funciona como esperado make clean bundle
.
$ mkdir -p src
$ touch src/{a,b,c}.ts
$ make
No entanto, estou surpreso com o comportamento ao agrupar após a atualização de um único arquivo. Por exemplo, executando isto após uma compilação limpa:
$ touch src/b.ts # I modify a single source
$ make
mkdir -p js
touch js/a.js js/b.js js/c.js
touch .compiled
cp js/b.js pkg/b.js <- Note a.js isn't being bundled!
cp js/c.js pkg/c.js
touch .bundled
E, se eu executar make
novamente, o arquivo ausente será recuperado:
$ make
cp js/a.js pkg/a.js
touch .bundled
Tentei depurar, make -d
mas não consigo descobrir por que, quando tenho atualizações parciais, são necessárias duas execuções para serem a.js
agrupadas. Observe também que sempre a.js
fica de fora, o que suponho ser porque é a primeira fonte a ser listada.
Algumas linhas de depuração de make -d
:
Prerequisite 'js/a.js' is older than target 'pkg/a.js'.
...
Prerequisite 'js/b.js' is newer than target 'pkg/b.js'.
...
Prerequisite 'js/c.js' is newer than target 'pkg/c.js'.
O diagnóstico da pkg/a.js
linha está em desacordo com o resto. Na verdade, todos os js/*.js
arquivos terão o mesmo carimbo de data/hora.
O que estou fazendo de errado? Há outro conjunto de regras que devo considerar?