天天看點

搭建一個免費的,無限流量的Blog----github Pages和Jekyll入門 一個極簡風格的部落格

喜歡寫Blog的人,會經曆三個階段。

  第一階段,剛接觸Blog,覺得很新鮮,試着選擇一個免費空間來寫。   第二階段,發現免費空間限制太多,就自己購買域名和空間,搭建獨立部落格。   第三階段,覺得獨立部落格的管理太麻煩,最好在保留控制權的前提下,讓别人來管,自己隻負責寫文章。

大多數Blog作者,都停留在第一和第二階段,因為第三階段不太容易到達:你很難找到俯首聽命、願意為你管理伺服器的人。

今天,我就來示範如何在github上搭建Blog,你可以從中掌握github的Pages功能,以及Jekyll軟體的基本用法。更重要的是,你會體會到一種建立網站的全新思路。

搭建一個免費的,無限流量的Blog----github Pages和Jekyll入門 一個極簡風格的部落格

一、Github Pages 是什麼?

簡單說,它是一個具有版本管理功能的代碼倉庫,每個項目都有一個首頁,列出項目的源檔案。

搭建一個免費的,無限流量的Blog----github Pages和Jekyll入門 一個極簡風格的部落格
搭建一個免費的,無限流量的Blog----github Pages和Jekyll入門 一個極簡風格的部落格

二、Jekyll是什麼?

搭建一個免費的,無限流量的Blog----github Pages和Jekyll入門 一個極簡風格的部落格

整個思路到這裡就很明顯了。你先在本地編寫符合Jekyll規範的網站源碼,然後上傳到github,由github生成并托管整個網站。

這種做法的好處是:

  * 免費,無限流量。   * 享受git的版本管理功能,不用擔心文章遺失。   * 你隻要用自己喜歡的編輯器寫文章就可以了,其他事情一概不用操心,都由github處理。

它的缺點是:

  * 有一定技術門檻,你必須要懂一點git和網頁開發。   * 它不适合大型網站,因為沒有用到資料庫,每運作一次都必須周遊全部的文本檔案,網站越大,生成時間越長。

但是,綜合來看,它不失為搭建中小型Blog或項目首頁的最佳選項之一。

三、一個執行個體

下面,我舉一個執行個體,示範如何在github上搭建blog,你可以跟着一步步做。為了便于了解,這個blog隻有最基本的功能。

第一步,建立項目。

在你的電腦上,建立一個目錄,作為項目的主目錄。我們假定,它的名稱為jekyll_demo。

  $ mkdir jekyll_demo

對該目錄進行git初始化。

  $ cd jekyll_demo   $ git init

然後,建立一個沒有父節點的分支gh-pages。因為github規定,隻有該分支中的頁面,才會生成網頁檔案。

  $ git checkout --orphan gh-pages

以下所有動作,都在該分支下完成。

第二步,建立設定檔案。

  baseurl: /jekyll_demo

目錄結構變成:

  /jekyll_demo     |-- _config.yml

第三步,建立模闆檔案。

在項目根目錄下,建立一個_layouts目錄,用于存放模闆檔案。

  $ mkdir _layouts

進入該目錄,建立一個default.html檔案,作為Blog的預設模闆。并在該檔案中填入以下内容。

  <!DOCTYPE html>   <html>   <head>     <meta http-equiv="content-type" content="text/html; charset=utf-8" />     <title>{{ page.title }}</title>   </head>   <body>     {{ content }}   </body>   </html>
    |-- _layouts     |   |-- default.html

第四步,建立文章。

回到項目根目錄,建立一個_posts目錄,用于存放blog文章。

  $ mkdir _posts

在該檔案中,填入以下内容:(注意,行首不能有空格)

  ---   layout: default   title: 你好,世界   <h2>{{ page.title }}</h2>   <p>我的第一篇文章</p>   <p>{{ page.date | date_to_string }}</p>

在yaml檔案頭後面,就是文章的正式内容,裡面可以使用模闆變量。{{ page.title }}就是檔案頭中設定的"你好,世界",{{ page.date }}則是嵌入檔案名的日期(也可以在檔案頭重新定義date變量),"| date_to_string"表示将page.date變量轉化成人類可讀的格式。

    |   |-- default.html      |-- _posts     |   |-- 2012-08-25-hello-world.html

第五步,建立首頁。

有了文章以後,還需要有一個首頁。

回到根目錄,建立一個index.html檔案,填入以下内容。

  title: 我的Blog   <p>最新文章</p>   <ul>     {% for post in site.posts %}       <li>{{ post.date | date_to_string }} <a href="{{ site.baseurl }}{{ post.url }}">{{ post.title }}</a></li>     {% endfor %}   </ul>

它的Yaml檔案頭表示,首頁使用default模闆,标題為"我的Blog"。然後,首頁使用了{% for post in site.posts %},表示對所有文章進行一個周遊。這裡要注意的是,Liquid模闆語言規定,輸出内容使用兩層大括号,單純的指令使用一層大括号。至于{{site.baseurl}}就是_config.yml中設定的baseurl變量。

    |-- index.html

第六步,釋出内容。

現在,這個簡單的Blog就可以釋出了。先把所有内容加入本地git庫。

  $ git add .   $ git commit -m "first post"

然後,前往github的網站,在網站上建立一個名為jekyll_demo的庫。接着,再将本地内容推送到github上你剛建立的庫。注意,下面指令中的username,要替換成你的username。

  $ git remote add origin https://github.com/username/jekyll_demo.git   $ git push origin gh-pages

上傳成功之後,等10分鐘左右,通路http://username.github.com/jekyll_demo/就可以看到Blog已經生成了(将username換成你的使用者名)。

首頁:

搭建一個免費的,無限流量的Blog----github Pages和Jekyll入門 一個極簡風格的部落格

文章頁面:

搭建一個免費的,無限流量的Blog----github Pages和Jekyll入門 一個極簡風格的部落格

第七步,綁定域名。

如果你不想用http://username.github.com/jekyll_demo/這個域名,可以換成自己的域名。

具體方法是在repo的根目錄下面,建立一個名為CNAME的文本檔案,裡面寫入你要綁定的域名,比如example.com或者xxx.example.com。

如果綁定的是頂級域名,則DNS要建立一條A記錄,指向204.232.175.78。如果綁定的是二級域名,則DNS要建立一條CNAME記錄,指向username.github.com(請将username換成你的使用者名)。此外,别忘了将_config.yml檔案中的baseurl改成根目錄"/"。

網站截圖:

搭建一個免費的,無限流量的Blog----github Pages和Jekyll入門 一個極簡風格的部落格

在學習完阮一峰同學的文章後,你就已經有能力搭建自己的獨立部落格了,但是這個部落格 隻有最基本的功能,并且也不好看。這時候,你面臨幾個選擇:

完全自己定制部落格

找一份架構,修改後使用

從GitHub上fork别人的部落格代碼,在其中添加自己的文章

如果選擇 1, 那麼可以好好看看後文的内容。

機制一 

  簡單地說,你在 GitHub 上有一個賬号,名為<code>username</code>(任意), 有一個項目,名為 <code>username.github.io</code>(固定格式,username與賬号名一緻), 項目分支名為 <code>master</code>(固定),這個分支有着類似下面的 目錄結構:

這樣,當你通路 <code>http://username.github.io/</code>時,GitHub 會使用 Jekyll 解析 使用者 <code>username</code>名下的<code>username.github.io</code>項目中,分支為<code>master</code> 的源代碼,為你建構一個靜态網站,并将生成的 <code>index.html</code> 展示給你。

關于這個目錄更多的内容,我們還不需要關心,如果你好奇心比較重,可以先看 後文<code>源代碼</code>一節。

看完上面的解釋,你可能會有一些疑問,因為按照上面的說法,一個使用者隻能有一個 網站,那我有很多項目,每個項目都需要一個項目網站,該怎麼辦呢?另外,在阮一峰 同學的文章中,特别提到,分支名應該為 <code>gh-pages</code>,這又是怎麼回事呢?

原來,GitHub認為,一個GitHub賬号對應一個使用者或者一個組織,GitHub會 給這個使用者配置設定一個域名:<code>username.github.io</code>,當使用者通路這個域名時, GitHub會去解析<code>username</code>使用者下,<code>username.github.io</code>項目的<code>master</code>分支, 這與我們之前的描述一緻。

另外,GitHub還為每個項目提供了域名,例如,你有一個項目名為<code>blog</code>, GitHub為這個項目提供的域名為<code>username.github.io/blog</code>, 當你通路這個域名時,GitHub會去解析<code>username</code>使用者下,<code>blog</code>項目的<code>gh-pages</code> 分支。

是以,要搭建自己的部落格,你可以選擇建立名為 <code>username.github.io</code>的項目, 在<code>master</code>分支下存放網站源代碼,也可以選擇建立名為 <code>blog</code> 的項目,在 <code>gh-pages</code>分支下存放網站源代碼。

機制二

Jekyll 提供了插件功能,在網站源代碼目錄下,有一個名為 <code>_plugins</code>的目錄, 你可以将一些插件放進去,這樣,Jekyll在解析網站源代碼時,就會運作你的插件, 這樣插件是 Ruby 寫成的。可以為Jekyll添加功能,例如,Jekyll預設是不提供分類 頁面的,你可以寫一個插件,根據文章内容生成分類頁面。如果沒有插件,你隻能每 次寫文章,添加分類時,為每個分類手動寫 HTML 頁面。

在本地運作 Jekyll 時,這些插件會自動被調用,但是GitHub在解析網站源代碼時, 出于安全考慮,會開啟安全模式,禁用這些插件。我們既想用這些插件,又想用 GitHub,怎麼辦呢怎麼辦呢?

GitHub還為我們提供了更一種解析網站的方式,那就是直接上傳最終的靜态網頁, 這樣,我們可以在本地使用 Jeklly 把網站解析出來,然後再上傳到 GitHub上, 這就使得我們既使用了插件,又使用了 GitHub。在上文的目錄結構中,有一個 名為 <code>_site</code> 的目錄,這個就是Jeklly在本地解析時最終生成的靜态網站,我們 把其中的内容上傳到 GitHub 的項目中就可以了。例如,我在GitHub上的網站, 既解析後的 <code>_site</code> 目錄,大概是這樣的:

其中的 <code>categories</code>,<code>2013</code>, <code>2014</code> 目錄就是分類插件和歸檔插件幫助我生成的, 我隻要把這個目錄下的内容上傳到 GitHub 相應的項目分支中就可以了。這樣,你 通路 <code>username.github.io</code>時,GitHub就不解析了,直接把<code>index.html</code>傳回給你了。

關于 git 和 jekyll 的安裝與基本使用,這裡就不多說了。

工作流一

如果你不使用插件,那麼隻需要維護一個分支就好:

其中 <code>username</code> 是你的 GitHub 帳号。

你需要在本地維護一份網站源代碼,添加新文章後,使用 jekyll 在本地測試一下, 沒有問題後,commit 到 GitHub 上的相應分支中就可以了。

工作流二

如果你需要使用插件,那麼需要維護兩個分支,一個是網站的源代碼分支 ,另一個 是 由Jeklly 解析源代碼後生成的靜态網站。

例如,如果項目名為 username.github.io,的源代碼分支名為 <code>source</code>,靜态網站分支名為master。平時寫部落格時, 首先在 source 分支下,添加新文章,然後本地使用 jekyll build 将添加文章後的網站 解析一次,這時 <code>_site</code> 目錄下就有新網站的靜态代碼了。然後把這個目錄下的所有内容 複制到 master 分支下。這個過程,可以寫一個 Makefile,每次添加文章後 make 一下, 就自動将文章釋出到 GitHub 上。

Makefile 内容如下:

再來看一下這個目錄結構:

_config.yml

我的網站建立在 <code>StrayBirds</code> 項目中,是以 <code>baseurl</code> 設定成 <code>StrayBirds</code>, 我的文章采用 Markdown 格式寫成,可以指定 Markdown 的解析器 <code>redcarpet</code>。 另外,安全模式需要關閉,以便 Jekyll 解析時會運作插件。 <code>pygments</code> 可以使得Jekyll解析文章中源代碼時加入特殊标記,例如指定代碼類型, 這可以被很多 javascript 代碼高度庫使用。 <code>excerpt_separator</code> 指定了一個摘要分割符号,這樣 Jekyll 可以在解析文章時, 将文章的提要提取出來。 paginate 指定了一頁有幾篇文章,頁數太多時,我們可以将文章清單分頁,我們在 後文還會提到。

_layouts

這個目錄存放着一些網頁模闆檔案,為網站所有網頁提供一個基本模闆,這樣 每個網頁隻需要關心自己的内容就好,其它的都由模闆決定。例如,這個目錄下的 default.html 檔案:

index.html

這是網站的首頁,通路 <code>http://username.github.io</code> 時,會指向 <code>http://username.github.io/index.html</code>,我們看一下基本内容:

檔案的主體部分周遊了站點的所有文章,并将他們顯示出來,這些文法都是 <code>liquid</code> 文法, 其中的變量,例如 <code>site</code>, 由 Jekyll 設定我們隻需要引用就可以了。而 <code>post</code> 中的變量, 如 <code>post.title</code>, <code>post.category</code> 是由 <code>post</code> 檔案中的 front-matter 決定,後面馬上就會看到。

_posts

這個目錄存放我們的所有部落格文章,他們的名字有統一的格式:

例如,2014-02-15-github-jeklly.md,這個檔案名會被解析,前面的 <code>index.html</code> 中, <code>post.date</code> 的值就由這裡檔案名中的日期而來。下面,我們看看一篇文章的内容示例:

可以看出,文章的 front-matter 部分設定了多項值,以後可以通過類似 <code>post.title</code>, <code>post.category</code> 的方式引用這些些,另外,<code>layout</code>部分的值和之前解釋的一樣, 檔案的内容會被填充到 <code>_layouts/default.html</code> 檔案的 <code>content</code> 變量中。

另外,文章中 <code>為什麼不試試呢</code>之後的有三個不可見的 <code>\n</code>,它決定了這三個 <code>\n</code> 之前的内容會被放在 <code>post.excerpt</code> 變量中,供其它檔案使用。

_includes

這個檔案中,存放着一些子產品檔案,例如 <code>categories.ext</code>,其它檔案可以通過

_plugins

這個檔案中存放一些Ruby插件, 例如 <code>gen_categories.rb</code>,這些檔案會在 Jekyll 解析網站源代碼時被執行。下一節講述的就是插件。

_site

Jekyll 解析整個網站源代碼後,會将最終的靜态網站源代碼放在這裡

插件使用 Ruby 寫成,放在 _plugins 目錄下,有些 Jekyll 沒有的功能,又不能 手動添加,因為頁面的内容會随着文章日期類别的不同而不同,例如分類功能和歸檔功能, 這時,就需要使用插件自動生成一些頁面和目錄。

使用方法是,把 plugins/categoryarchive_plugin.rb 放在 plugins 目錄下, 把 _layouts/categoryarchive.html 放在 layouts 目錄下, 這樣,這個插件會在Jekyll解析網站時,生成相應categories目錄,目錄下是各個分類, 每個分類下都有一個 <code>index.html</code> 檔案,這個檔案是根據模闆檔案 categoryarchive.html 生成的,例如:

然後,你就可以通過 <code>http://username.github.io/blog/categories/工具/</code> 通路 <code>工具</code>類下的 <code>index.html</code> 檔案。

使用方法同上。注意,這個插件在 jekyll-1.4.2 中可能會出錯,在 jekyll-1.2.0 中沒有錯誤。

分頁

評論

啟用評論。此外,如果你 fork 了我的項目,需要修改 `_inclusds/comments.ext`,把裡面的 `disqus_shortname ` 修改成你的部落格短名,這個在注冊的時候會設定。

評論區截圖:

搭建一個免費的,無限流量的Blog----github Pages和Jekyll入門 一個極簡風格的部落格

基本的内容就介紹到這裡,任何問題,歡迎留言。

另外,注意如果你要 fork 我的模闆,注意裡面有些連結是與我的 GitHub 名 minixalpha 相關的,在使用前最好批量地将這個字元串替換為你的賬号名。

從上面的工作流程可以看出,雖然每次我在本地添加檔案後,都隻要 make 一下就能釋出文章,但我還是覺得麻煩,希望能直接通過浏覽器在 GitHub 的網站上添加文章,是以,我又建立了一個非常簡潔的部落格,沒有分類,沒有評論,就是一個首頁,上面有所有文章連結,添加文章時候,隻要在 _post 目錄下添加一個 markdown 檔案就可以了。

搭建一個免費的,無限流量的Blog----github Pages和Jekyll入門 一個極簡風格的部落格

要使用這個項目,你需要做的是:

1. 注冊 GitHub,例如你的使用者名為 minixbeta

3. 到你 fork 後的項目中,将 _config.yml 中的 username 修改成你的使用者名 minixbeta

4. 得到你自己的部落格 http://minixbeta.github.io/StrayBirds/

需要注意的是,第一次使用 GitHub Pages 時,可能會有較長時間的緩沖時間,過15min左右,才能正常通路部落格,請耐心等待。可以嘗試修改項目名稱來加快這一程序,如何修改後面有介紹。

另外,我又添加了評論系統,讓這個簡潔的部落格更為完整,你需要到 Disqus 上注冊,然後添加一個站點,然後将 _confg.yml 中的 disqusname 修改成你的部落格短名,這個在Disqus 的 Add Disqus To Site 的時候會設定,注意這裡的對應關系。注意這個名字不是你的 Disqus 使用者名,是你的站點名。

如果你的文章想啟用評論,在寫文章的風格定義部分,加上 `comments: true` 即可。像示例文章中那樣就行,如果你不想加評論,就不要加這句。

主題包括:

hack  

搭建一個免費的,無限流量的Blog----github Pages和Jekyll入門 一個極簡風格的部落格

leap-day

搭建一個免費的,無限流量的Blog----github Pages和Jekyll入門 一個極簡風格的部落格

merlot 

搭建一個免費的,無限流量的Blog----github Pages和Jekyll入門 一個極簡風格的部落格

midnight 

搭建一個免費的,無限流量的Blog----github Pages和Jekyll入門 一個極簡風格的部落格

minimal 

搭建一個免費的,無限流量的Blog----github Pages和Jekyll入門 一個極簡風格的部落格

modernist

搭建一個免費的,無限流量的Blog----github Pages和Jekyll入門 一個極簡風格的部落格

slate

搭建一個免費的,無限流量的Blog----github Pages和Jekyll入門 一個極簡風格的部落格

time-machine

搭建一個免費的,無限流量的Blog----github Pages和Jekyll入門 一個極簡風格的部落格

kunka

搭建一個免費的,無限流量的Blog----github Pages和Jekyll入門 一個極簡風格的部落格

如果你想把項目的名字改了,例如,将 StrayBirds 修改為 blog

那麼,你需要做的是:

1. 在項目的 Setting 中将 Repository name 從 StrayBirds 修改為 blog

2. 将 _config.yml 中的 baseurl 修改為 /blog

3. 通過 http://minixbeta.github.io/blog/ 來通路你的新部落格。

Thanks to authors of the themes:

All the themes are intergrated in the blog template, with some modifies.

另外, 這篇文章從 2014 年 2 月到現在 (2015年4月) 一直在不斷更新,如果對大家有用,希望去 GitHub 上點個 star 支援一下。

<a href="http://blog.csdn.net/on_1y/article/details/19259435">http://blog.csdn.net/on_1y/article/details/19259435</a>