Jekyll 排除故障(Jekyll 常见报错)

如果你在安装或使用 Jekyll 的过程中遇到问题,下面这些提示可能会对你有所帮助。如果你遇到的问题不在下方列出,请务必查看我们的其他帮助资源

安装问题

如果你在安装 gem 的过程中遇到错误,可能是因为你需要为 Ruby 2.x 安装用于编译扩展模块的头文件。

在 Ubuntu 或 Debian 系统中,可以通过以下命令安装:

sudo apt-get install ruby2.6-dev

在 Red Hat、CentOS 和 Fedora 系统中,可以运行:

sudo yum install ruby-devel

在 Arch Linux 上,你需要执行:

sudo pacman -S ruby-ffi

在 Ubuntu 中,如果你在执行 bundle exec jekyll serve 后卡住,并看到类似 Could not locate Gemfile.bundle/ directory 的错误信息,很可能是因为依赖项还没有全部安装完。较新的 Ubuntu 系统需要同时安装 rubyruby-all-dev

sudo apt-get install ruby ruby-all-dev

NearlyFreeSpeech 上,你需要在安装 Jekyll 之前运行以下命令:

export GEM_HOME=/home/private/gems
export GEM_PATH=/home/private/gems:/usr/local/lib/ruby/gems/1.8/
export PATH=$PATH:/home/private/gems/bin
export RB_USER_INSTALL='true'

在 Gentoo 上安装 RubyGems 的方法是:

sudo emerge -av dev-ruby/rubygems

在 Windows 上,你可能需要安装 RubyInstaller DevKit

在 Android(使用 Termux)上,你可以通过以下命令安装所有依赖:

apt update && apt install libffi-dev clang ruby-dev make

在 macOS 上,你可能需要更新 RubyGems(只有在必要时使用 sudo):

gem update --system

如果仍然遇到问题,可以通过以下命令下载安装新的命令行工具(如 gcc):

xcode-select --install

安装这些工具后,你就可以尝试使用以下命令来安装原生 gem(仍然建议只在必要时使用 sudo):

gem install jekyll

请注意,升级 macOS 并不会自动升级 Xcode(需要单独在 App Store 中完成),而旧版本的 Xcode 可能会影响命令行工具的使用。如果遇到这种情况,请升级 Xcode 并重新安装更新后的命令行工具。

以非超级用户身份运行 Jekyll(无需 sudo!)

在大多数 Linux 发行版、macOS 和 Windows 上的 Bash on Ubuntu 中,可以通过在 .bashrc 文件末尾添加以下几行,作为非超级用户运行 Jekyll,并且无需将 gem 安装到系统范围的目录中:

# Ruby exports

export GEM_HOME=$HOME/gems
export PATH=$HOME/gems/bin:$PATH

这告诉 gem 将其 gem 安装到用户的主目录中,而不是系统范围的目录,并将本地的 jekyll 命令添加到用户的 PATH 中,优先于任何系统路径。

这对于许多权限受限的共享虚拟主机服务也很有用。在运行 gem install jekyll bundler 之前将这些 export 添加到 .bashrc 中,就可以完全实现无 sudo 的 Jekyll 安装。

要使新的 export 生效,可以关闭并重新打开 Bash,注销并重新登录 shell 账户,或者在当前运行的 shell 中执行 . .bashrc

如果你在运行 jekyll new 命令时看到如下错误,可以按照上述方法解决:

jekyll new test

Running bundle install in /home/user/test...

Your user account is not allowed to install to the system RubyGems.
You can cancel this installation and run:

    bundle install --path vendor/bundle

to install the gems into ./vendor/bundle/, or you can enter your password
and install the bundled gems to RubyGems using sudo.

Password:

完成上述设置后,jekyll new 命令应该就能正常运行了。


Jekyll 与 macOS

从 macOS 10.11 版本开始引入了系统完整性保护(SIP),一些以前可写的目录现在被视为系统目录,不再开放写权限。鉴于这些变化,有几种简单的方法可以让你顺利安装运行 Jekyll。一种方法是更改 gem 的安装位置(只在必要时使用 sudo):

gem install -n /usr/local/bin jekyll

或者,也可以安装并使用 Homebrew 来设置 Ruby,步骤如下:

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

安装 Homebrew 后,接着运行:

brew install ruby

对于有更复杂需求的高级用户,推荐使用一些 Ruby 版本管理器来安装 Jekyll,例如:RVMrbenvchruby 或其他

如果你选择使用上述方式之一安装 Ruby,可能需要使用以下命令修改你的 $PATH 变量:

export PATH=/usr/local/bin:$PATH

图形界面(GUI)应用可以通过以下方式修改 $PATH

launchctl setenv PATH "/usr/local/bin:$PATH"

这些方法之所以推荐,是因为 /usr/local 被认为是在启用 SIP 的系统中一个“安全”的位置,能避免与 Apple 自带 Ruby 版本的冲突,并且可以将 Jekyll 及其依赖保持在一个隔离环境中。这样也带来了一个好处:当你添加或移除 gem 时无需使用 sudo


找不到 JavaScript 运行时。(ExecJS::RuntimeUnavailable)

当你没有合适的 JavaScript 运行时,在安装 jekyll-coffeescript 时可能会出现这个错误。为了解决这个问题,可以安装 execjstherubyracer 这两个 gem,或者直接安装 nodejs。更多信息请查看 issue #2327

运行 Jekyll 时的问题

macOS

Jekyll 与 ARM64 架构的 macOS 兼容。
不过,使用旧版本的 ffi 时,执行 bundle exec jekyll serve 可能会失败

你可能需要运行 bundle update,或手动将 ffi 更新到至少 1.14.2 版本。


Debian 或 Ubuntu

在 Debian 或 Ubuntu 上,你可能需要将 /var/lib/gems/1.8/bin/ 添加到你的路径中,
这样 jekyll 可执行文件才能在终端中正常使用。


Base-URL 问题

如果你使用了类似这样的 base-url 选项:

jekyll serve --baseurl '/blog'

……那么请确保你访问网站的地址为:

http://localhost:4000/blog/index.html

直接访问以下地址是无效的:

http://localhost:4000/blog

配置问题

冲突的 配置设置 的优先级顺序如下:

  1. 命令行标志
  2. 配置文件设置
  3. 默认值

也就是说:默认设置会被 _config.yml 中指定的选项覆盖,而命令行中指定的标志会覆盖所有其他地方指定的设置。

注意:从 v3.3.0 版本起,Jekyll 默认不会处理 node_modulesvendor 目录下的某些子目录。但是,如果在配置文件中显式定义了 exclude: 数组,则会覆盖该默认设置,导致一些用户在构建站点时遇到错误,错误信息如下:

    ERROR: YOUR SITE COULD NOT BE BUILT:
    ------------------------------------
    Invalid date '<%= Time.now.strftime('%Y-%m-%d %H:%M:%S %z') %>':
    Document 'vendor/bundle/gems/jekyll-3.4.3/lib/site_template/_posts/0000-00-00-welcome-to-jekyll.markdown.erb'
    does not have a valid date in front matter.

vendor/bundle 添加到 exclude: 列表中可以解决此问题,但这将导致 /vendor/ 下的其他子目录(如果有 /node_modules/ 也存在的话)被处理到目标文件夹 _site 中。

正确的解决方法是采用 exclude: 的默认设置,而不是完全覆盖它:

对于 v3.4.3 版本及以下,exclude: 设置应如下所示:

exclude:
  - Gemfile
  - Gemfile.lock
  - node_modules
  - vendor/bundle/
  - vendor/cache/
  - vendor/gems/
  - vendor/ruby/
  - any_additional_item # 用户自定义的项目放在最后

v3.5 版本起,GemfileGemfile.lock 默认被排除。因此,在大多数情况下,不需要在配置文件中再次定义 exclude: 数组。所以现有的定义可以根据上述方法修改,也可以完全删除或注释掉,以便今后方便编辑。


标记问题

Jekyll 使用的各种标记引擎可能会出现一些问题。本页面将记录这些问题,以帮助其他可能遇到相同问题的用户。

Liquid

Liquid 版本 2.0 似乎破坏了模板中 {{ 的使用。与以前的版本不同,在 2.0 中使用 {{ 会触发以下错误:

'{{' was not properly terminated with regexp: /\}\}/  (Liquid::SyntaxError)

摘要

从 v1.0.0 版本开始,Jekyll 自动生成文章摘要。从 v1.1.0 版本开始,Jekyll 还会通过 Liquid 处理这些摘要,这可能会导致一些奇怪的错误,比如引用不存在或者标签没有关闭。如果遇到这些错误,尝试在 _config.yml 中设置 excerpt_separator: "",或者将其设置为一些无效的字符串。


生产环境问题

如果你在生产环境构建时遇到静态文件无法找到的问题,从 v3.2.0 版本开始,你应该将你的 环境设置为 production。这个问题是由于尝试复制一个不存在的符号链接导致的。

请报告你遇到的问题!

如果你遇到 bug,请在 GitHub 上 创建一个问题,描述问题和任何你找到的解决方法,以便我们能在这里为其他人记录它。