受到http://www.olioapps.com/blog/the-lost-art-of-the-makefile/的启发,我想尝试使用make构建几个JS项目的回购。
我最初尝试做的只是在yarn install
或package.json
更改时运行yarn.lock
的规则。如果它只是一个静态规则的规则在链接中解释,只是
node_modules: package.json yarn.lock
yarn install
但是我正在尝试为多个项目执行类似的规则。
我有一个与此类似的目录结构:
Makefile
rocks/js/projectA/package.json
rocks/js/projectA/yarn.lock
rocks/js/projectB/package.json
rocks/js/projectB/yarn.lock
...
等等有几个项目。我已经尝试使用静态模式规则来写出来,但到目前为止已经失败了很多。我的Makefile目前是什么样的
js_rocks = $(addprefix rocks/js/,$(shell ls rocks/js))
%/node_modules: %/package.json %/yarn.lock
cd $(dir $@) && yarn install
$(js_rocks): %: %/node_modules
all: $(js_rocks)
.PHONY: all
然而,这似乎只能检测并运行列表中的第一个项目。
答案 0 :(得分:0)
尝试此更改:
%/node_modules: %/package.json %/yarn.lock
cd $(dir $@) && ( yarn install ; cd - )
在第一个目录之后,当前目录保留在node_modules目录中。从那里,make
找不到更多目标。
答案 1 :(得分:0)
事实证明,主要问题并非真正出现在目标本身,而是因为我误解了make的默认目标始终是all
,而实际上它始终是第一个目标(谢谢)你@shawnhcorey)。
因此,根据我得到的反馈以及对make的更多阅读,这是我现在拥有的Makefile,它可以为我的所有子项目运行yarn install
:)
js_rocks = $(wildcard rocks/js/*)
node_modules = $(addsuffix /node_modules,$(js_rocks))
all: $(node_modules)
clean:
rm -rf $(node_modules)
$(node_modules): %/node_modules: %/package.json %/yarn.lock
cd $*; yarn install
.PHONY: all