天天看点

搭建一个免费的,无限流量的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>