如何在 npm 脚本中获取包版本和日期?

How to fetch package version and date in npm script?

我有一个 package.json 文件,我有这个脚本可以创建 2 个单独的文件,一个用于版本,另一个用于日期。

当我 运行 命令时,它会生成包含当前版本的正确数据的 version-npm.txt,但是 version.txt 文件是用确切的脚本生成的,它包含 date +"%d/%m/%Y %T"

"scripts": {
    "versions": "node -e \"console.log(require('./package.json').version);\" > ./public/version-npm.txt && echo `date +\"%d/%m/%Y %T\"` > ./public/version.txt" 
}

我需要用当前日期和时间更新它。还有其他方法吗?或者你能帮我解决一下吗?

我试着把日期写成 \"$(date)\" 还是一样,现在我得到 \"$(date)\"

为什么它不起作用?

  • 您获取日期的方式,即 date +\"%d/%m/%Y %T\" 或类似地使用 \"$(date)\" 确实在 *nix 平台上成功运行, npm 默认使用 sh 到 运行 npm scripts.

  • 但是,上述方法在 Windows 上不起作用,因为 OS 上的 npm 使用 cmd 作为默认 shell 到 运行 npm scripts - cmd 根本不理解 date 命令。


解决方案

以下解决方案将跨平台工作(Windows、Linux、MacOS 等):

  1. 首先 cd 到您的项目目录并通过 运行 执行以下命令安装 moment 包:

    npm i -D moment
    

    我们将使用这个包来获取格式为 DD/MM/YYY HH:MM:SS 的 date/time。

  2. 然后在 package.jsonscripts 部分重新定义 versions 脚本,如下所示:

    "scripts": {
      "versions": "node -p \"process.env.npm_package_version\" > ./public/version-npm.txt && node -p \"require('moment')().format('MM/DD/YYYY HH:mm:ss')\" > ./public/version.txt"
    }
    

解释:

  1. npm 脚本(上面)利用 nodejs 命令行选项 -p 评估和打印以下内联 JavaScript:

    的结果
    process.env.npm_package_version
    

    这基本上利用了 nodejs process.env to read the environment variable npm_package_version which npm creates. See my answer 进一步解释。

    然后使用与您的尝试相同的方法将版本重定向 (>) 到文件:

    > ./public/version-npm.txt
    

    注意:如果你喜欢,即

    node -e \"console.log(require('./package.json').version);\"
    

  2. 接下来我们获取日期。我们再次利用 nodejs 命令行选项 -p 来评估和打印以下内联 JavaScript:

    的结果
    require('moment')().format('MM/DD/YYYY HH:mm:ss')
    

    日期值被重定向(>)到文件如下:

    > ./public/version.txt