重新安装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的发生。
Written by EvsChen.
A craftsman and a programmer.