【问题标题】:Read JSON and assign to a list of make variables读取 JSON 并分配给 make 变量列表
【发布时间】:2016-04-16 12:11:09
【问题描述】:

我可以从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")

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

【问题讨论】:

  • node 调用需要多长时间?是否值得进行微优化?照原样,它看起来很可读——我不会为了混淆优化的makehackery 而牺牲这个属性。
  • @Jens 确实,它根本不影响性能,也许就这样吧。
  • 如果单个node 调用可以打印所有四个项目,那么您将遇到分离它们的问题。由于make 本质上使用空格分隔的列表,我预计“描述”成员会出现问题,因为描述可能包含空格。您必须使用特殊的分隔符(逗号?分号?)来创建输出,其中包含所有转义问题。
  • 只要 json 文件是本地的,听从 Jens 的建议
  • @Jens 和 Alex,谢谢你们。我想这是最好的(唯一的)方法。

标签: makefile gnu-make


【解决方案1】:

最后,我想出了这个:

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)

【讨论】:

  • 值得指出的是,make 不会从$(call ...) 中的参数中去除空格。您可以在这里逃脱,因为node -p "require('./package.json'). name" 仍然有效。 ($(call GetFromPkg,name) 可能更多地出现在 make 成语恕我直言中)。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2021-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-24
    相关资源
    最近更新 更多