Skip to content

用终端自动化部署 hexo,编程解决豆瓣插件 bug

Published:

遇到的问题

1、更新 hexo 时指令太多

自从使用了 hexo 搭建博客,每次更新网站都需要 hexo cleanhexo ghexo d 三连,着实麻烦,如果能够连续执行这几个指令就好了,在网上一查正好找到了解决方案。

2、hexo—douban 插件小 bug

在新版本中似乎已经解决

该插件生成的页面在 iOS、macOS 平台的浏览器中被「防盗链」了,导致无法显示书籍、电影的封面。

在 issue 里面有人建议在生成的 index.html 文件中 head 部分增加 <meta name="referrer" content="no-referrer"> 这一行代码,实测有效。

但总不能每次生成后都一个个打开文件去添加吧,太麻烦了,今天突然想到可以直接用 c++ 读写文件的操作来实现自动添加。

解决

hexo

在目录下创建一个 .sh 文件,在这个文件中,一行一行地添加你想要顺序执行的语句,如下:

cd /Users/root/blog  # 进入hexo本地目录
hexo clean
hexo g -d

保存,关闭,使用 chmod 指令给这个文件增加“可执行”权限后即可。

大功告成。

在你想要更新网站时,只需把上面的这个文件拖入终端,按下回车,它会自动执行里面的每一行命令。

douban

学了那么久的 c++,平时解决实际问题却用的很少,今天终于派上用场了。

使用 fstream 读写文件。

代码如下:

#include <iostream>
#include <string>
#include <sstream>
#include <fstream>
using namespace std;

int main()
{
    string str;
    ifstream fin;
    fin.open("/Users/root/blog/public/books/index.html", ios::in);
    stringstream buf;
    buf << fin.rdbuf();
    str = buf.str();//读出该文件内所有内容,存储在str中
    fin.close();
    str.insert(59,"<meta name=\"referrer\" content=\"no-referrer\">");//在str的对应位置(head部分的开头),插入修复的代码
    ofstream fout("/Users/root/blog/public/books/index.html", ios::trunc);
    fout << str;//trunc表示覆盖写入原文件
    fout.close();
    return 0;
}

这一段代码跑完,就会在特定文件的特定位置插入特定字符串,正是我们需要做的。

使用 gcc 工具生成可执行文件,或者直接使用开发环境已经生成的可执行文件,放在一个合适的位置(比如说放在 sh 脚本同一个文件夹下面)

注意,豆瓣插件会生成 books、movies、games 三个页面,所有修改上面的代码,最后得到三个可执行文件,分别是 hexo_movieshexo_bookshexo_games

接下来,只需要把 sh 文件内容修改为:

cd /Users/root/blog
hexo clean
hexo g
# 进入 hexo 本地目录,clean、g。hexo g 操作中应包含 hexo douban 操作
# 这时生成的电影书籍游戏页面文件中,是缺少 <meta name=\"referrer\" content=\"no-referrer\">这行代码的
cd /Users/root/sh # 进入存放三个可执行文件的文件夹
./hexo_movies
./hexo_games
./hexo_books      # 执行这个三个程序
cd /Users/root/blog  # 返回 hexo 目录
hexo deploy # 部署。注意这里不能用 hexo d,因为 hexo deploy 和 hexo douban 名字冲突了。

大功告成。

以后更新,只需要把这个 sh 文件拖入终端,按下回车。