Makefile 读取JSON并分配给make变量列表
我可以通过以下方法从Makefile 读取JSON并分配给make变量列表,makefile,gnu-make,Makefile,Gnu Make,我可以通过以下方法从package.json获取一个值: LAST_VERSION := $(shell node -p "require('./package.json').version") define GetFromPkg $(shell node -p "require('./package.json').$(1)") endef PROJECT := $(call GetFromPkg,name) LAST_VERSION := $(call GetFromPkg,ve
package.json
获取一个值:
LAST_VERSION := $(shell node -p "require('./package.json').version")
define GetFromPkg
$(shell node -p "require('./package.json').$(1)")
endef
PROJECT := $(call GetFromPkg,name)
LAST_VERSION := $(call GetFromPkg,version)
DESCRIPTION := $(call GetFromPkg,description)
PROJECT_URL := $(call GetFromPkg,repository.url)
但是如果我需要几个值呢?比如:
PROJECT := $(shell node -p "require('./package.json').name")
LAST_VERSION:= $(shell node -p "require('./package.json').version")
DESCRIPTION := $(shell node -p "require('./package.json').description")
PROJECT_URL := $(shell node -p "require('./package.json').repository.url")
这是唯一的办法吗?也许有一种方法可以创建一个列表。最后,我想到了这个:
LAST_VERSION := $(shell node -p "require('./package.json').version")
define GetFromPkg
$(shell node -p "require('./package.json').$(1)")
endef
PROJECT := $(call GetFromPkg,name)
LAST_VERSION := $(call GetFromPkg,version)
DESCRIPTION := $(call GetFromPkg,description)
PROJECT_URL := $(call GetFromPkg,repository.url)
这是一个被接受的答案的修改版本 它可以通过调用
GetValueFromJson
和data.profile.name
等参数轻松获取嵌套值
定义GetValueFromJson
$(外壳节点-p'\
const getVal=(key=”“,obj={})=>{
const currKey=key.split(“.”[0];
const val=obj[currKey];
if(typeof val!=“object”)返回val;
const nextKey=key.split(“.”).slice(1.join(“.”);
返回getVal(nextKey,val);
}; \
getVal(`$(1)`.replace(“,”),require(“./package.json”)\
')
恩德夫
端口:=$(调用GetValueFromJson,config.PORT)
#跑
运行:
PORT=${PORT}节点server.js
一个节点调用需要多长时间?值得进行微观优化吗?实际上,它看起来非常可读——我不会为了一个模糊优化的make
hackery而牺牲这个属性。@Jens实际上,它根本不会影响性能,也许就这样吧。如果一个节点
调用可以打印所有四项,那么您就有分离它们的问题了。由于make
本质上使用空格分隔的列表,我认为“description”成员会有问题,因为description可能包含空格。您必须使用一个特殊的分隔符(逗号?分号?)来创建输出,以及由此产生的所有转义问题advice@Jens亚历克斯,谢谢你们。我想这是最好的(唯一的)方法。值得指出的是,make不会从$(call…
中的参数中删除空格。您可以在这里使用它,因为node-p“require('../package.json')。name“
仍然有效。($(调用GetFromPkg,name)
可能更像是make惯用语IMHO)。