站点博客文章同步的解决方案
站点博客文章同步的解决方案
你的博客文章有做存档吗?你写文章是直接在站点上写吗?这里,我有一个解决方案。
背景
我之前写文章都是在本地写的,写完了之后呢就会把文件保存到一个文件夹里存档,然后到网站上复制粘贴发布,我觉得好麻烦。
有没有办法可以实现本地文章编写自动同步到Halo博客站点呢?
方案
不管什么方案,都应该要考虑到:
- 如何感知文件的变化
- 如何存储转化一篇文章的属性(分类、标签)
基于文件监听
我一开始想到的是使用文件夹监听的方式去实现。
监听一个文件夹下的内容,是否发生了创建、修改、删除,如果发生了那就去推动站点的更新。
但是这个方案有一个问题,需要考虑文件在短时间内多次发生变化时如何保持同步的幂等性,即只有最后一次修改有效。
可行性
感知文件的变化可以采用监听文件夹的方式去解决,这方面的解决方案有:
- Java提供的文件监听方法,FileSystems获取WatchService再配合Path的register方法
- 使用其他三方类库,Apache封装的CommonsIO库、JNotify等
至于文件修改的幂等性,我想到的方案有
- 使用Map去解决,key为文件path,value为修改时间,然后有一个线程专门去扫描Map里的数据,如果有数据的修改时间距今相差达到指定的时间,就去推动网站的更新。
- 使用延迟队列,每次监听到文件修改时发送到延迟队列,延迟队列获取到数据时就判断文件的修改时间与现在的时间相差是否达到指定时间,达到就去推动网站更新。
评价
方案是可行的,但是我不考虑它,因为还有一个方案更好。
使用Github再结合Webhook
这个方案相比于文件监听,还附带了云存储(笑),它不香吗?
基本上需要考虑的问题就只有存储转化定义一篇文章的属性了。
可行性
如何感知文件的变化,这点是基于Webhook实现的。
Webhook是在Github仓库发生变化时,如有文件更改、仓库配置更改等,会根据url进行事件回调的一个Github仓库设置项。
使用Github的仓库来管理文章不只是拥有了云存储还拥有变更回溯,香。
然后就是如何存储转化一篇文章的属性了。
我构想了一个规则,要求每一篇文章的开头编写一段代码块,如下所示
1 |
|
这个代码块包含了这篇文章的分类、标签、简介的属性,meta-
后的字符表明了使用了哪种数据序列化方式。
然后文章标题就取文件名吧。
评价
这个方案太香了,就它了。
行动前
我已经有办法可以实现我的目的,我还想保持良好的扩展性,支持其他人来使用,而且也要支持其他平台而不是只针对Halo。
为了避免重复造轮子,我得先去探查一下,有没有人做了我想做的事情。
去Github上搜索关键词文章同步,没发现有符合我要求的,勉为其难的去Gitee上看了看也没有,OK。
立项
项目地址:GuGu_Blog_Sync
目标是做一个基于Github仓库来管理文章并使用Webhook来推动站点更新的框架,同时也提供一些站点的实现。
PS
我在构想规则的时候,也想过不显式的把配置写出来,比如使用<!---->
注释来写配置,但我使用的Typora会在换行的时候翻车,还得开源码模式去换行,那这样的话,还不如算了…