从 package.json 获取版本的好方法

Good way of getting version from package.json

我正在开发一个将在 npm 上可用的 sdk。

sdk 应该可以将其版本交付给客户端。我希望此版本与 package.json 版本相同。

但是当我在我的 sdk 中输入 import {version} from '../package.json' 时,我看到所有 package.json 都添加到了构建中。

是否有获取版本的好方法,或者我是否会被迫在我的 sdk 中使用 npm version 上的 bash 脚本之类的东西设置版本变量?或者你会怎么做?

如果您使用的是 nodejs,我认为您可以将您的环境和您的应用程序版本保存在一个独立的环境文件中。例如,我将我的设置保存在名为 .env 的文件中,并使用名为 dotenv

的 npm 模块读取它们

您可以通过在 JavaScript 文件中指定占位符文本字符串来实现此目的。假设我们有一个名为 build.js 的文件,在该文件中我们有一个名为 VERSION 的变量声明如下:

// build.js
const VERSION = '@VERSION@'

如您所见,占位符文本字符串为 @VERSION@.

然后您可以按如下方式安装和使用名为 replace in an npm-script 的软件包:

  1. 要安装 replace 你需要 cd 到你的项目目录和 运行:

    npm install replace --save-dev
    
  2. 然后将以下内容添加到 package.jsonscripts 部分:

    {
      ...
      "version": "1.0.0",
      "scripts": {
        "add-version":  "replace -s \"@VERSION@\" $npm_package_version build/build.js",
        "prepublishOnly": "npm run add-version"
      }
    }
    

运行:

当您 运行 通过 CLI 使用以下命令发布包时:

$ npm publish

将调用 prepublishOny 脚本(这是一个 pre hook),而这又将调用 add-version 脚本。

add-version 脚本将在名为 build.js 的文件中用软件包版本(即 1.0.0)替换 @VERSION@ 的实例。此解决方案会将 npm 包版本硬编码到生成的文件中。


跨平台

add-version 脚本(上面)中的 字符串当前使用 $ 前缀(即 $npm_package_version)来访问变量, 所以这只会 运行 在 bash shell.

上成功

但是,对于跨平台使用,您需要使用 cross-var

  1. 要安装 cross-var 你需要 cd 到你的项目目录并且 运行:

    npm install cross-var --save-dev
    
  2. 然后重新定义add-version脚本如下:

    {
      ...
      "version": "1.0.0",
      "scripts": {
        "add-version":  "cross-var replace -s \"@VERSION@\" $npm_package_version build/build.js",
        "prepublishOnly": "npm run add-version"
      }
    }