故障排除

如果你在安装或使用 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.app 可能会干扰上面下载的命令行工具。如果你遇到此问题,请升级 Xcode 并安装升级后的命令行工具。

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

在大多数 Linux、macOS 和 Windows 上的 Ubuntu Bash 上,可以通过将以下行添加到 .bashrc 文件的末尾,以非超级用户身份运行 Jekyll,而无需将 gem 安装到系统范围的位置

# Ruby exports

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

这告诉 gem 将其 gem 放置在用户的 home 文件夹中,而不是系统范围的位置,并将本地 jekyll 命令添加到用户的 PATH 中,位于任何系统范围路径之前。

这对于许多共享虚拟主机服务也很有用,在这些服务中,用户帐户只有有限的权限。在运行 gem install jekyll bundler 之前,将这些导出项添加到 .bashrc 中,可以完全以非 sudo 的方式安装 Jekyll。

要激活新导出项,请关闭并重新启动 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

随着 v10.11 中系统完整性保护的引入,以前可写的几个目录现在被视为系统位置,不再可用。鉴于这些更改,有几种简单的方法可以启动并运行。一种选择是更改 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 版本管理器(RVMrbenvchruby)来安装 Jekyll 会很有帮助。

如果您选择使用上述方法之一来安装 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。请查看 问题 #2327 以获取更多信息。

运行 Jekyll 时的问题

macOS

Jekyll 与采用 ARM64 架构的 macOS 兼容。但是,bundle exec jekyll serve 可能会 在较旧版本的 ffi 中失败

您可能需要运行 bundle update 或手动将 ffi 更新到至少 1.14.2

Debian 或 Ubuntu

在 Debian 或 Ubuntu 上,您可能需要将 /var/lib/gems/1.8/bin/ 添加到您的路径中,以便在终端中使用 jekyll 可执行文件。

基本 URL 问题

如果您正在使用 base-url 选项,如下所示

jekyll serve --baseurl '/blog'

… 那么请确保您访问以下网站

https://127.0.0.1:4000/blog/index.html

仅访问以下网址不起作用

https://127.0.0.1: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 # any user-specific listing goes at the end

从 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。此问题是由尝试复制不存在的符号链接引起的。

请报告您遇到的问题!

如果您遇到错误,请在 GitHub 上 创建问题,描述问题以及您找到的任何解决方法,以便我们在此处为其他人记录它。