序:上篇文章虽然在本地搭建好了jekyll环境,但是却存在一些问题,如通过jekyll new创建的站点无法正常跑起来、中文编码有问题。这说明之前搭建的环境有不周之处。

PS:因之前自己搭建环境时并未做过多记录,现在写起文章来需要在模拟几次安装,所以本文写的有点慢,毕竟不像当初只是为了安装,现在是为了弄清楚安装。立足点不同,需要做的事情也不同,这次需要做许多确认工作。

一、语法高亮插件问题

通过jekyll new命令创建的站点中使用了语法高亮插件pygments(该语法插件支持超多语言,估计也是因此jekyll中便使用了吧),但pygments需要单独另外安装,所以导致部署站点时出现如下错误,虽然网站启动了,但是并没有成功生产静态页面,导致浏览页面时都是空的。

C:\test>jekyll serve
Configuration file: C:/test/_config.yml
Source: C:/test
Destination: C:/test/_site
Generating... C:/Ruby193/lib/ruby/gems/1.9.1/gems/posix-spawn-0.3.6/lib/po
six/spawn.rb:162: warning: cannot close fd before spawn
[31m Liquid Exception: No such file or directory - /bin/sh in _posts/2013-09-0
9-welcome-to-jekyll.markdown[0m
done.
[-- ::] INFO WEBrick 1.3.
[-- ::] INFO ruby 1.9. (--) [i386-mingw32]
[-- ::] INFO WEBrick::HTTPServer#start: pid= port=

在自动生成的站点的_post下,有一后缀为markdown的文件,其内容中包含如下代码,即以ruby语法高亮显示中间的代码,正是这个代码引起了上面的错误:

{% highlight ruby %}
def print_hi(name)
puts "Hi, #{name}"
end
print_hi('Tom')
#=> prints 'Hi, Tom' to STDOUT.
{% endhighlight %}

对于上面的错误提示信息,我当初看得也是一头雾水,网上搜了下才发现的,至于错误信息具体啥意思,没有深究,毕竟这是ruby语言的,而我还没也没功夫去学~

下面开始解决此问题:

安装Python:好了下面开始解决问题,先去pythonPortablePython下载一个v2.7版本的Python(我下的是PortablePython_2.7.2.1.exe,v3版本似乎不行,网上有一些文章给了个V3版本的下载地址,我试了多次都无法解决此问题,不知道是不是因为这些文章过于久远导致方法过时了,最后幸得有人提过此问题,才得以解决。),这个似乎是另一门编程语言了啊,这个语法高亮的插件便是利用该语言编写的,因此要使用该插件就要安装它了。这里稍微提下python与Portablepython不同吧,后者继承了许多东东,比如这里如果安装了它,那么pygments便已经继承了在里面(我下的这个版本是如此),但后来发现pygments并不是最新版-.-!,虽然仍然可以继续下面的pygments安装,但是是否替换了老版本就无法确认了,也许版本之间的差异感觉不出来,但既然有这样的问题,还是选择用python好了,不过下面也会提及Portablepython的,因为我最初就是用它的。

如果安装PortablePython:下载安装版安装好后(选择安装全部即可~),需要自己配系统环境变量,对此表示无解(配置的路径为C:\Portable Python 2.7.2.1\App,具体看你的安装路径,然后指定到App文件夹即可)。

如果安装Python:下载安装好后系统环境变量已经自动配置了。

安装pygments:这里需要借用easy install来安装pygments(pygments官网介绍的),所谓easy install就是一个工具方便我们在python中安装类似pygments这类的东东。在pygments官方有介绍安装的:http://pygments.org/download/,有兴趣的可以瞧瞧。

如果是Python:因为要借用easy_install来安装pygments,所以需要先安装easy_install,根据http://peak.telecommunity.com/DevCenter/EasyInstall介绍,需要借用setuptools来安装easy_install,到此处https://pypi.python.org/pypi/setuptools下载最新版的setuptools,不过根据https://pypi.python.org/pypi/setuptools/1.1.6里面的说明,在Windows下建议的安装方式是直接下载安装脚本,该脚本会联网下载setuptools并进行安装(其实下载下来的setuptools里面就包含了该安装脚本-_-,如果把下载下来的安装脚本和setuptools放在一块,脚本会直接读取本地已有的setuptools进行安装。)。

下载安装脚本后,通过cmd执行python ez_setup.py命令即可,之后会刷屏哦,刷完基本就好了,当然前提是你网络信号要好啊^_^。之后再python目录下会多出一个Script文件夹,easy_install就在里面,在cmd中切换到Script文件夹,然后执行easy_install Pygments命令来安装Pygments,该操作也是联网下载安装(当然也可以离线,需要到此处下载相应版本的egg文件放于Script目录下),安装的日志信息同PortablePython使用easy_install Pygments命令应该是一样的。

如果是PortablePython:我在安装PortablePython后,easy install已经附带在里面的App\Script目录下(可能有些版本不会附带进去的,比如V3版本,该文章中便有介绍如何安装,但是V3版无法解决此处的问题,所以这里就不提及如何安装easy install了),在配置好系统环境变量后,打开cmd切换到App\Script下,执行如下命令即可,之后便会联网下载所需的文件进行安装,如下所示提示信息,注意大小写!!

C:\Portable Python 2.7.2.1\App\Scripts>easy_install Pygments
Searching for Pygments
Reading http://pypi.python.org/simple/Pygments/
Best match: Pygments 1.6
Downloading https://pypi.python.org/packages/2.7/P/Pygments/Pygments-1.6-py2.7.e
gg#md5=1e1e52b1e434502682aab08938163034
Processing Pygments-1.6-py2..egg
creating c:\portable python 2.7.2.1\app\lib\site-packages\Pygments-1.6-py2..egg Extracting Pygments-1.6-py2..egg to c:\portable python 2.7.2.1\app\lib\site-pac
kages
Adding Pygments 1.6 to easy-install.pth file
Installing pygmentize-script.py script to C:\Portable Python 2.7.2.1\App\Scripts Installing pygmentize.exe script to C:\Portable Python 2.7.2.1\App\Scripts
Installing pygmentize.exe.manifest script to C:\Portable Python 2.7.2.1\App\Scri
pts Installed c:\portable python 2.7.2.1\app\lib\site-packages\pygments-1.6-py2..eg
g
Processing dependencies for Pygments
Finished processing dependencies for Pygments

在安装好pygments,我们比如会兴奋的开始在自己的站点中执行jekyll serve,但发现问题还存在着(如果你的没问题,先请看下文,如果还是没问题,我真好奇了,请赐教~)

最终的问题着实让我纠结了一阵子,幸好有网友于网上提过次问题,幸得解决,该问题最终归结到了jekyll这边,确切的说是ruby这边,具体是pygments.rb上,瞧这名字估计是ruby调用pygments的一个工具包之类的,通过在cmd执行gem list可以看到pygments.rb的版本:

C:\test>gem list

*** LOCAL GEMS ***

bigdecimal (1.1.)
classifier (1.3.)
colorator (0.1)
commander (4.1.)
directory_watcher (1.4.)
fast-stemmer (1.0.)
highline (1.6.)
io-console (0.3)
jekyll (1.2.)
json (1.5.)
liquid (2.5.)
maruku (0.6.)
minitest (2.5.)
posix-spawn (0.3.)
pygments.rb (0.5.2)
rake (0.9.2.2)
rdoc (3.9.)
redcarpet (2.3.)
safe_yaml (0.7.)
syntax (1.0.)
yajl-ruby (1.1. x86-mingw32)

根据Stack Overflow上此贴的回答,pygments.rb的0.5.1、0.5.2版本有问题,导致无法正常执行(至于具体原因还没有深究过,不过觉得奇怪,为啥官方不修复呢?),所以需要把版本降至0.5.0才能正常运行,那么先安装0.5.0版然后卸载高版本就行了,如下命令,主要联网哦:

C:\>gem install pygments.rb --version "=0.5.0"
Fetching: pygments.rb-0.5..gem (%)
Successfully installed pygments.rb-0.5.
gem installed
Installing ri documentation for pygments.rb-0.5....
Installing RDoc documentation for pygments.rb-0.5.... C:\>gem uninstall pygments.rb --version "=0.5.2"
Successfully uninstalled pygments.rb-0.5.

之后执行jekyll serve就没问题了:

C:\test>jekyll serve
Configuration file: C:/test/_config.yml
Source: C:/test
Destination: C:/test/_site
Generating... done.
Server running... press ctrl-c to stop.

事后(2013-09-20),在看Ruby193\lib\ruby\gems\1.9.1\gems\jekyll-1.2.1目录下的相关文件时,发现jekyll.gemspec中包含如下信息:

  s.add_runtime_dependency('liquid', "~> 2.5.2")
s.add_runtime_dependency('classifier', "~> 1.3")
s.add_runtime_dependency('directory_watcher', "~> 1.4.1")
s.add_runtime_dependency('maruku', "~> 0.5")
s.add_runtime_dependency('pygments.rb', "~> 0.5.0")
s.add_runtime_dependency('commander', "~> 4.1.3")

上面红色字样可见依赖的是0.5.0版本,从而可以推测高版本真的不行吧。

然后我在rubygems网站上的jekyll下载页也看到了类似信息:

Runtime Dependencies
classifier ~> 1.3
colorator ~> 0.1
commander ~> 4.1.3
directory_watcher ~> 1.4.1
liquid ~> 2.5.2
maruku ~> 0.5
pygments.rb ~> 0.5.0
redcarpet ~> 2.3.0
safe_yaml ~> 0.7.0

 二、中文乱码问题(Add@2013-11-23:新版本已不再是问题,参见Windows下运行jekyll,编码已不再是问题)

由于这些都是外国进来的玩意,所以由于语言的不同,乱码也就产生了。一般咱们编写都是采用utf-8的吧,但是在windows下安装的jekyll,默认是以GBK编码的方式去读取咱们编写的文件,如此便乱码了。

要解决此问题,总不至于要写GBK编码的文件吧,毕竟这个编码不怎么通用,所以需要修改jekyll中的代码,让其以utf-8编码来读取我们的文件,已有网友找到解决方法!需要修改jekyll中读取的代码,指定为utf-8编码即可。具体如下:

//文件:C:\Ruby193\lib\ruby\gems\1.9.1\gems\jekyll-1.2.1\lib\jekyll\convertible.rb
//具体路径视版本号及安装路径有所不同
//找到如下代码:
self.content = File.read(File.join(base, name))
//修改为:
self.content = File.read(File.join(base, name), :encoding => "utf-8")

之后在文件中写入中文时,记得保存为utf-8的编码,否则运行时会报错的哦!

事后(2013-09-20),在Ruby193\lib\ruby\gems\1.9.1\gems\jekyll-1.2.1\site中发现疑似jekyll官网源码,且是以jekyll来运行的,于是好奇考出执行jekyll serve命令,谁知报如下错误:

Generating... [31m  Liquid Exception: invalid byte sequence in GBK in _posts/---jekyll----released.markdown

初步推测是编码问题,此时前面提到的编码问题已经修复,定是其它地方出现此类问题导致。通过jekyll serve --trace命令打印出详细错误信息:

 from C://Ruby193/lib/ruby/gems/1.9.1/gems/liquid-2.5.2/lib/liquid/template.rb:169:in `tokenize'
from C://Ruby193/lib/ruby/gems/1.9.1/gems/liquid-2.5.2/lib/liquid/template.rb:75:in `parse'
from C://Ruby193/lib/ruby/gems/1.9.1/gems/liquid-2.5.2/lib/liquid/template.rb:62:in `parse'
from C://Ruby193/lib/ruby/gems/1.9.1/gems/jekyll-1.2.1/lib/jekyll/tags/include.rb:59:in `render'
from C://Ruby193/lib/ruby/gems/1.9.1/gems/liquid-2.5.2/lib/liquid/block.rb:137:in `block in render_all'
from C://Ruby193/lib/ruby/gems/1.9.1/gems/liquid-2.5.2/lib/liquid/block.rb:124:in `each'
from C://Ruby193/lib/ruby/gems/1.9.1/gems/liquid-2.5.2/lib/liquid/block.rb:124:in `render_all'
from C://Ruby193/lib/ruby/gems/1.9.1/gems/liquid-2.5.2/lib/liquid/block.rb:110:in `render'
from C://Ruby193/lib/ruby/gems/1.9.1/gems/liquid-2.5.2/lib/liquid/template.rb:150:in `render'
from C://Ruby193/lib/ruby/gems/1.9.1/gems/liquid-2.5.2/lib/liquid/template.rb:160:in `render!'
from C://Ruby193/lib/ruby/gems/1.9.1/gems/jekyll-1.2.1/lib/jekyll/convertible.rb:82:in `render_liquid'
from C://Ruby193/lib/ruby/gems/1.9.1/gems/jekyll-1.2.1/lib/jekyll/convertible.rb:113:in `render_all_layouts'
from C://Ruby193/lib/ruby/gems/1.9.1/gems/jekyll-1.2.1/lib/jekyll/convertible.rb:148:in `do_layout'
from C://Ruby193/lib/ruby/gems/1.9.1/gems/jekyll-1.2.1/lib/jekyll/post.rb:259:in `render'
from C://Ruby193/lib/ruby/gems/1.9.1/gems/jekyll-1.2.1/lib/jekyll/site.rb:205:in `block in render'
from C://Ruby193/lib/ruby/gems/1.9.1/gems/jekyll-1.2.1/lib/jekyll/site.rb:204:in `each'
from C://Ruby193/lib/ruby/gems/1.9.1/gems/jekyll-1.2.1/lib/jekyll/site.rb:204:in `render'
from C://Ruby193/lib/ruby/gems/1.9.1/gems/jekyll-1.2.1/lib/jekyll/site.rb:36:in `process'
from C://Ruby193/lib/ruby/gems/1.9.1/gems/jekyll-1.2.1/lib/jekyll/command.rb:18:in `process_site'
from C://Ruby193/lib/ruby/gems/1.9.1/gems/jekyll-1.2.1/lib/jekyll/commands/build.rb:23:in `build'
from C://Ruby193/lib/ruby/gems/1.9.1/gems/jekyll-1.2.1/lib/jekyll/commands/build.rb:7:in `process'
from C://Ruby193/lib/ruby/gems/1.9.1/gems/jekyll-1.2.1/bin/jekyll:99:in `block (2 levels) in <top (required)>'
from C://Ruby193/lib/ruby/gems/1.9.1/gems/commander-4.1.5/lib/commander/command.rb:180:in `call'
from C://Ruby193/lib/ruby/gems/1.9.1/gems/commander-4.1.5/lib/commander/command.rb:180:in `call'
from C://Ruby193/lib/ruby/gems/1.9.1/gems/commander-4.1.5/lib/commander/command.rb:155:in `run'
from C://Ruby193/lib/ruby/gems/1.9.1/gems/commander-4.1.5/lib/commander/runner.rb:402:in `run_active_command'
from C://Ruby193/lib/ruby/gems/1.9.1/gems/commander-4.1.5/lib/commander/runner.rb:78:in `run!'
from C://Ruby193/lib/ruby/gems/1.9.1/gems/commander-4.1.5/lib/commander/delegates.rb:11:in `run!'
from C://Ruby193/lib/ruby/gems/1.9.1/gems/commander-4.1.5/lib/commander/import.rb:10:in `block in <top (required)>'

之后一个个文件查看了下,发现Ruby193\lib\ruby\gems\1.9.1\gems\jekyll-1.0.3\lib\jekyll\tags\include.rb中有有文件读取代码,经如下修改能正常运行:

#原来的代码
source = File.read(File.join(includes_dir, @file)) #修改为以utf-8编码读取
source = File.read(File.join(includes_dir, @file),:encoding=>"utf-8")

可见在解决了一个编码问题后,同类的问题也就能够自己解决了,以后再遇到此类编码问题,便可以自己查看错误信息尝试解决了。从这个问题可以看出,在windows下运行编码问题着实让人郁闷啊……

 PS:以上是我目前在Windows上使用所遇到的问题(事后遇到问题我会不断补充),在某些参考文章中还提到其他的一些问题,但我却没碰到,可能是版本差异的原因吧,如果有朋友遇到问题,我很乐意交流。

参考资料:

http://stackoverflow.com/questions/17364028/jekyll-on-windows-pygments-not-working

http://www.madhur.co.in/blog/2011/09/01/runningjekyllwindows.html

http://stackoverflow.com/questions/14253116/run-jekyll-server-failed-in-win7

http://liufeiyu.cn/github/2012/12/04/how-to-use-git-to-post-articles.html

05-11 11:27