使用 Bundler 管理 Jekyll

06 March 2018 mkasberg mkasberg

Bundler 可以为 Ruby 项目提供一个稳定的环境,它会根据需要安装 Jekyll 项目所需的对应版本的 gem。

使用 Bundler 管理 Jekyll 可以让你事半功倍,避免触发系统权限问题,如果有多个 Jekyll 项目时又能保持每个项目的独立性,避免相互影响。

Bundler 可以选择在项目文件夹中安装依赖项,这样可以避免遇到权限问题。Jekyll 一般会默认安装到系统的 gem 目录,然后运行 jekyll new 命令来创建项目。

跟着本文操作,你将学会如何使用 Bundler 创建一个新的 Jekyll 项目,并且将所有的 gems 安装在项目目录内,而不是系统目录。这样既能确保每个项目的独立性,又能避免权限问题。

这并不新手简单的使用 Jekyll 的方式

本教程帮助你使用 Bundler 设置 Jekyll,并可选择不进行任何系统范围的 gem 安装。如果你希望将 jekyll 命令安装到默认的 gem 安装目录中,你可以阅读 快速入门教程。

准备工作

你需要先安装好 RubyBundler。你可以在它们的官方网站上找到对应的安装说明。

初始化 Bundler

首先为你的项目创建一个新的目录,并运行 bundle init 命令。完成新 Bundler 项目的创建(目录中会创建一个空的 Gemfile 文件)。

mkdir my-jekyll-website
cd my-jekyll-website
bundle init

my-jekyll-website 是 Jekyll 项目文件夹名称,你可以自定义,但不要使用中文。

配置 Bundler 的安装路径(可选)

可选操作,可跳过。配置 Bundler 安装 gems 的目录在项目的 ./vendor/bundle/ 子目录中。这样做的好处是,Bundler 将会在你的项目文件夹内安装 gems,而不是使用 gem install 时的默认位置。这样可以帮助你避免在安装 gems 时遇到权限错误,具体取决于你如何安装 Ruby。

bundle config set --local path 'vendor/bundle'
Bundler 安装位置只需配置一次

这一步每个项目只需要执行一次。Bundler 会将你的配置保存在 ./.bundle/config 中,以后安装 gems 都会存放在同一位置。

添加 Jekyll

现在,我们在我们项目中使用 Bundler 安装 Jekyll gem,以下命令将会在我们的 Gemfile 中添加 Jekyll gem,并将其安装到 ./vendor/bundle/ 文件夹中(或者如果你没有设置自定义路径,则安装到你的默认 gem 安装目录)。

bundle add jekyll

创建一个 Jekyll 框架

Jekyll 已经安装好了以后,我们使用它作为我们的站点框架。因为我们的文件夹不是空的,它已经包含一些 Bundler 文件,所以我们需要使用 --force 参数。如果直接运行 bundle install 命令,会因为 Gemfile 已经存在,会报错。

bundle exec jekyll new --force --skip-bundle .
bundle install

运行 Jekyll 网站服务

你的 Jekyll 网站已经准备好了!使用 bundle exec jekyll serve 命令运行网站服务,通过浏览器打开 http://127.0.0.1:4000 访问你的 Jekyll 站点。然后你可以根据需要继续开发完善你的 Jekyll 站点。所有的 Jekyll 命令都可以正常使用,但你需要在命令前加上 bundle exec,便于 Bundler 运行安装在项目文件夹中的 Jekyll 。

提交到 Git 仓库(源代码控制)

如果你要把 Jekyll 网站文件存储到在线的 Git 仓库,你需要忽略 ./vendor/./.bundle/ 文件夹,因为它们包含了与用户或系统平台相关的信息。

在其他的设备拉取或者构建 git 仓库中的 jekyll 网站时,会根据 GemfileGemfile.lock 正确的安装依赖项 gem,所以这两个文件不需要提交到 Git 仓库。可以参照以下 .gitignore 文件配置:

.gitignore

# Ignore metadata generated by Jekyll
_site/
.sass-cache/
.jekyll-cache/
.jekyll-metadata

# Ignore folders generated by Bundler
.bundle/
vendor/