UP | HOME

Jekyll安装

Table of Contents

1 安装Jekyll

参考官方教程:

1.1 服务器端安装(Linux)

gem install jekyll

执行后报错:

Fetching: liquid-2.6.1.gem (100%) ERROR:
While executing gem ... (Errno::EACCES)
Permission denied - /var/lib/gems

解决:加sudo执行后正常。

和ruby版本有关的错误,可以参考:

要点是不要使用默认包管理器安装与ruby有关的东西,卸载干净,安装rvm。安装好后,安装jekyll不报错。

执行Jekyll时可能报错:

execJs: 'Could not find a JavaScript runtime'

参考 http://stackoverflow.com/questions/9202324/execjs-could-not-find-a-javascript-runtime-but-execjs-and-therubyracer-are-in ,安装nodejs后可以解决:

sudo apt-get install nodejs

1.2 OS X端安装

本地也要安装Jekyll,便于查看网站效果。

直接执行 gem install jekyll,报错类似于:

[root@lrts25 rubygems-2.2.2]# gem install  rails
ERROR: Could not find a valid gem 'rails' (>= 0), here is why:
Unable to download data from
https://rubygems.org/ - Errno::ETIMEDOUT:
Connection timed out - connect(2) for "s3.amazonaws.com" port 443
(https://api.rubygems.org/latest_specs.4.8.gz)

解决:按照说明替换源为国内源,参见 http://ruby.taobao.org。 替换后再次安装成功(可能需要sudo)。

1.3 客户端生成博客模板

安装好Jekyll后,执行:

1: jekyll new myblog
2: Jekyll build
3: Jekyll serve

然后就可以在浏览器中访问localhost:4000,查看站点效果。

1.4 GoogleAPI无法访问的问题

我使用的Jekyll主题里使用了googleapi.com提供的CSS、JS和字体等文件,直接访问博客时速度很慢,容易连不上。搜索时发现360提供了解决方案:把所有googleapi.com的域名换为useso.com,由360的镜像前段CDN库提供所需要的资源文件。WordPress有类似问题也可以这样解决。

具体可以访问:http://libs.useso.com 了解。

另外七牛也提供了类似的CDN服务:http://www.staticfile.org

2 导入WordPress文章

我之前的博客使用WordPress系统,需要把里面的文章导入Jekyll,这方面网上有不少工具可以用。我使用的是 https://github.com/theaob/wpXml2Jekyll 。根据WordPress导出的SQL文件,输出Jekyll需要的markdown文件。如果图片链接有问题,需要先批量修改SQL中的图片链接,再进行导入。

3 添加多说评论系统

Jekyll本身不带博客评论系统,可以使用第三方的评论系统。使用比较多的是美国的Disqus和国内的多说评论框。Disqus的设计比较好看,数据安全性应该也更好,但是它只提供使用Disqus、Twitter和Facebook的登录,国内完全没法用。所以选择了多说,我用的主题里已经集成了多说的代码,修改个人ID就可以使用。否则自己把多说提供的代码加到_config文件里就可以添加评论框。

在原来的WordPress里安装多说的官方插件,使用与Jekyll相同的帐号,就可以把WordPress里已有的评论导入多说的数据库中,只要Jekyll和WordPress里文章的URL相同,原来的评论就可以显示在Jekyll中。

4 建立Git库,实现上传发布

把本地的Jekyll博客目录上传到服务器发布博客,有多种方法。我选择的是:

  1. 在本地保留一个博客的git库作为工作目录,在此写作博客;
  2. 在服务器上设置博客的git库作为git的服务器端;
  3. 每当需要更新博客时,从本地的工作目录push更新到服务器端的git库;
  4. 服务器的git库里设置post-receive钩子(hooks),钩子的作用是:每当这个库收到更新后,就clone一份内容出来,调用Jekyll build出站点页面,从新页面替换旧页面。
  5. 一次博客更新完成。

这个过程熟悉了很清晰,但是开始我对Jekyll和Git都不熟悉,花了一些时间去理解。

4.1 建立git库

在本地的博客目录blog中执行:

1: git init
2: git add .
3: git commit -m "first update"

这样完成了git库的创建,相关命令参见: http://git-scm.com/book/zh/Git-%E5%9F%BA%E7%A1%80-%E5%8F%96%E5%BE%97%E9%A1%B9%E7%9B%AE%E7%9A%84-Git-%E4%BB%93%E5%BA%93%E9%83%A8%E7%BD%B2git%E5%BA%93%E5%88%B0%E6%9C%8D%E5%8A%A1%E5%99%A8

到blog的上级目录执行:

1: git clone --bare blog blog.git

生成了名为blog.git的git库,这个库没有工作目录,将作为服务器端的git库。

上传blog.git库到服务器:

1: scp -r blog.git user@ip-address:~

本地库关联服务器git库,在本地blog目录中执行:

1: git remote add deploy user@ip-address:~/blog.git

在本地更新博客并commit后,执行:

1: git push deploy master

即完成对服务器git库的更新。

4.2 添加服务器端post-receive脚本

在服务器的~/blog.git/hooks目录下,新建post-receive文件,内容如下:

 1: #!/bin/bash
 2: 
 3: Git_Repo=$HOME/blog.git
 4: TMP_GIT_CLONE=$HOME/tmp/blog_repo
 5: PUBLIC_WWW=$HOME/blog_html
 6: JEKYLL_BIN=$HOME/.rvm/gems/ruby-2.1.3/bin/jekyll
 7: git clone $GIT_REPO $TMP_GIT_CLONE
 8: $JEKYLL_BIN build -s $TMP_GIT_CLONE -d $PUBLIC_WWW
 9: rm -Rf $TMP_GIT_CLONE
10: exit

里面的JEKYLL_BIN路径改成自己的,可以用whereis jekyll命令确定。给post-receive文件添加可执行权限后,每次从本地向服务器提交更新后,服务器端git库会执行post-receive脚本文件,最终更新博客目录的网页内容。

4.3 遇到的错误:

ruby的坑太多了(当然还是由于我不了解它),在调试post-receive时遇到的问题耽误了我很长时间。通过shell登录到服务器后执行jekyll build命令没有问题,但是从本地push更新到服务器后,执行post-receive时会提示找不到jekyll或者其他ruby需要的文件路径。按照rvm的安装指南,该添加到.bashrc里的环境变量我也加了,还是找不到路径。

经过尝试(此处省略1000字不表),问题定位到了环境变量中。原来在服务器的~/.bash_rc文件开头有这样一句话:

1: # If not running interactively, don't do anything
2: [ -z "$PS1" ] && return

效果是,如果你从shell登录到服务器,.bashrc后面的设置才会生效;否则如果类似git push这样远程执行命令,.bashrc直接就退出了,后面设置的环境变量自然不起作用。

这样,我把rvm的环境变量设置提到.bashrc最前头,就会始终生效,这些设置内容是:

1: export PATH="$PATH:$HOME/.rvm/bin" # Add RVM to PATH for  scripting
2: [[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"
3: # Load RVM into a shell session *as a function*

修改后,git库更新时post-receive hook执行成功。这样修改也许有副作用,我在stackoverflow上提的问题得到了开发者的回答:使用wrappers。具体可见:http://stackoverflow.com/a/26370576/1036812

5 使用org-mode在Jekyll中发表文章

6 相关资料

6.3 环境变量与配置文件

6.4 pandoc与各文档格式的互转

6.5 在github上搭建博客快速解决方案

6.7 编辑器推荐

  1. Mou http://25.io/mou/
  2. Marboo http://marboo.biz/guide/

这两款都支持实时预览,不想用emacs或vim的可以考虑。

Date: 2014-10-25

Author: 马楠

Created: 2014-11-08 Sat 01:33

Emacs 24.3.1 (Org mode 8.2.10)

Validate