控制台输出私有库的打包信息

69 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情

背景

最近一些外部原因,整个公司处于居家办公的状态中。这无形中增加了彼此的沟通成本。本人又负责维护公司内独立部署的库。理论上不该频繁发版。但由于业务变更和历史bug,最近两个版本可能频繁发布。而坑人的点,是我有维护分支和开发库的权限。却不能发布。无论生产还是开发环境,每次发布都需要领导亲自操作。这造成了领导、我、测试同学的三方信息同步的问题。可以想象修改后,每次都要先和领导说,发好后再和测试说。可是领导发布后不一定会立即同步我,进而我又不能及时反馈给测试。或者测试提出问题还存在,是不是没有发布?我也不敢确定,到底是还有问题。还是尚未发布。

诉求

因此,就希望可以在项目的控制台,打印出库的版本号,以及构建时间。这样就可以第一时间知道领导是否发布。

困难

公司的这个库采用了ts开发。在主项目使用时,相当于npm安装了一个第三方包。所以不需要webpack打包。只是使用了tsconfig.json进行编译。这样的话,给到我的操作空间无疑就很有限。如何在process.env上携带上build的信息,就成为了难题。

收获

通过社区学习,看到了有些小伙伴进行类似操作。只不过他是使用了阿里云流水线,但他使用命令的方式点醒了我。最后决定不去依赖process.env。而是直接通过npm run build构建的同时,执行一个build Info log插入的命令。

方案

具体方案如下:

  1. npm run build。
  2. 拦截 build 命令, 在它执行前面 执行一个inset build info log 的命令 取名 build-info-log。

细节:
只需要在package.json文件下的script对象中,增加一行。

"build-info-log" : 'node .bin/build-info-log.js'

然后在src同级创建文件夹bin,并在它下创建文件build-info-log用于实现技术细节。(具体细节看下面代码部分)

代码

const moment = require('moment');
const entryFile = require('src/index.tsx');
const { readFile, writeFile, promises: fsPromises } = require('fs');

readFile(entryFile, 'utf-8', function (err, contents) {
    if (err) {
        console.log(err);
        return;
    }
  
    const replaced = contents.replace(/%%YYYY-MM-DD HH:mm%%/g, `${moment().format('YYYY-MM-DD HH:mm')}`);
  
    writeFile(entryFile, replaced, 'utf-8', function (err) {
      console.log(err);
    });
});

结束语

通过这样一个小的工作场景,学会了写node命令。并且通过替换文件内容,完成了打包信息的更新。再此场景上,大家有什么好的主意,请下方评论留言一起交流。