其实最初做这个博客,可能是因为我暗藏了一颗文青的心,后来老有人问我博客怎么做的,想来想去干脆写个教程好了。
引言
这样的博客系统适合哪些人群呢?
- 不想、或者不愿意租用服务器
- 不想、或者不熟悉后端代码
- 更倾向于一个免费、永久、不限流量、速度靠谱的解决方案
- 没有太多时间维护
- 浏览量不大
- 可能只是出于一时兴趣
- 对代码感兴趣
- 具备一些编程基础知识
但是,也有一些弊端:
- 需要一些编程基础
- 不适合大型网站,内容过多会导致生成速度较慢
- 只能生成静态页面,动态功能仍旧需要使用外部服务,例如评论功能
此外,搭建博客系统又很多方式,例如使用 Hexo、Jekyll、Pelican 等。本文主要介绍 Jekyll。
Git 与 Github
这个博客网站是借助于 Github Pages 功能托管在 Github.com 服务器的,页面代码由我自己编写,这也就是说,要搭建一个这样的博客网站,你需要学会:
- Git 的基本使用
- Github 的基本使用
什么是 Git
简单来说 Git 是一种版本控制工具。版本控制工具是一类工具的通常,用于存储、追踪目录和文件的修改历史,方便用户进行管理控制。
Git 怎么玩
首先要玩 Git 先要安装,安装的方式有很多,通用的方法是在 Git 的官方网站下载源代码包或安装器。
如果你在使用 OS X 系统:
- Homebrew:
$ sudo brew install git - Macport:
$ sudo port install git-core
如果你在使用 Debian, Ubuntu, 或 Linux Mint:
$ sudo apt-get install git
如果你在使用 Fedora, CentOS 或 RHEL:
$ sudo yum install git
如果你在使用 Arch Linux:
$ sudo pacman -S git
如果你在使用 OpenSUSE:
$ sudo zypper install git
如果你在使用 Gentoo:
$ emerge --ask --verbose dev-vcs/git
关于 Git 的使用,你可以参考我之前的博客: 《Git 基本指令》、《Git Primer》。
什么是 Github
GitHub 是一个面向开源及私有软件项目的托管平台,因为只支持 Git 作为唯一的版本库格式进行托管,故名 GitHub。
Github 怎么玩
打开 https://www.github.com/,注册并登陆,即可。更多的内容后面必要时会有说明。
Jekyll

什么是 Jekyll
Jekyll 是一个简单的免费的博客生成工具,类似 WordPress,但它只是一个生成静态网页的工具,不需要数据库支持。
Jekyll 怎么玩
关于 Jekyll 的语法,参见我的另一篇博客《Liquid for Designers》。
关于 Jekyll 的安装请参考后面 GEM 部分。
关于 Jekyll 的使用,初期我们只需要记得 $ jekyll build 这个编译指令即可。
Ruby
什么是 Ruby
Ruby 一种简单快捷的面向对象脚本语言,在 20 世纪 90 年代由日本人松本行弘 (まつもとゆきひろ, Matsumoto Yukihiro) 开发。
Ruby 怎么玩
如果你在使用 OS X,你的系统应该已经预置了 Ruby,只是可能版本较低。
如果你在使用 Linux,你可以使用这样的指令进行搜索:
rpm -qa | grep ruby
yum list | grep ruby
如果你查询到了结果,说明你已经安装或系统预置了 Ruby; 如果没有查询到,你可以通过 yum install ruby 进行安装。
RVM
什么是 RVM
RVM 是 Ruby Version Manager 的缩写,即 Ruby 版本管理器,用于管理计算机中安装的 Ruby 版本,也就意味着,你可以同时安装多个版本的 Ruby。
RVM 怎么玩
RVM 的安装和基本用法,可以参考我的其他博客:《Ruby on OS X》。
GEM
什么是 GEM
RubyGems 的简称,是一个用于对 Ruby 组件进行打包的 Ruby 打包系统。
它的安装或升级可以参考 官方说明。
GEM 怎么玩
在本文中,我们主要用来安装 Jekyll,使用 $ gem install jekyll 指令即可安装。
在博客建设完成或新帖子完成需要提交时,可以通过 jekyll b 指令进行构建,并在出错时通过输出内容获取可能的错误信息。
Markdown
什么是 Markdown
Markdown 是一种轻量级文本标记语言,这个博客网站中的所有博客都是使用 Markdown 编写的。当然其支持的标记语言并非只有 Markdown, 但整体来说 Markdown 是学习成本比较低的, 大部分人可能都已经会了。
Markdown 怎么玩
关于 Markdown 的语法,你可以参考我之前的博客:《Markndow: Syntax》。
由于 Markdown 的衍生版本和标准有很多,可能你已知的部分语法特性在 Github 并不能得到充分或合适的支持。
关于编辑器,如果你在使用 OS X,推荐你使用 MWeb,你可以在 Mac App Store 搜索到它。
或者,不论你在使用什么操作系统,你都可以使用 Atom 编辑器进行编辑,只不过,你可能需要安装相关的语言和预览等插件才能更好的进行编辑,插件安装的入口就在 Atom 的设置中。
开始搭建
创建仓库
首先你需要在 Github 注册、登录并创建一个代码仓库 (Repository)。仓库的名称格式应为 xxxxx.github.io,其中 xxxxx 可自定义,一般为英文字母。
你的博客地址,默认将是 https://xxxxx.github.io/。
创建好之后,你可以选择在桌面打开,这要求你安装 Github Desktop 客户端。
或者,你也可以复制页面上的 git 地址,从终端进行克隆。为了方便我建议你使用 Github Desktop。
仓库设置
进入仓库设置 Settings 中,在 Options 模块下找到 Github Pages 部分,选择 Source 为 master branch 并保存。


基本配置
接下来,进入代码仓库的本地目录,新建一个名为 _config.yml 的文本文件。
关于此文件的详细配置,可以参考 官方文档。
你可以以本站的配置作为参考:
name: Meniny's Blog
url: {{ site.url }}/
description: I’m a software engineer lived in China. This is my very own Blog which shares skills. All written content on this site is provided under a Creative Commons ShareAlike license and all code is provided under a MIT license unless otherwise stated. Please give sources if you'd like to quote.
author: "Ezra"
email: meniny#qq.com
domain: www.meniny.com
permalink: /post/:categories/:title/
paginate: 10
highlighter: rouge
#pygments
exclude: ['Gemfile.lock', 'Gemfile', 'Rakefile']
gems:
- jekyll-paginate
简单说明:
name: 网站名称
url: 网站链接
description: 网站描述
author: 作者名称
email: 坐着邮箱
domain: 域名
permalink: 帖子URL的形式,本例中,帖子最终会被解析为 网站域名/post/帖子分类/帖子标题/ 的形式,如 {{ site.blog_perma }}/how_to_eat_my_mac/
paginate: 10 帖子列表分页时每页帖子数
highlighter: rouge 帖子中嵌入代码时,代码高亮所使用的工具
exclude: ['Gemfile.lock', 'Gemfile', 'Rakefile']
gems:
- jekyll-paginate
页面模版
做了信息配置后,同一个路径下,新建名为 _layouts 的文件夹,用于存放页面的模板文件。
我们先创建一个最基本的的模板,例如 default.html:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>{% raw %}{{ page.title }}{% endraw %}</title>
</head>
<body>
{% raw %}{{ content }}{% endraw %}
</body>
</html>
在创建一个用于帖子详情的模板,例如 post.html:
<p>
<span>{% raw %}Date: {{ page.date | date: "%b %d, %Y" }} | Category: {{ page.category }}{% endraw %}</span>
</p>
<div>{% raw %}{{ content }}{% endraw %}</div>
创建帖子
好了,折腾了这么多,终于该写第一篇帖子了。
首先,与 _layouts 同一路径下,新建 _posts 文件夹,用于存放帖子。
帖子一般为 Markdown 格式,后缀通常为 .md,文件名形如 2016-09-25-SamplePostTitle.md。
其中,2016-09-25 部分表示帖子发布日期,必须保持这个格式;
后面 SamplePostTitle 部分表示帖子的标题,最好不要出现中文和空白符号,一般使用下划线 (_)、连字符 (-)、字母和数字组成。其实这里所谓的标题,只是用于帖子的链接,在博客中显示的标题是在帖子内部定义的,所以不必担心起名的问题。
现在我们来写第一篇帖子:
# 一号标题
第一篇博客
## 二号标题
* 不知道写点什么好
* 那就随便写吧
* 好了就这样吧
### 三号标题
放一段代码试试 `Jekyll`
{% raw %}
```html
<srcipt type="text/javascript">
function test() {
alert("This is a test code");
}
</script>
{% endraw %}
四号标题
这里我们指明了帖子所用的布局、帖子标题、帖子分类,甚至还指明了标签和描述。而后面是 `Markdown` 格式的帖子内容,其中包含了一段 `Jekyll` 代码,用于高亮一些内嵌与帖子中的代码,`Jekyll` 代码会被自动解析,然后帖子内容会被自动解析为 `HTML` 页面,当然,在书写正确的情况下,内嵌的代码部分不会被解析,将保持原样显示。
#### 主页
我们到目前为止,博客还没有一个主页,况且,有了帖子,必不可少需要一个帖子列表。
在 `_post` 所在的目录下,新建一个文本文件名为 `index.html`:
```html
{% raw %}
{% for post in paginator.posts %}
<article>
<h3>
<a href="{{ post.url }}">{{ post.title }}</a>
</h3>
<div>{{ post.excerpt | strip_html }}</div>
</article>
{% endfor %}
<div>
<center>
{% for page in (1..paginator.total_pages) %} {% if page == paginator.page %}
<span class="active">{{ page }}</span> {% elsif page == 1 %}
<a href="{{ '/index.html' | prepend: site.baseurl | replace: '//', '/' }}">{{ page }}</a> {% else %}
<a href="{{ site.paginate_path | prepend: site.baseurl | replace: '//', '/' | replace: ':num', page }}">{{ page }}</a> {% endif %} {% endfor %}
</center>
</div>
{% endraw %}
好了,我们创建了一个主页,布局采用 default,并设置了名称。主页的内容是分页的帖子列表(每页的数量在前面已经配置过),每页的列子列表后面是页码索引。
其他页面
现在,你也许还想要其它页面,那么依旧在仓库的根目录,新建一个目录,名称根据你的意愿选择,但一般也选择下划线、连字符、英文字母和数字的组合即可。
进入该目录,新建名为 index.html 的文本文件,这里我们示范制作一个帖子分类列表:
{% raw %}
{% for cat in site.categories %}
<h3><span id="{{ cat[0] }}">{{ cat[0] }} [{{ cat[1].size }}]</span></h3>
<ul>
{% for post in cat[1] %}
<li><span>{{ post.date | date_to_string }}</span> » <a href="{{ post.url }}">{{ post.title }}</a></li>
{% endfor %}
</ul>
{% endfor %}
{% endraw %}
至此,一个新的页面完成了。你只需访问 https://xxxxx.github.io/刚才的文件夹名 即可浏览这个页面。
本例中,新建了名为 categories 的目录,则页面地址为 https://xxxxx.github.io/categories/,你也可以通过 /categories/ 在其他页面中表示它的链接。
提交内容
现在,帖子也写好了,列表也有了,我们使用 Git 提交到服务器,稍等一会儿即可在网站中浏览了。
如果你使用 Github Desktop,选择要提交的文件和文件夹,输入提交信息,点击提交按钮即可。
等待一会儿让页面生成,然后就可以访问 https://xxxxx.github.io/ 来浏览你的博客了。
域名
如果你对这个默认的域名不感兴趣,你可以购买自己专属的域名,途径有很多,在大陆推荐你使用 阿里云,万网已被并入阿里云。
首先,你要在刚才的仓库根目录新建名为 CNAME 的文本文件,没有扩展名,其内容为你购买的域名,例如 somedomain.com。
然后,在终端 ping 一下 xxxxx.github.io 并复制 IP 地址:
$ ping xxxxx.github.io
PING xxxxx.github.io (123.123.123.123): 56 data bytes
64 bytes from 123.123.123.123: icmp_seq=0 ttl=55 time=68.416 ms
64 bytes from 123.123.123.123: icmp_seq=1 ttl=55 time=71.404 ms
64 bytes from 123.123.123.123: icmp_seq=2 ttl=55 time=76.085 ms
...
现在添加解析记录:
| 记录类型 | 主机记录 | 记录值 |
|---|---|---|
| A | @ | 123.123.123.123 |
| A | www | xxxxx.github.io |
| CNAME | * | xxxxx.github.io |
这些解析需要一定的时间,请耐心等待。
顺便一提,有了域名,还可以在 QQ 邮箱绑定域名邮箱哦。比如 Ezra@meniny.cn,详细信息请参照 QQ 邮箱 [设置] - [账户] - [域名邮箱] 部分。
其它
事实上,本文所介绍的都是关于在 Github Pages 创建博客的一种简单的情况,更多高级和复杂的用法,例如集合、自定义分页路径等,不可能一一介绍,但你可以在实践中摸索,或者有兴趣的话也可以和我讨论。