我有一个使用 Jekyll 和 Github Pages 的网站。 之前在另一台计算机上搞乱了版本和 RVM 后,在这台计算机上,我选择坚持使用一个版本的 Ruby 和使用捆绑器的每个项目环境。
我有一个非常简单的
Gemfile
:
[$]> cat Gemfile
source 'https://rubygems.org'
gem 'github-pages'
和捆绑器配置:
[$]> cat .bundle/config
---
BUNDLE_PATH: env
BUNDLE_DISABLE_SHARED_GEMS: '1'
当我通过
bundle exec
运行任何命令(jekyll、gem、irb)时,我收到依赖错误:
[$]> bundle exec jekyll
Could not find RedCloth-4.2.9 in any of the sources
Run `bundle install` to install missing gems.
但是,捆绑包已安装:
[$]> bundle install
Using RedCloth 4.2.9
Using i18n 0.6.11
Using json 1.8.1
[snip]
Using github-pages 29
Using bundler 1.7.7
Your bundle is complete!
It was installed into ./env
我对捆绑程序如何认为在使用一个子命令时安装了 gem,但在使用另一个子命令时认为它们丢失了感到有点困惑。
[$]> which ruby
/usr/local/bin/ruby
[$]> which bundler
/usr/local/bin/bundler
[$]> ruby --version
ruby 2.2.0p0 (2014-12-25 revision 49005) [x86_64-darwin14]
[$]> bundler --version
Bundler version 1.7.7
删除
env
目录并重新安装后,我注意到它为两个 Ruby 版本创建了子目录 - 2.1.0 和 2.2.0。 后者是我当前版本的 Ruby,但目录是空的(所有 gems 都安装到了 env/ruby/2.1.0/gems
目录中)。 这与奥利弗关于 rbenv 的回答相结合,让我思考不匹配的版本。
我用一个简单的
gem install bundler
重新安装了捆绑器,重新运行bundle install
,一切都很好。
总的来说,答案似乎是解决为与您实际使用的不同版本的 Ruby 安装的捆绑程序的问题。 对我来说,这似乎很奇怪,它会用一种东西来表示
bundle install
,用另一种东西来表示 bundle exec
,但*耸耸肩*无论如何。
安装
rbenv
作为我的 Ruby 管理器后,我遇到了完全相同的问题。 最后我解决了这个问题:
rbenv rehash
(此外,您可能需要重新启动终端,根据 @joel-glovier 的评论)
它抱怨 Redcloth 4.2.9 的事实实际上是转移注意力。 Bundler 可能找不到任何宝石,但 Redcloth 是它寻找的第一个宝石,因此它会立即退出并出现该错误。
基本上我安装了 rbenv 和 ruby 2.2.2,并使用
rbenv global 2.2.2
更改为该版本,但我忘记运行 rbenv rehash
。 所以我猜当运行 bundle install
时,它正在查看我以前使用的 ruby 版本(系统 ruby)以查看安装了哪些 gem,但是当运行 bundle exec jekyll serve
时,它正在查看我的新 ruby 版本,但没有找到任何宝石。
我必须打开
./.bundle/config
并设置
BUNDLE_DISABLE_SHARED_GEMS
至 true
用于捆绑宝石以便在本地正确存储。
我在 .bashrc 文件中定义了
BUNDLE_GEMFILE = /home/app/current/Gemfile
。在将新版本部署到服务器时,这破坏了捆绑执行程序。检查 env
是否在环境变量中定义了 BUNDLE_GEMFILE
。
我将
BUNDLE_GEMFILE
添加到 .bashrc 文件中以方便使用 monit 命令。现在我只是在 monit 命令的开头定义变量。
对我来说,无论出于何种原因,它都有助于删除
Gemfile.lock
文件。但这肯定不是所有情况下的解决方案,但值得一试。