这篇文章是从我的Jekyll静态博客搬过来的,虽然已经不再使用,但不得不承认静态博客的诸多优越性,以及Jekyll确实是个很好的平台。写作时,我才刚开始倒腾,现在再看这些问题真的太简单了。。不过有一点不容忽视的是Windows在一些情况下确实比Linux复杂,比如命令行模式下。这篇文章的内容基于Windows 10。

原文

这个博客是用Jekyll搭建的,之前GitHub已经有集成好的Jekyll环境,我直接Fork了一个主题就开始用了。之后做了一些外观和功能方面的调整,觉得每一步调整都要git上去挺费时间的(虽然GitHub Desktop已经做得挺不错了),所以我需要在本地搭建一个Jekyll环境,可以直接在本地调试。下面记录了我安装的过程以及遇到的一些问题,希望后来人可以少走弯路。

以下是Windows下搭建Jekyll环境的大致流程:

  1. 安装Ruby
  2. 安装MSYS2
  3. 安装Ruby DevKit
  4. 切换到RubyGems国内镜像
  5. 安装Jekyll
  6. 开启Jekyll服务

我会把每一步自己遇到的问题几下来的。

1. 安装Ruby

Jekyll是基于Ruby的,所以首先安装Ruby。官网选择正确版本安装即可。

安装后输入ruby -v以定是否安装成功。

2. 安装MSYS2

这一步不知道是不是只有我会遇到,与bash shell有关,这个安装完Ruby后会自动跳出来的,根据提示选择版本即可,因为我不会用到高级功能,所以我选了第一个basic。

3. 安装Ruby DevKit

在刚才的Ruby官网滑到下面有一个DEVELOPMENT KIT,选择合适版本,注意下载的文件运行时让选择的解压路径就是最后的安装路径。

安装后输入gem -v以确定是否安装成功。

如果成功,cd到安装路径,陆续输入:

$ ruby dk.rb review
$ ruby dk.rb init
$ ruby dk.rb install

看到下面的输出:

[INFO] Updating convenience notice gem override for 'E:/jekyll/ruby'
[INFO] Installing 'E:/jekyll/ruby/Ruby24-x64/lib/ruby/site_ruby/devkit.rb'
4. 切换到RubyGems国内镜像

为了提速,官方镜像非常慢,如果有梯子和耐心可以跳过这步。

切换到Ruby China

$ gem sources --add https://gems.ruby-china.org/ --remove https://rubygems.org/
$ gem sources -l
*** CURRENT SOURCES ***
https://gems.ruby-china.org
# 请确保只有 gems.ruby-china.org
$ gem install rails

下载完成后最后一行显示如下,之后可以安装Jekyll了。

Done installing documentation for safe_yaml, rouge, forwardable-extended, pathutil, mercenary, liquid, kramdown, ffi, rb-inotify, rb-fsevent, listen, jekyll-watch, sass, jekyll-sass-converter, colorator, public_suffix, addressable, jekyll after 75 seconds
18 gems installed

5. 安装Jekyll

$ gem install jekyll

安装后输入jekyll -v确认安装成功。

6. 开启Jekyll服务

最麻烦的从这里开始。

我已经有自己的博客了,所以不需要新建,如果新建请参看官方教程

首先把我的文件clone到本地:

$ git clone [email protected]:ad-adam/mashirozx.github.io.git
#以上是我的博客fork版,状态停留在写这篇博客的时候,以保证步骤的可重复性,此处的git为非必要步骤
#如果要在本地已有目录中启动预览,直接如下cd即可
$ cd mashirozx.github.io

理论上,之后运行jekyll serve就能在http://localhost:4000/中看到我的页面了,可是我却看到了以下报错:

E:/jekyll/ruby/Ruby24-x64/lib/ruby/gems/2.4.0/gems/bundler-1.15.1/lib/bundler/resolver.rb:396:in 'block in verify_gemfile_dependencies_are_found!': Could not find gem 'jekyll (~> 3.2.1) x64-mingw32' in any of the gem sources listed in your Gemfile.
(Bundler::GemNotFound)
        from ...
        #以下是一串from,省略

注意到第一句Bundler::GemNotFound,所以运行:

$ bundle install

输出倒数第四行看到“Thank you for installing html-pipeline!”就可以了。再次运行jekyll serve,又一次报错,这次是:

E:/jekyll/ruby/Ruby24-x64/lib/ruby/gems/2.4.0/gems/bundler-1.15.1/lib/bundler/runtime.rb:317:in 'check_for_activated_spec!': You have already activated jekyll 3.4.3, but your Gemfile requires jekyll 3.2.1. Prepending `bundle exec` to your command may solve this.
(Gem::LoadError)

纳尼,Jekyll版本太高?这都不行(;Д;)

好吧,我想应该有两个方法:一是降版本,二是修改Gemfile中的版本(在博客根目录中)我选择了前者。

$ bundle exec gem uninstall jekyll -v 3.4.3
$ bundle exec gem install jekyll -v 3.2.1

至此,问题解决,注意以上问题不是环境问题,只是版本与主题不对应。新版一定是有它的优势的,所以不一定要选择降级,不过我担心和主题不兼容,所以选择了降级。

再次运行jekyll serve,显示:

 Auto-regeneration: enabled for 'E:/jekyll/myblog/mashirozx.github.io'
Configuration file: E:/jekyll/myblog/mashirozx.github.io/_config.yml
jekyll 3.2.1 | Error:  Permission denied - bind(2) for 127.0.0.1:4000

127.0.0.1:4000端口被占用???发誓找出这个占用的软件一定要把它灭了????。

CMD中输入netstat -ano查看网络端口占用情况,找到下面几条记录:

 TCP    127.0.0.1:4000         0.0.0.0:0              LISTENING       2836
 TCP    127.0.0.1:4000         127.0.0.1:6675         CLOSE_WAIT      2836
 TCP    127.0.0.1:4000         127.0.0.1:7342         CLOSE_WAIT      2836

可以看到4000端口被一个PID=2836的程序占用,继续揪出来,输入tasklist /svc /FI "PID eq 2836"看到:

映像名称                       PID 服务
========================= ======== ============================================
FoxitProtect.exe              2836 FxService

晕,福昕阅读器的保护服务,考虑到福昕阅读器挺好用的,这次选择原谅它吧,不过现在要把这个服务干掉,打开任务管理器->服务->FxService,右键干掉。


重新输入jekyll serve,终于看到:

Auto-regeneration: enabled for 'E:/jekyll/myblog/mashirozx.github.io'
Configuration file: E:/jekyll/myblog/mashirozx.github.io/_config.yml
   Server address: http://127.0.0.1:4000/
 Server running... press ctrl-c to stop.

此时可以进入http://localhost:4000/查看了。

以上です。

Mashiro 2017/6/5

Q.E.D.

Comments