EvsChen's Blog

重新安装Jekyll碰到的问题

February 20, 2018

今天在重装jekyll想要重新开始记录博客,没想到出现了很多的问题。正常情况下运行 bundle exec jekyll serve 应该会在本地搭建一个静态的服务器。但是这一次显示的错误是 “Could not find gem ‘github-pages’ in any of the gem sources”,并且提示我运行 bundle install 来安装missing gems。

在运行 bundle install 的时候,又出现了问题。报的错误是”Error installing ffi: ERROR: Failed to build gem native extension.”。 提示我 “Make sure that gem install ffi -v '1.9.21' succeeds before bundling”。于是我又去安装这个 ffi。重新报了错误

ERROR:  Error installing ffi:
	ERROR: Failed to build gem native extension.

google这个问题的时候,在https://github.com/ffi/ffi/issues/608上面发现了这是ffi版本的一个bug,解决的办法是在Gemfile里面加入一行

gem 'ffi', '1.9.18'

指定ffi的安装版本,否则默认会安装最新1.9.21版的ffi。果然在修改了Gemfile之后再运行bundle就没有这个问题了。

重新整理这次解决问题的思路的时候,感觉其实是一个非常简单的dependency的问题。但是真正解决的时候花了我大半天,literally。将解决办法记录在这里,以防下次再遇到同样的问题。

有关Ruby,Gem,Bundle和Jekyll

这次debug的过程之所以绕了这么多弯路,很大的一部分原因是因为不了解Ruby,Gem,Bundle跟Jekyll这些东西之间具体的关系是怎么样的,离第一次在本地setup jekyll的环境又过去了太久。通过这次debug,也顺带着了解了一下这些概念。

  • Ruby:是一种编程语言,类似于Python,用处也跟python类似
  • Gem:是Ruby里面模块的名称,同时也是ruby自带的管理gem的命令(btw这个命名很有趣,就词的意思来说gem的概念好像包括ruby?),类似于Python里面的pip
  • Bundle:作为gem的名称是Bundler,是一个gem。可以通过Gemfile来快速的安装一个ruby应用所需要的gem。创建一个该应用的环境并且使用bundle exec运行。bundle有点类似于python里面Anaconda的env管理,Gemfile比较像node里面的package.json。在 bundle install之后,会生成Gemfile.lock,里面记录了最后一次成功运行应用时的gem dependency。
  • Jekyll:同样是一个ruby gem

在整理了这些概念之后,发现这次问题的最初原因应该是误删了Gemfile.lock文件,bundle又从Gemfile里面重新安装所有的gem,因此会自动获取最新版本的ffi,导致了bug的发生。


EvsChen

Written by EvsChen.
A craftsman and a programmer.