You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

已安装Bundler 2.0.2仍提示需Bundler 2+的Jekyll/Gulp问题求助

解决Jekyll/Gulp环境中Bundler版本不匹配的问题

我之前遇到过几乎一模一样的场景,问题核心大概率是Gulp直接调用jekyll时没有进入项目的Bundler环境上下文,导致系统偷偷调用了全局的旧版本Bundler——哪怕你本地已经装对了版本。下面是一步步的排查和解决办法:

1. 强制通过Bundler执行Jekyll(最可能快速解决)

你的Gulp任务里直接调用了jekyll build,这会绕过项目的Bundler环境,改用系统全局的Jekyll和Bundler。修改gulpfile.js里的jekyll-build任务,用bundle exec来包裹执行:

gulp.task("jekyll-build", function () {
  return cp.spawn('bundle', ['exec', 'jekyll', 'build'], {stdio: "inherit"})
});

这样做会强制使用项目Gemfile.lock指定的Bundler版本来运行Jekyll,确保版本完全匹配。

2. 清理多余的Bundler版本残留

有时候系统里会同时存在多个Bundler版本,导致调用逻辑混乱:

  • 先查看已安装的所有Bundler版本:
    gem list bundler
    
  • 如果有低于2.0的版本,全部卸载:
    gem uninstall bundler -v '<2.0'
    
  • 再重新安装指定的2.0.2版本:
    gem install bundler -v '2.0.2'
    

3. 重新生成Gemfile.lock

删除现有的Gemfile.lock,然后重新运行安装命令,确保锁定文件和当前Bundler版本完全绑定:

rm Gemfile.lock
bundle install

4. 检查Ruby环境路径优先级

确认你当前shell使用的Ruby和Bundler是项目对应的版本,而不是全局安装的旧版本:

  • 查看Bundler路径:
    which bundler
    
  • 查看Jekyll路径:
    which jekyll
    

如果输出的路径是/usr/local/bin/开头(全局安装路径),而不是你用的版本管理工具(比如rbenv、rvm)的shims路径,那说明你的shell环境没有正确加载版本管理工具,需要检查.bashrc/.zshrc里的配置,确保版本管理工具的PATH优先级更高。

5. 显式传递环境变量给Gulp的spawn

如果上面的方法都不行,可能是Gulp的spawn方法没有继承当前shell的环境变量。修改任务时显式传递PATH:

gulp.task("jekyll-build", function () {
  return cp.spawn('bundle', ['exec', 'jekyll', 'build'], {
    stdio: "inherit",
    env: Object.assign({}, process.env, { PATH: process.env.PATH })
  })
});

优先试试第一种方法,这是这类场景下最常见的原因——直接调用Jekyll没有通过Bundler上下文,导致版本校验失败。

内容的提问来源于stack exchange,提问作者Mike Jandreau

火山引擎 最新活动