如何让Makefile目标同时支持根目录与嵌套目录的node_modules?
解决同时支持根目录与子目录node_modules的Makefile规则问题
问题的核心在于你使用的%/node_modules模式规则要求目标中必须包含路径分隔符/,而根目录的node_modules没有前缀路径,因此无法匹配这个模式。Make会认为根目录的node_modules没有对应的构建规则,且当前文件已经存在(或者不存在但没有规则生成它),所以提示"Nothing to be done"。
要在不重复命令的前提下同时支持两种场景,你可以把构建命令提取为复用的宏或变量,然后分别定义根目录目标和模式目标:
解决方案代码
# 定义复用的安装命令宏 define INSTALL_NODE_MODULES cd $(shell dirname "$<") && npm install && touch node_modules endef # 根目录node_modules的规则 node_modules: package.json $(INSTALL_NODE_MODULES) # 子目录node_modules的模式规则 %/node_modules: %/package.json $(INSTALL_NODE_MODULES)
原理说明
- 宏定义:通过
define把重复的安装命令封装成一个宏INSTALL_NODE_MODULES,避免了代码冗余,后续修改命令只需要改这一处。 - 根目录规则:单独为
node_modules目标绑定依赖package.json,调用复用的宏执行安装。 - 模式规则:
%/node_modules继续匹配所有子目录下的node_modules目标,同样调用宏执行相同的命令逻辑。
这样无论你执行make node_modules(根目录)还是make path/to/subpackage/node_modules(子目录),Make都会找到对应的规则并执行正确的安装流程。
内容的提问来源于stack exchange,提问作者Robert Rossmann
相关产品推荐
相关产品推荐

