序:上篇文章雖然在本地搭建好了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. [2013-09-09 20:57:52] INFO WEBrick 1.3.1 [2013-09-09 20:57:52] INFO ruby 1.9.3 (2013-05-15) [i386-mingw32] [2013-09-09 20:57:53] INFO WEBrick::HTTPServer#start: pid=344 port=4000
在自動生成的站點的_post下,有一后綴為markdown的文件,其內容中包含如下代碼,即以ruby語法高亮顯示中間的代碼,正是這個代碼引起了上面的錯誤:
{% highlight ruby %} def print_hi(name) puts "Hi, #{name}" end print_hi('Tom') #=> prints 'Hi, Tom' to STDOUT. {% endhighlight %}
對於上面的錯誤提示信息,我當初看得也是一頭霧水,網上搜了下才發現的,至於錯誤信息具體啥意思,沒有深究,畢竟這是ruby語言的,而我還沒也沒功夫去學~
下面開始解決此問題:
安裝Python:好了下面開始解決問題,先去python或PortablePython下載一個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.7.egg creating c:\portable python 2.7.2.1\app\lib\site-packages\Pygments-1.6-py2.7.egg Extracting Pygments-1.6-py2.7.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.7.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.0) classifier (1.3.3) colorator (0.1) commander (4.1.5) directory_watcher (1.4.1) fast-stemmer (1.0.2) highline (1.6.19) io-console (0.3) jekyll (1.2.1) json (1.5.5) liquid (2.5.2) maruku (0.6.1) minitest (2.5.1) posix-spawn (0.3.6) pygments.rb (0.5.2) rake (0.9.2.2) rdoc (3.9.5) redcarpet (2.3.0) safe_yaml (0.7.1) syntax (1.0.0) yajl-ruby (1.1.0 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.0.gem (100%) Successfully installed pygments.rb-0.5.0 1 gem installed Installing ri documentation for pygments.rb-0.5.0... Installing RDoc documentation for pygments.rb-0.5.0... C:\>gem uninstall pygments.rb --version "=0.5.2" Successfully uninstalled pygments.rb-0.5.2
之后執行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/2013-05-06-jekyll-1-0-0-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