用于构建多个子目录的单个makefile

时间:2018-03-02 09:59:33

标签: javascript makefile

受到http://www.olioapps.com/blog/the-lost-art-of-the-makefile/的启发,我想尝试使用make构建几个JS项目的回购。

我最初尝试做的只是在yarn installpackage.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

然而,这似乎只能检测并运行列表中的第一个项目。

2 个答案:

答案 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