Mindon.IDEA

Air off, Mind on ~ / Javascript+Golang, Sci, Health… /

Two Problems Found in Jekyll When Using Octopress

我对Ruby并不太熟,也只是偶尔稍微学习过一点而已。用得比较频繁的就是这个博客的生成工具Octopress了。这个基于Sekyll框架的全静态博客生成工具就是ruby实现的。每次安装一系列的工具和依赖包带来的郁闷不亚于装其它一堆以来的linux工具。因为这个我一直在计划用go重写一个静态博客生成工具,当然github上已经能找到些了,比如gor。——话题跑远了。

这两个Sekyll的bug估计是被我折腾出来的。最近换笔记本,想把我的github博客工程迁到新笔记本上。这需要安装 Octopress 以来的Ruby运行环境,这个过程中搞了两个升级,一个是把Mac OS Yosemite自带的Ruby 2.0.0升级到了2.1.4,另一个是把 Octopress 也顺手升级到了github里的最新版。

升级安装Octopress环境过程中,首先遭遇了openssl问题,导致rake命令abort。一通折腾之后重启电脑莫名就好了。可以rake new_post了,不过rake generate报错…

遭遇的第一个报错时因为我把原来博客项目里的 source 和 plugins, deploy, public, config.yaml 都拷贝过来了,剩下一个sass目录没搬到新的Octopress目录导致。

一系列的工具都可以正常运行之后,却遭遇了代码相关的rake generate报错:文件找不到!呃的神,报错没有任何指示是哪个rb文件——对于一个没有真正做过ruby项目和编码的人来说还是期待网上能找到解决方案的。不过,一些列的尝试失败之后,还是决定跟踪代码调试(差点没装 ruby-debug 和 rdebug 来搞)。

第1个bug是:运行 rake generate 的时候,老提示 sitemap.xml 读取失败文件不存在。估计是版本或安装混乱引发。

“Error reading file /a**/gems/jekyll-sitemap-0.6.1/lib/sitemap.xml: No such file or directory @ rb_sysopen - /Users/u/*a/gems/jekyll-sitemap-0.6.1/lib/sitemap.xml”

线索很明显,正确的路径前加多了一个项目source的路径。还好,找到 jekyll-sitemap-0.6.1/lib/ 目录里只有一个.rb文件,代码量不多,通过print的办法定位到了 Page.new,找到 sekyll 的 page.rb 再定位到 read_yaml() 从而发现了 convertible.rb 里的 site.in_source_dir(base, name) —— 就是这里的问题,当 base 是一个非项目内路径时,就发生了前面多加了项目source路径的情况。找到问题之后解决就容易了,判断一下就好了

    if base.include? name
      fpath = site.in_source_dir(base, name)
    else
      fpath = File.join(base, name)
    end

这个修复本身也还不严谨,不过是够解决我的问题能写写博客就ok了。用这里的 fpath 替代原有的 File.read 里直接用的 site.in_source_dir(base, name) 就可以了。

第2个bug是一堆warning,估计是因为升级Octopress之后有的。

“Build Warning: Layout ‘nil’ requested in blog/categories/***/atom.xml does not exist.”

这个相对简单了,就是模版里的 layout 部分出的问题,新Octopress只认null不认nil了。于是找到了 source/atom.xml 改nil为null。但是categories这个不是atom.xml让我一通找,最后在 _includes/custom/category_feed.xml 找到,同样修改解决。

折腾这个加写这篇博文就花了我几乎半天……

Comments