我试图让我的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"
我猜测这与它有关,但是当我尝试找到make
认为已更改make -d | grep "\(older\|newer\)"
的文件时,它找不到任何内容,但是{ {1}}结束于:
make -d
此外 Finished prerequisites of target file `bundle'.
Must remake target `bundle'.
似乎尝试运行某种npm命令。
我哪里错了?
答案 0 :(得分:5)
问题是bundle
只是规则的名称,规则实际上并不构建名为“bundle”的文件。无论先决条件有多新或多旧,当您make bundle
时,Make看到没有这样的文件,推断它必须构建,并执行规则。
如果您希望Make在没有更改先决条件时禁止执行规则,您必须给它一些东西来比较它们。如果您可以识别规则始终修改的某个文件,则可以将该文件作为目标。我不能建议候选人,因为我不知道npm
,jest
和gulp
做了什么,但假设它是jest_output
:
jest_output: $(JS_SOURCES)
...
或者您可以拥有一个名为bundle
的实际文件,该文件用作Make的标记,一个具有名称和修改时间的空文件:
bundle: $(JS_SOURCES)
npm install
./node_modules/jest-cli/bin/jest.js --verbose
./node_modules/gulp/bin/gulp.js package
touch bundle