基于 husky lint-staged 自动更新帖子 date 和 updated 字段

前言

基于 husky, lint-staged 自动更新帖子 dateupdated 字段

正文

前面我们浅析了 lint-staged 的原理,现在,我们就可以利用 lint-staged 来在 commit 前对贴字进行更新了

这里我们新建一个项目,然后发布到 npm

首先,我们需要生产一个命令行的文件,这样我们就能使用 npx XXXX 来执行这个命令

我们在项目中建立一个 bin 文件夹,然后新建一个 hexo-update-time.js 文件

之后我们需要在 package.json 文件中声明 bin 的位置,以及把 bin 文件添加到 files 字段中

这样当我们安装之后,会在 node_modules/.bin 下生成一个可执行的文件(这里我是安装到我的博客项目中了)

这里我们使用 src 作为源码的目录,所以也要包含在 files 字段下

到这里,前置步骤完成,接下来我们需要解决如何解析 node 后面携带的参数

这里我们使用的是 commander 库,它提供了一个非常方便的方式来解析参数,仓库地址:tj/commander.js

这里其实是库帮我们解析了 process.argv 这个参数列表,我们可以新建一个文件,内容如下

1
console.log(process.argv);

然后使用 node 执行这个文件,附带一些参数

可以发现 process.argv 就包含了 node 路径,执行文件地址,以及附带的参数

其实这里也可以不用 commander 的,因为实际上并不会用到命令行参数,实际上我们直接附带文件列表即可,如下

但是万一以后要用到参数了再改就麻烦了,所以这里引入 commanderhexo-update-time.js 内容如下

1
2
3
4
5
6
7
import { program } from "commander";

program.parse();

program.args.forEach(async (filepath) => {
// TODO 这里处理文件逻辑
});

这里由于我们不使用参数,所以要通过 program.args 获取剩余的参数列表

到这里我们就可以编写核心的逻辑了,当然,核心逻辑和我们之前并没有什么不同

同样是读取文件,使用正则获取头部信息,替换头部信息的 dateupdate 字段,然后重新写回文件

这里我们新增逻辑来判断是否为第一次添加或者是否没有被 git 跟踪

因为我们可能不配合 lint-staged 使用,所以需要判断

其他的逻辑就和之前的一样了

在写完之后我们需要 publishnpm 上,这里注意,如果之前使用了淘宝源,那么要切回 npm 源才能发布

这里我们需要注册一个 npm 的账号,执行 npm publish 之后会提示你输入账号密码,就可以成功上传了

然后我们在博客项目中安装 husky, lint-staged 以及 hexo-update-time.js 这三个依赖

执行 npx huksy install 注册钩子

执行 npx husky add .husky/pre-commit "npm run lint-staged" 添加一个 pre-commit 钩子

package.json 添加 script

package.json 配置 lint-staged 配置

这里我的逻辑是如果你是第一次 add ,那么 commitdateupdated 会更新到当前同一时刻,否则只有 updated 会添加到同一时刻

如果文件没有被 git 追踪(单独使用 hexo-update-time 命令),那么 dateupdated 会更新到当前同一时刻

仓库地址:Dedicatus546/hexo-update-time

后记

如果你是本地生成静态文件之后提交到 github ,那么你完全没有必要使用这个插件,但是你就要承担仓库丢失的风险

即使你把 md 的仓库也放到了 github 上,但是重新拉取仓库会影响文件的 modifyTime 信息,导致 updated 字段错误显示

所以这个小工具只适用于开启了手动更新 updated 字段,解放每一次 commit 前需要手动更新 updated 字段的操作