使用静态部署的方式使用Hexo,我们经常会遇到一个很烦人的问题,就是部署麻烦。
每次写一篇文章,就要经历Hexo clean、Hexo g、Hexo s、Hexo d四连,一开始还好,写多了之后烦不胜烦。
同时,由于我个人使用Joplin进行文章撰写,这个软件虽然简洁,但并不好用;图片虽然可以直接复制,但不能修改输出目录,图片资源默认保存在与/blog/平行的/_resources/文件夹中。
因此,结合我最为擅长的batch脚本语言,我就萌生了使用批处理来优化整个流程的想法。
1. Git安装配置(不确定是否有必要)
在安装Git的过程中,我们会有一个配置终端的过程,此处其实是建议选择第一项(使用MinTTY),但我当时选择了第二项即使用系统的cmd来作git bash的终端。

如果选择了第一项,可能也是能正常使用批处理来代替执行的,应该不用担心。
2. 站点配置
blog根目录下的_config.yml文件:
| 12
 3
 4
 
 | ......post_asset_folder: false
 relative_link: false
 ......
 
 | 
使用Joplin写文章的话应该关闭这两项(至少我测试下来这样是没问题的)
3. 脚本编写
在blog根目录下新建“程序名.bat”,开始编写功能。
先放源码:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 
 | @echo offsetlocal EnableDelayedExpansion
 goto start
 :ac
 
 cls
 color 0F
 goto %targetlabel%
 :start
 if "%targetlabel%"=="" (set "targetlabel=start"&&goto ac)
 echo ------------------------------------------------
 echo  1.执行完整的检查和推送blog流程
 echo  2.快速上载blog
 echo  3.本地预览
 echo  4.单独执行指令
 echo ------------------------------------------------
 echo.
 choice /c 1234
 if "%errorlevel%"=="4" goto new
 if "%errorlevel%"=="3" (set "targetlabel=local"&&goto ac)
 if "%errorlevel%"=="2" (set "targetlabel=fast"&&goto ac)
 if "%errorlevel%"=="1" (set "targetlabel=full"&&goto ac)
 pause&exit
 :new
 echo 正在创建新的cmd实例...
 echo ------------------------------------------------
 echo 命令提示:
 echo hexo clean
 echo hexo g
 echo hexo s
 echo hexo d
 echo ------------------------------------------------
 start cmd
 echo 按任意键返回菜单...
 pause >nul
 set "targetlabel=start"&&goto ac
 :local
 echo ------------------------------------------------
 echo                  本地预览模式
 echo ------------------------------------------------
 echo 启动预览...
 cmd /c "hexo clean & hexo g & xcopy D:\blog\source\_posts\_resources D:\blog\public\blog\_resources\ /e /s /y & echo 2>D:\blog\.deploy_git\.nojekyll & start http://localhost:4000/ & hexo s"
 echo 按任意键返回菜单...
 pause >nul
 set "targetlabel=start"&&goto ac
 :fast
 echo ------------------------------------------------
 echo                  快速上载blog
 echo ------------------------------------------------
 cmd /c "hexo clean & hexo g & xcopy D:\blog\source\_posts\_resources D:\blog\public\blog\_resources\ /e /s /y & echo 2>D:\blog\.deploy_git\.nojekyll & hexo d"
 echo ------------------------------------------------
 echo 完成,2秒后退出...
 ping localhost -n 3 >nul
 exit
 :full
 echo ------------------------------------------------
 echo                  完整流程向导
 echo              按0为确定,按1为跳过
 echo ------------------------------------------------
 goto clean
 :clean
 echo 第一步:清理缓存
 choice /c 01
 if "%errorlevel%"=="2" goto generate
 cmd /c "hexo clean"
 goto generate
 :generate
 echo ------------------------------------------------
 echo 第二步:生成页面
 choice /c 01
 if "%errorlevel%"=="2" goto check
 cmd /c "xcopy D:\blog\source\_posts\_resources D:\blog\public\blog\_resources\ /e /s /y & echo 2>D:\blog\.deploy_git\.nojekyll & hexo g"
 goto check
 :check
 echo ------------------------------------------------
 echo 第三步:本地预览
 choice /c 01
 if "%errorlevel%"=="2" goto deploy
 start http://localhost:4000/
 cmd /c "hexo s"
 goto deploy
 :deploy
 echo ------------------------------------------------
 echo 第四步:上传到远程服务器
 choice /c 01
 if "%errorlevel%"=="2" goto done
 cmd /c "hexo d"
 goto done
 :done
 echo ------------------------------------------------
 echo 流程已完成,按任意键返回菜单...
 pause >nul
 set "targetlabel=start"&&goto ac
 
 | 
我自认为自己的批处理写得都算比较清晰的了,虽然注释很少,但结合文字应该能看懂每一步是在干什么。
如果要使用,请把里面所有的D:\blog\source\_posts\_resources替换为你Joplin每次导出时的资源目录,把所有的D:\blog\public\blog\_resources\替换为你的博客站点目录,注意不要动\public\...后面的内容。
如果要更换功能模块,也应按照这里的写法,使用 cmd /c 命令内容 & 第二条命令 & 后面的很多命令 来执行,除了start用于启动网页之外尽量不要直接在批处理中使用模块的命令,否则容易直接闪退。
创建.nojekyll文件的目的是防止GitHub忽略掉下划线开头的文件夹,即_resources
4. 工作流程
现在,我们可以愉快地写文章了。
打开Joplin,新建笔记(记得都放在同一个笔记本下),笔记的名字是文件名,写上Front-matter内容,之后就如同在word中一样写稿。
图片直接粘贴即可,需要的话修改 [ ] 里的内容,这是属于markdown语法的一部分,不详细说明。
写完的文章直接往blog\source\_posts里面一存,然后打开脚本按个2,等两分钟就部署到Github Pages上了。
愉快地工作吧!

补充点内容,修改文章稍微有点麻烦,因为Joplin非常笨,它不会识别已有的文件,发现重名了直接加后缀,连带着里面的图片也都加后缀、重新复制到_resources里面了;对于我这种硬盘空间够、平时图片不多的人来说倒是无所谓,但部署了之后文章会重复显示好几篇。所以不能直接导出文章,需要手动删除旧的,然后再从Joplin中导出即可。