作为this question的后续行动,我还有一个案例可以在几个小时的修修补丁中找到答案。
这是makefile目前的样子:
output = $(shell find lib -type f -name '*build.js' -or -name '*build.css')
myth = ./node_modules/.bin/myth
duo = ./node_modules/.bin/duo
build: $(output)
%/build/build.js: %/index.js %/lib/*.js node_modules component.json
@mkdir -p '$(@D)'
@$(duo) '$*'/index.js > '$@'
%/build/build.css: %/index.css %/lib/*.css node_modules component.json
@mkdir -p '$(@D)'
@$(duo) '$*'/index.css | $(myth) > '$@'
node_modules: package.json
@n 0.11.13
@npm install
@touch node_modules # make sure folder is updated later than package.json
我在其他问题的最佳答案之上添加的内容是%/lib/*.js
和%/lib/*.css
就在这里:
%/build/build.js: %/index.js %/lib/*.js node_modules component.json
如果您拥有所有必需的文件,那似乎工作正常,这意味着目录结构如下所示:
component.json
lib/
lib/page/
lib/page/build/
lib/page/build/build.js
lib/page/index.js
lib/page/lib/
lib/page/lib/a.js
lib/page/lib/b.js
lib/popup/
lib/popup/build/
lib/popup/build/build.js
lib/popup/index.js
lib/popup/lib/
lib/popup/lib/a.js
lib/popup/lib/b.js
node_modules/
package.json
使用当前的make任务,如果更改该文件夹中的文件,它将重建正确的子项目/文件夹(页面/弹出/等)。但是,如果您缺少其中一个依赖项,则不会重建。
例如,在以下文件夹结构中,"弹出"子项目将构建正常(因为它仍然具有所有必需的目标依赖项)。然而,"页"子项目无法构建,因为它缺少任何%/lib/*.js
个文件:
component.json
lib/
lib/page/
lib/page/build/
lib/page/build/build.js
lib/page/index.js
lib/popup/
lib/popup/build/
lib/popup/build/build.js
lib/popup/index.js
lib/popup/lib/
lib/popup/lib/a.js
lib/popup/lib/b.js
node_modules/
package.json
因此,在这种情况下,它构建的唯一方法是,如果您同时拥有%/index.js
和某个匹配%/lib/*.js
的文件。
我的问题是,你如何让它适用于这两种情况?
基本上我想要的是重建一个子项目,如果除了build / build.js 中的任何文件发生变化。也就是说,如果任何文件已更改与目标名称不匹配,则运行该任务。
你是怎么做到的?
我试过这个:
%/build/build.js: %/**/*.js node_modules component.json
但是这出错了:
make: Circular lib/page/build/build.js <- lib/page/build/build.js dependency dropped.
因为它与目标名称匹配。
似乎也可以使用$(filter pattern, text)
或$(filter-out, pattern, text)
,但我还没有成功。
%/build/build.js: $(filter-out %/build/build.js, %/**/*.js) node_modules component.json
这似乎可能包含与%/**/*.js
匹配的所有文件(如果存在,则为lib/page/index.js
和lib/page/lib/a.js
),并且只排除lib/page/build/build.js
。但是,我没有运气,也许我只是错误地使用它。
你如何让这个工作?