Asm*_*ean 0 build-automation makefile
我试图让我的Makefile只在文件发生变化时才重新编译,它对Java目标起着很好的作用,但不适用于JS.报告没有任何错误,但是当我make bundle第二次运行时,它仍然会重新运行所有这些命令.
find ...手动运行的输出似乎产生了预期的结果,没有额外或缺少的线.
JAVA_SRC_DIR := .
JAVA_SOURCES := $(shell find $(JAVA_SRC_DIR) -name '*.java' -o -name '*pom.xml')
JS_SRC_DIR := ./ui-bundle
JS_EXCLUDE := \(node_modules\|coverage\)
JS_SOURCES := $(shell find $(JS_SRC_DIR) -name '*.js' -o -name '*.jsx' -o -name '.babelrc' -o -name 'package.json' | grep -v $(JS_EXCLUDE) | grep -v -e '^$')
bundle: $(JS_SOURCES)
npm install
./node_modules/jest-cli/bin/jest.js --verbose
./node_modules/gulp/bin/gulp.js package
service: $(JAVA_SOURCES)
mvn clean install -pl "!integration"
Run Code Online (Sandbox Code Playgroud)
我猜这与它有关,但是当我试图找到哪些文件make认为已经改变时make -d | grep "\(older\|newer\)"它没有找到任何东西,但make -d最后得出结论:
Finished prerequisites of target file `bundle'.
Must remake target `bundle'.
Run Code Online (Sandbox Code Playgroud)
另外make -d似乎尝试运行某种npm命令.
我哪里错了?
问题是它bundle只是规则的名称,规则实际上并不构建名为"bundle"的文件.无论先决条件有多新或多,当您make bundle,Make看到没有这样的文件存在时,推断它必须构建,并执行规则.
如果您希望Make在先决条件未更改时不要执行规则,则必须给它一些内容来比较它们.如果您可以识别规则始终修改的某个文件,则可以将该文件作为目标.我不能提出一个候选人,因为我不知道是什么npm,jest以及gulp做的,但想这jest_output:
jest_output: $(JS_SOURCES)
...
Run Code Online (Sandbox Code Playgroud)
或者你可以有一个名为的实际文件bundle,它作为Make的标记,一个具有名称和修改时间的空文件,没有别的:
bundle: $(JS_SOURCES)
npm install
./node_modules/jest-cli/bin/jest.js --verbose
./node_modules/gulp/bin/gulp.js package
touch bundle
Run Code Online (Sandbox Code Playgroud)