hexo 搭建改良

之前使用hexo 搭建博客過程全紀錄已經可以成功的搭建一個 hexo 的博客了,使用了一段時間之后,發(fā)現了一個問題,就是博客只能在當前的這臺 pc 上發(fā)布,但是有時候想在家也寫寫博客并立即發(fā)布,之前的博客只能基于單終端的發(fā)布。因此在多個端上進行 hexo 的同步成為當前需要解決的問題,為此,我這里進行了三次改進。通過不斷的改良,也使我對 hexo 有了進一步的了解。

GitPage + Hexo

相信大家剛開始用 hexo 搭建博客的時,搜索出現最多的關鍵詞就是 GitPage + Hexo 了
這里用大白話說一下二者的基本原理:

不知道大家想過這個問題沒,就是如果我們想做一個博客,還想讓外網的其他人也看到,需要哪些準備條件:

  1. 首先,我們肯定需要一個服務器,來保存我們的博客。這樣外網才能訪問的到。
  2. 其次,我們在瀏覽器瀏覽的博客都是 html 的網頁,因此我們的博客頁面在服務器上必須保存的是 html,css,javascript 等著些文件。

接下來依次解決上面的問題:

問題一:有多種解決方法,可以購買阿里云,騰訊云等,來構建自己的博客系統(tǒng),但是需要付費。那就尋找一個免費的平臺,好在 github 提供了類似的功能,我們的代碼倉庫放在 github 上,外網都可以看到,這不就是一個免費的服務器嘛。但是如果我們直接把博客的 html 代碼放到代碼倉庫,那么 github 會認為你創(chuàng)建的是一個 html 的代碼庫,這樣查看例如 index.html 的文件并不是一個網頁,而是代碼。因此還需要一個轉換器,該轉換器的工作是如果我們打開的是例如 index.html 這樣的文件,github 不是展示其代碼,而是將其渲染成對應的網頁展示出來。這一使命由 GitPage 來完成。

其實要完成上述的需求,還必須遵從 GitPage 規(guī)定的兩個要求:

  • 每個人至多有一個這樣的代碼庫,其倉庫名必須是 username.github.io。這里的 username 就是你 github 的用戶名。這里只是第一步,此時這任然是一個普通的代碼庫
  • 該代碼庫中的文件必須按照一定的要求保存。例如在指定的文件夾中放 html 文件,在指定的文件夾放 css 文件等。

只要我們按照 GitPage 的要求,將你寫好的博客的 html 等文件放到指定的文件夾中。其實你就可以創(chuàng)建博客了。

問題二:解決了服務器的存儲問題,接下來解決博客的網頁生成問題了,并不是每個人都會前端的(即使會,我相信他們也不愿意真的用 html 來寫博客,效率太低?。?,如果有這么一個轉換器,可以將我寫的文檔轉換成網頁,那將極大的提高我們的工作效率。還真有這么一個轉換器——Hexo。它可以將 markdown 的文件轉換為 html 文件。并且配有多種主題,只需簡單的配置,就可以輕松的切換風格不同的網頁。而且其轉換的文件夾的結構是完全符合 GitPage 的要求的。其對應于 /public文件夾。該文件夾下的所有文件只需要全部上傳到username.github.io倉庫中,我們就可以通過 https://username.github.io/來訪問了。

這里強調一點:我們所寫的博客,最重要的就是原始的 markdown 文件! 而不是其對應的 html 文件。因為這些文件隨時可以用 hexo 來再次生成。但是如果 markdown 文件丟失了,可能意味著我們要重寫寫文章了。

快速搭建

參考之前寫的這篇hexo 搭建博客過程全紀錄就可以順利跑通了。可以通過它進行一次練手。其主要是針對單平臺的發(fā)布。如果你就是在單一的 pc 上寫博客并發(fā)布,那它很適合你。但是如果你的需求是在 pcA 上寫兩篇,又在 pcB 上寫兩篇。那么請往下看。

探索改進之旅

這里的改進主要是解決多終端同步問題。

最原始最簡單的方法

在了解了上面 GitPage 和 Hexo 所做的工作之后,我萌生了一個最簡單的方法:在另一臺電腦 pcB 上安裝 Node.js。然后直接將 pcA 上的執(zhí)行hexo init的文件夾(例如我的是:E:/blogs)拷貝到另一臺 pcB 上,這樣就可以直接用了,可以說是無縫連接。

缺點:如果你兩臺電腦交互發(fā)布文章的太頻繁,老是這樣將文件夾拷貝來拷貝去,也很麻煩。

使用情況:如果你之前長期 pcA 上發(fā)布文章,后來換了臺電腦,以后準備長期在 pcB 上發(fā)布文章,那么這種方法最適合不過了。

兩個倉庫

前面也說過博客中最重要的是 markdown 的源文件。而在username.github.io的代碼庫中保存的是博客文件夾的 public 下的內容。之前也想過用兩個分支來解決。但是hexo 搭建博客過程全紀錄的做法,二者并不在同一目錄級別。無法實現用一個倉庫再將博客文件夾下的 source 文件進行上傳。故采用了兩個倉庫的做法。即新建一個倉庫MyBlogBackup用來保存 markdown 源文件。

注意:這種解決方案是針對使用hexo 搭建博客過程全紀錄搭建博客為前提的。其它情況則不適用。這里貼出所寫的腳本文件:

發(fā)布文章的腳本:

# this time,we are in blogs dir,we need sync the source file
git pull
# generate the new file and the old files from another machine
hexo generate
cd .deploy/zachaxy.github.io
git pull
# copy web pages from public/
cp -R ../../public/* .
git add .
git commit -m "update"
git push origin master
cd ../..
# this time,you are in blogs dir
git add .
git commit -m "upload source file"
git push origin master

刪除文章的腳本:運行該腳本,必須傳入一個參數,指定要刪除的文章的名稱(要帶 md 后綴)

if [ $# -ne 1 ]
then
    echo "the args count must equal 1,the arg we need is the name of the file you want to delete\n";
elif [ ! -d "source/_posts/$1" ]
then
    echo "No such file or directory"
    exit 2;
else
#first rm the file in both file system and local git
    rm "source/_posts/$1"
    git add .
    git commit -m "delete file"
    git push origin master
#second cover the change to GitPage
    hexo generate
    cp -R public/* .deploy/zachaxy.github.io
    cd .deploy/zachaxy.github.io
    git add .
    git commit -m  "update"
    git push origin master
fi

再次回顧下用到的兩個倉庫:/MyBlog/.deploy/username.github.io以及MyBlogBackup

簡單說一下思路:在新的終端,先用hexo n創(chuàng)建并寫文章,然后執(zhí)行發(fā)布腳本,該腳本會先將MyBlogBackup中的 markdown 同步到本地,然后用hexo g生成 html 文件。接下來再進入.deploy下的username.github.io的倉庫,將代碼 pull 下來,然后將剛剛生成的 public 下的 html 文件將倉庫的文件強行覆蓋。
按說相同的 markdown 文件用相同的主題生成的 html 文件是一樣的,但是為了避免平臺,hexo 版本的差異,這里還是進行覆蓋吧。

缺點:兩個倉庫的隔離性很高,而且目前的腳本很難稱得上自動化,每次在另一個終端寫博客時,都要謹記腳本的執(zhí)行順序,這些都需要人工記憶,而無法用代碼約束。同時刪除文件的維護成本也很高。但是作為一次嘗試,它也解決了多終端同步的問題。

一個倉庫,兩個分支

這是我目前使用的解決方案。下面進行詳細說明。

剛開始自己是按照hexo 搭建博客過程全紀錄來搭建的,也是參考的別人的文章。一切順利,但是和網上其它的教程有點不一樣。不一樣的地方在于發(fā)布文章的時候,這篇文章的做法并沒有使用hexo d,而在博客文件夾下再創(chuàng)建一個 .deploy 的文件夾(當然文件夾的名字隨意),并創(chuàng)建一個 git 倉庫,然后把用 hexo 生成的 html 文件(在 public 文件夾下)全部拷貝到.deploy 下,然后將直接把.deploy 下的代碼全部 push。

剛開始我以為這種操作才是正統(tǒng),后來看文章,發(fā)現更多的人用的是 hexo d 。其實這里并沒有什么正統(tǒng)不正統(tǒng),只是經歷過這個事情之后,我們可以認定,hexo d干的事情就是把 public 中的文件 push 到遠程。
在使用兩個倉庫的方法中,我也想過用兩個分支的思路,但是不在同一個目錄中,似乎不能作為兩個分支。

Blogs
    public
        需要向 username.github.io push 的所有文件
    source
        _post
            *.md

這種目錄結構創(chuàng)建兩個分支,一個保存 _post 下的 md 文件,一個分支保存 public 下的文件。那么在初始化 git 倉庫時在那個目錄下?
這里肯定是要找二者的公共目錄 Blogs,但是如果我們直接在 Blogs 下進行 git init,那么在上傳 public 下的文件時是不符合 GitPage 的要求的,因為 GitPage 要求 public 下的文件必須作為倉庫的一級目錄。而我們這樣做的話,一級目錄就是 public 了。

后來經過試驗,發(fā)現了使用多分支進行 hexo 同步的方法。
兩個分支:一個分支我們可以叫 hexo,該分支主要是保存 markdown 源文件,hexo 配置文件。該分支需要我們手動創(chuàng)建,并把該分支設為默認分支。具體步驟如下:

  1. 在 github 創(chuàng)建username.github.io的倉庫
  2. 在本地創(chuàng)建一個同名的文件夾username.github.io
  3. 在本地文件夾下執(zhí)行 git init,git checkout -b hexo;初始化代碼庫,這里目前是空的,然后創(chuàng)建名為 hexo 的分支,其實這里并不是創(chuàng)建分支,而是把默認的 master 分支改名為 hexo。不信你這時候執(zhí)行git branch,并不顯示任何分支。但是 git 的命令行已經顯示當前分支為 hexo 分支了。
  4. 在本地文件夾下執(zhí)行npm install hexo、hexo init、npm installnpm install hexo-deployer-git
  5. 因為我使用的主題里有一個搜索功能,所以還要額外執(zhí)行npm install hexo-generator-search -S
  6. 接下來用 hexo n xxx`創(chuàng)建并寫文章。
  7. 寫好文章后先不著急發(fā)布,先添加以下遠程代碼庫 git remote add origin git@github.com:zachaxy/zachaxy.github.io.git
  8. 將 markdown 源文件發(fā)布上去,具體的 ignore 文件如下。注意發(fā)布的遠程倉庫名 git push -u origin hexo。其實 master 只是默認的主分支,這個名字完全可以修改,而且在剛創(chuàng)建的倉庫第一次這樣提交時,指明遠程的倉庫叫 hexo,那么其默認分支就是 hexo
  9. 接下里生成并發(fā)布文章,使用hexo g -d,其會按照 _config.yml 中關于 deploy 的配置,自動創(chuàng)建 master 分支,并將 public 下的文件作為一級目錄 push 到 master 分支中。

ignore 文件

.DS_Store
Thumbs.db
db.json
*.log
node_modules/
public/
.deploy*/

_config.yml 中關于 deploy 的配置,注意這里的 branch 必須為 master。

deploy:
  type: git
  repo: git@github.com:zachaxy/zachaxy.github.io.git
  branch: master

以后我們在另一個終端進行發(fā)布時,同樣創(chuàng)建一個username.github.io文件夾,然后依次執(zhí)行

  • git init
  • git checkout -b hexo
  • git remote add origin git@github.com:zachaxy/zachaxy.github.io.git
  • npm install hexo、npm install、npm install hexo-deployer-git
  • git pull origin hexo(上一步并沒有執(zhí)行 hexo init 命令,因為該命令是生成 hexo 的文件結構用的,我們的文件結構已經保存在遠程的 hexo 分支中,用 git pull 即可獲取相同的分支結構)

接下來正常的創(chuàng)建 md,寫博客,發(fā)布即可。

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容