Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Makefile 读取JSON并分配给make变量列表_Makefile_Gnu Make - Fatal编程技术网

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)。