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

Posted

技术标签:

【中文标题】如何在 npm 脚本中获取包版本和日期?【英文标题】:How to fetch package version and date in npm script? 【发布时间】:2020-09-22 04:35:39 【问题描述】:

我有一个 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)\"

【问题讨论】:

【参考方案1】:

为什么它不起作用?

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

但是,上述方法在 Windows 上不起作用,因为该操作系统上的 npm 使用 cmd 作为默认 shell 来运行 npm 脚本 - cmd 根本不理解 date 命令。


解决方案

以下解决方案适用于跨平台(Windows、Linux、MacOS 等):

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

    npm i -D moment
    

    我们将利用这个包来获取格式为DD/MM/YYY HH:MM:SS的日期/时间。

    然后在 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"
    
    

说明:

    npm 脚本(上图)利用 nodejs 命令行选项 -p 评估并打印以下内联 javascript 的结果:

    process.env.npm_package_version
    

    这实质上是利用 nodejs process.env 来读取 npm 创建的环境变量 npm_package_version。请参阅我的回答 here 以获得进一步的解释。

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

    > ./public/version-npm.txt
    

    注意:如果您愿意,可以继续使用当前的、更详细的解决方案从 package.json 获取版本,即

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

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

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

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

    > ./public/version.txt
    

【讨论】:

注意:如果您使用的是早期版本的 node.js,那么您可能会遇到 moment 错误。在这种情况下,请安装早期版本。例如运行 npm i -D moment@1.7.2 而不是 npm i -D moment 非常感谢,它有效,你解释得很好:)

以上是关于如何在 npm 脚本中获取包版本和日期?的主要内容,如果未能解决你的问题,请参考以下文章

如何避免多次加载外部库? npm包,browserify和脚本标签

在 NPM 中,如何获取范围内的包列表?

如何通过 postinstall npm 脚本自动将文件从包复制到本地目录?

如何确定旧 npm 包版本的依赖关系

如何在angularjs中获取每周明智的开始和结束日期

如何在 HTML 中将 NPM 包用作普通的 javascript