如何在 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.json 的 scripts
部分重新定义 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和脚本标签