读取JSON并分配给make变量列表

时间:2016-04-16 12:11:09

标签: makefile gnu-make

我可以从package.json获得一个值:

LAST_VERSION := $(shell node -p "require('./package.json').version")

但是如果我需要几个值呢?像:

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

这是唯一的方法吗?也许有办法创建一种列表。

2 个答案:

答案 0 :(得分:16)

最后,我想出了这个:

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)

答案 1 :(得分:0)

这是已接受答案的调整版本。

通过使用GetValueFromJson之类的参数调用data.profile.name,可以轻松获取嵌套值。

define GetValueFromJson
$(shell node -p '\
    const getVal = (key = "", obj = {}) => {
          const currKey = key.split(".")[0];
          const val = obj[currKey];
          if(typeof val !== "object") return val;
          const nextKey = key.split(".").slice(1).join(".");
          return getVal(nextKey, val);
    }; \
    getVal(`$(1)`.replace(" ", ""), require("./package.json")); \
')
endef

PORT := $(call GetValueFromJson, config.port)

# make run
run:
    PORT=${PORT} node server.js