如何提取package.json依赖版本并在Makefile中插值使用
实现方法
不需要额外安装任何第三方解析工具,直接在Makefile中调用Node.js内置能力读取package.json字段,将对应依赖的版本赋值给Makefile变量,安装时拼接包名@版本号的格式即可,全程不需要硬编码版本号,会自动同步package.json中的配置,不会拉取超出配置范围的新版本。
具体操作逻辑
- 在Makefile头部定义版本变量,通过
node -p命令直接执行JS语句解析package.json提取版本:- 读取devDependencies下的包版本,取值路径为
require('./package.json').devDependencies['完整包名'] - 读取dependencies下的包版本,将上述路径中的devDependencies替换为dependencies即可
- 读取devDependencies下的包版本,取值路径为
- 修改原有直接写包名的
npm install命令,替换为包名@${对应版本变量}的格式,强制安装匹配package.json配置的版本。 - 这种读取方式不依赖jq等额外工具,只要运行环境装有Node.js(前端项目运行环境默认自带)即可正常工作,适配Windows、macOS、Linux全平台,不会出现跨平台JSON解析失败的问题。
适配当前场景的完整Makefile示例
# 从package.json提取各依赖的指定版本 EYES_VERSION := $(shell node -p "require('./package.json').devDependencies['@applitools/eyes-testcafe']") TESTCAFE_VERSION := $(shell node -p "require('./package.json').devDependencies['testcafe']") # 注意如果@ffmpeg-installer/ffmpeg放在dependencies字段下,把下面路径里的devDependencies改成dependencies即可 FFMPEG_VERSION := $(shell node -p "require('./package.json').devDependencies['@ffmpeg-installer/ffmpeg']") install-testcafe: npm ffmpeg applitools testcafe # 安装项目全量依赖,默认就会按照package.json的版本配置安装 npm: npm install # 安装ffmpeg录屏依赖,强制使用package.json指定版本 ffmpeg: npm install @ffmpeg-installer/ffmpeg@${FFMPEG_VERSION} # 安装applitools依赖,强制使用package.json指定版本 applitools: npm install @applitools/eyes-testcafe@${EYES_VERSION} # 全局安装TestCafe,强制使用package.json指定版本 testcafe: sudo npm install -g testcafe@${TESTCAFE_VERSION}
说明:如果package.json里的版本号带
^、~、*这类范围符,npm会严格按照范围符规则安装匹配版本,和直接执行项目根目录npm install的版本逻辑完全一致,不会出现版本不匹配的问题。
内容的提问来源于stack exchange,提问作者Justin Grabenbauer
相关产品推荐
相关产品推荐

