Jekyll + Github Pages 博客搭建入门

首先,先了解一下Jekyll和Github Pages的概念。

Jekyll是什么?

引用自官网
Jekyll 是一个简单的博客形态的静态站点生产机器。它有一个模版目录,其中包含原始文本格式的文档,通过一个转换器(如 Markdown)和我们的 Liquid 渲染器转化成一个完整的可发布的静态网站,你可以发布在任何你喜爱的服务器上。Jekyll 也可以运行在 GitHub Page 上,也就是说,你可以使用 GitHub 的服务来搭建你的项目页面、博客或者网站,而且是完全免费的。

简单来说,Jekyll就是将纯文本转化为静态博客网站,不需要数据库支持,也没有评论功能,想要评论功能的话可以借助第三方的评论服务。
Jekyll + Github Pages可以让你更加专注于博客内容,而不是如何搭建一个博客平台。

安装Jekyll

安装Jekyll之前,要先确保在你的电脑上已经配置好Jekyll运行所需要的环境,。

  • Ruby
  • RubyGems
  • NodeJS或其他 JavaScript 运行环境(如果还没安装NodeJS的,可以参照我写的另一篇文章Mac下安装nvm和NodeJS
  • Python2.7(或2.7以上版本)

以上环境在任何系统下都是必须的,安装方法可以自行谷歌。我本人是在Mac系统下搭建的, Mac已经自带Ruby、RubyGems和Python。如果是在Windows下搭建有任何问题,可以参考一下官方Windows环境文档

安装好以上环境后,使用RubyGems安装Jekyll。执行命令:

gem install jekyll

跟npm一样,所有的 Jekyll 的 gem 依赖包都会被自动安装。
如果需要安装指定版本,在上述命令后加上一个-v参数

gem install jekyll -v '指定版本号'

快速启动

安装了 Jekyll 的 Gem 包之后,就可以在命令行中使用 Jekyll 命令了。官网提供了一个快速启动的例子:

# 安装bundler,bundler通过gemfile文件来管理gem包
gem install  bundler

# 创建一个新的Jekyll项目,并命名为myblog
jekyll new myblog

# 进入myblog目录
cd myblog

# 在Jekyll自带的服务器上预览你的项目,默认的运行地址为http://localhost:4000
# bundle exec 表示在当前项目依赖的上下文环境中执行命令 jekyll serve
bundle exec jekyll serve

基本用法

$ jekyll build
# => 当前文件夹中的内容将会生成到 ./_site 文件夹中。

$ jekyll build --destination <destination>
# => 当前文件夹中的内容将会生成到目标文件夹<destination>中。

$ jekyll build --source <source> --destination <destination>
# => 指定源文件夹<source>中的内容将会生成到目标文件夹<destination>中。

$ jekyll build --watch
# => 当前文件夹中的内容将会生成到 ./_site 文件夹中,
#    查看改变,并且自动再生成。

Jekyll 自带了一个开发用的服务器,可以让你使用浏览器在本地进行预览。

jekyll serve
# 开发服务器将会运行在 http://localhost:4000/

serve 指令将会自动监测变化,生成新的文件。想关闭这功能,你可以使用 jekyll serve --no-watch,这里还有其他几个参数:
jekyll serve --livereload相当于前端开发中自动刷新浏览器。
jekyll serve --incremental相当于模块热替换,只刷新更改的模块。
jekyll serve --detachjekyll serve命令相同,但是会脱离终端在后台运行,如果你想关闭服务器,可以使用kill -9 1234命令,"1234" 是进程号(PID)。如果你找不到进程号,那么就用ps aux | grep jekyll命令来查看,然后关闭服务器。

目录结构

这里费了我好长的时间,因为网上大部分的教程都是基于下面这个官方的目录结构,而我新建的目录结构跟这些教程不一致。。。

.
├──_config.yml
├── _drafts
|   ├── begin-with-the-crazy-ideas.textile
|   └── on-simplicity-in-technology.markdown
├── _includes
|   ├── footer.html
|   └── header.html
├── _layouts
|   ├── default.html
|   └── post.html
├── _posts
|   ├── 2007-10-29-why-every-programmer-should-play-nethack.textile
|   └── 2009-04-26-barcamp-boston-4-roundup.textile
├── _site
├── .jekyll-metadata
└── index.html

这是官方列出的目录结构,但是我在实际的Jekyll项目中,发现新版的jekyll跟上面的目录结构有很大的差别,大致如下:

.
├── 404.html
├── Gemfile
├── Gemfile.lock
├── _config.yml
├── _posts
│   └── 2018-03-31-welcome-to-jekyll.markdown
├── about.md
├── index.html
└── posts.html

可以看到和上面官方给出的目录结构有很大的不同。先看下每个目录的作用是什么:

文件 / 目录 描述
_config.yml 保存配置数据。很多配置选项都可以直接在命令行中进行设置,但是如果你把那些配置写在这儿,你就不用非要去记住那些命令了。
_drafts drafts(草稿)是未发布的文章。这些文件的格式中都没有 title.MARKUP 数据。学习如何 使用草稿.
_includes 你可以加载这些包含部分到你的布局或者文章中以方便重用。可以用这个标签 {% include file.ext %} 来把文件 _includes/file.ext 包含进来。
_layouts layouts(布局)是包裹在文章外部的模板。布局可以在 YAML 头信息中根据不同文章进行选择。 这将在下一个部分进行介绍。标签 {{ content }} 可以将content插入页面中。
_posts 这里放的就是你的文章了。文件格式很重要,必须要符合:YEAR-MONTH-DAY-title.MARKUP永久链接 可以在文章中自己定制,但是数据和标记语言都是根据文件名来确定的。
_data 格式化好的网站数据应放在这里。jekyll 的引擎会自动加载在该目录下所有的 yaml 文件(后缀是 .yml, .yaml, .json 或者 .csv )。这些文件可以经由 `site.data` 访问。如果有一个 members.yml 文件在该目录下,你就可以通过 site.data.members 获取该文件的内容。
_site 一旦 Jekyll 完成转换,就会将生成的页面放在这里(默认)。最好将这个目录放进你的 .gitignore 文件中。
.jekyll-metadata 该文件帮助 Jekyll 跟踪哪些文件从上次建立站点开始到现在没有被修改,哪些文件需要在下一次站点建立时重新生成。该文件不会被包含在生成的站点中。将它加入到你的 .gitignore 文件可能是一个好注意。
index.html and other HTML, Markdown, Textile files 如果这些文件中包含 YAML 头信息 部分,Jekyll 就会自动将它们进行转换。当然,其他的如 .html, .markdown, .md, 或者 .textile 等在你的站点根目录下或者不是以上提到的目录中的文件也会被转换。
Other Files/Folders 其他一些未被提及的目录和文件如 css 还有 images 文件夹, favicon.ico 等文件都将被完全拷贝到生成的 site 中。这里有一些使用 Jekyll 的站点,如果你感兴趣就来看看吧。

虽然新版本的Jekyll生成的项目跟这里列出的目录名有很多不一样的,是因为有些目录已经被移到别处去了,但作用还是相同的。

新版中没有_drafts_includes_layouts_datajekyll-metadata等目录和文件,多了GemfileGemfile.lock,文件和assets目录。

_drafts个人感觉没有太大作用,可能官方也是觉得作用不大,所以去掉了。

_includes模块文件和_layouts布局文件是保存一些页面的的目录,可以方便后面写文章引入这些模板,这两个目录其实就相当于一个博客主题。新版中没有这两个目录是因为,新版的Jekyll中的Gemlfile可以指定主题了,并且新的项目都会有一个默认主题minima,主题包中就包含了_includes_layouts这两个目录。但是主题没有安装在Jekyll项目下,想要知道主题包在哪个位置,可以使用:

bundle show minima(默认主题名)
# 我电脑上输出的是在 /Users/xxx/.rvm/gems/ruby-2.4.1/gems/minima-2.4.1, xxx是你的用户名

GemfileGemfile.lock文件,这两个文件是用来管理整个项目的依赖的。主题就是在Gemfile中指定的,你可以在如下gem属性中找到:

{
  ...
  # This is the default theme for new Jekyll sites. You may change this to anything you like.
  gem "minima"
  ...
}

配置

Jekyll 有这非常灵活和强大的配置功能,既可以在网站根目录下的 _config.yml 文件中进行配置,也可以作为命令行参数来配置。默认配置大致如下:

 title: Your awesome title
 email: your-email@example.com description: >- # this means to ignore newlines until "baseurl:"
  
 baseurl: "" # the subpath of your site, e.g. /blog
 url: "" # the base hostname & protocol for your site, e.g. http://example.com
 twitter_username: jekyllrb
 github_username:  jekyll

 # Build settings
 markdown: kramdown
 theme: minima
 plugins:
   - jekyll-feed  

yml文件使用了YAML语法,如果想更好的理解Jekyll就需要了解一下YAML语法的内容,这里引用一下阮一峰老师写的一篇YAML语法教程

一般来说_config.yml的默认内容不需要太大改动,只需要往里面添加你需要的自定义属性,然后你就可以在页面模板中使用site.属性名来取得对应的值,例如site.title的值就是Your awesome title
一般主题中也会自动帮你写好这些自定义属性,搭建你自己的博客时你只需要将这些自定义属性改为你想要的值即可。

Jekyll官方中文文档:点击跳转


接下来说一下Github Pages。

什么是Github Pages

GitHub Pages 是一个静态网站托管服务,直接从github仓库托管你个人、公司或者项目页面 ,并且不需要你写任何后端语言来支持。

Github Pages的服务是免费的,但是也有一些限制:

  • 仓库空间不大于1G
  • 每个月的流量不超过100G
  • 每小时更新不超过 10 次

但是这些限制对我们普通人来说肯定没影响的,所以可以忽略。
这里只是将Github Pages当做一个平台,其他详细信息可以在Github Pages 文档查看

Jekyll + Github Pages搭建静态博客

好吧,终于说到正题了,其实这里搭建的过程很简单,只要你找好一个博客模板然后fork到自己的github上。但是我之前花费了好长的时间才搞得定,因为我是想自己新建一个Jekyll项目,而不是fork别人的,但是由于Jekyll最新版本新建的项目把主题功能分开了,缺少了_includes_layouts目录,不兼容现在的Github Pages的模式,所以搞了我好久,后来就直接去github上找博客模板了。

我用的是黄玄大神的博客模板,github仓库在这里,进入仓库,点击Fork

Fork项目

然后回到你自己的仓库,进入刚刚fork的博客项目,点击setting,将仓库名字改为: <username>.github.io<username>就是你的github用户名,然后点击 Rename

该项目名字

然后等几分钟,在浏览器打开https://xxx.github.io,你就可以看到博客页面,但是此时页面的内容都不是你自己的,这是你首先需要修改一下_config.yml内容。具体的教程还是直接看黄玄大神的教程吧,有个中文版教程,我也就懒得班门弄斧了。

写博客

有了博客网站,就到了最后“最难”的一部分了——写博客。

推荐先将博客项目从github上clone到本地,然后进到博客目录在命令行执行jekyll serve开启本地预览,这样就可以边写边看效果,一般本地没有报错等问题,写好后上传到github后也是没问题的,如果出现构建Github Pages错误的问题,GitHub 会向你的账户发送邮件。

_posts目录就是专门存放博客文件的,你可以使用markdownTextile(这个没听过)或者html格式的文件来写博客,我个人是用markdown格式写的。但是不管是哪种格式的文件都需要包含 YAML 头信息, Jekyll 才会把它当做一个特殊的文件来处理。

_posts目录下新建一个markdown文件,头信息必须在文件的开始部分,并且需要按照 YAML 的格式写在两行三虚线之间。如下所示:

---
layout: post
title:  "Welcome to Jekyll!"
date:   2018-03-31 02:36:26 +0800
tags:
      - example
---

...
这里就可以使用markdown格式或其他格式写博客内容啦

变量名称 描述
layout 如果设置的话,会指定使用该模板文件。指定模板文件时候不需要文件扩展名。模板文件必须放在 _layouts 目录下。
permalink 如果你需要让你发布的博客的 URL 地址不同于默认值 /year/month/day/title.html,那你就设置这个变量,然后变量值就会作为最终的 URL 地址。
published 如果你不想在站点生成后展示某篇特定的博文,那么就设置(该博文的)该变量为 false。
date 这里的日期会覆盖文章名字中的日期。这样就可以用来保障文章排序的正确。日期的具体格式为YYYY-MM-DD HH:MM:SS +/-TTTT;时,分,秒和时区都是可选的。
categorycategories 除过将博客文章放在某个文件夹下面外,你还可以指定博客的一个或者多个分类属性。这样当你的站点生成后,这些文章就可以根据这些分类来阅读。categories 可以通过 YAML list,或者以逗号隔开的字符串指定。
tags 类似分类 categories,一篇文章也可以给它增加一个或者多个标签。同样,tags 可以通过 YAML 列表或者以逗号隔开的字符串指定。

除了这些预定义的变量,也可以自定义变量,然后在布局文件中{{ page.自定义变量 }}来引用

我第一次写博客头信息的时候遇到两个坑

  • 设置date的时候,如果加上了具体时间(小时:分钟:秒),必须在后面写上+0800(时区偏移),否则将不会生成该文章页面。
  • YAML语法是不允许用tab来缩进,只能用空格。

写好文章后,上传github后需要等一两分钟,Github Pages就会更新你的博客啦。

好吧,博客搭建的教程大致就到这了,第一次写这么长的文章,还是教程,感觉写的好烂,如果这个教程能有幸被有缘人看到,哪里有错误或者看不懂的就留言给我吧。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容