无法让bundle exec在生产中工作

时间:2011-11-23 05:16:03

标签: ruby-on-rails rubygems bundler

我已经在生产中安装了我的宝石:

cd /app/releases/current && bundle install --gemfile /app/releases/current/Gemfile --path /app/shared/bundle --deployment --quiet --without development test

我无法bundle exec我的任何宝石(rakegem除外):

$ bundle exec whenever
bundler: command not found: whenever
Install missing gem executables with `bundle install`

宝石已正确安装在/ app / shared / bundle中:

$ cd /app/shared
$ find . -name whenever
./bundle/ruby/1.9.1/gems/whenever-0.6.8/bin/whenever
./bundle/ruby/1.9.1/gems/whenever-0.6.8/lib/whenever

我的(生成的)捆绑配置(在/app/current/.bundle/config中)是:

---
BUNDLE_FROZEN: "1"
BUNDLE_PATH: /app/shared/bundle
BUNDLE_DISABLE_SHARED_GEMS: "1"
BUNDLE_WITHOUT: development:test

我正在运行ruby 1.9.2p290,手动安装到/ usr / local / bin。

我必须使用bundle install选项--binstubs我的宝石吗?为什么bundle exec不会搜索存储的BUNDLE_PATH

7 个答案:

答案 0 :(得分:8)

使用Capistrano和Rails并使用deploy.rb作为部署者文件。

我意识到改变require "whenever/capistrano"出现的顺序真的很重要。我把它放在最后几行:

在deploy.rb中:

#first lines:
set :rvm_ruby_string, "1.9.3"
set :rvm_type, :user
set :whenever_command, "bundle exec whenever"

# others...

# last lines
require 'rvm/capistrano'
require 'bundler/capistrano'
require "whenever/capistrano"

after "deploy:update_code", "customs:config"
after "deploy:create_symlink","deploy:create_symlink"
after "deploy", "deploy:cleanup"

load 'deploy/assets'
# end

答案 1 :(得分:4)

我遇到了这个问题并按正确顺序排列,即

require 'rvm/capistrano'
require 'bundler/capistrano'
require 'whenever/capistrano'

它仍然希望在bundle:install之前运行crontab更新。解决方案是使用

更新我的本地捆绑包
gem update bundler

之后它再次开始工作。不确定在破坏所有这些的版本之间究竟发生了什么变化。

答案 2 :(得分:1)

检查您的bundle:install的设置位置,并尝试将其移至deploy.rb文件中的'whatever / capistrano'上方。

当我进行捆绑更新时,似乎触发了这一点,这增加了我的Gemfile.lock中的gem版本。

在我的部署文件运行bundle:install

之前,每当试图运行它的chrontab更新时,似乎都是这样

来自https://github.com/javan/whenever/blob/master/lib/whenever/capistrano.rb

before "deploy:finalize_update", "whenever:update_crontab"

我的deploy.rb已经

after 'deploy:finalize_update', 'bundle:install'

像这个帖子中的其他人一样,我尝试了一些东西,我不确定这是什么修复了它,但是在部署之前将bundle install更改为:finalize_update,并且还将其设置为“之前”要求'每当/ capistrano'似乎是我的情景中的可能修复。

答案 3 :(得分:0)

我认为只要宝石不在Gemfile中,或者在Gemfile

的测试或开发部分中

答案 4 :(得分:0)

我将--path/app/shared/bundle更改为vendor/bundle,这使其有效。

这对我来说似乎不对,所以我删除了/app/shared/bundlevendor/bundle,然后又将bundle install再次发送到/app/shared/bundle

这个干净的bundle install解决了这个问题。我不明白为什么!

如果有人对此有解释,我很乐意将您标记为已接受的答案。但这解决了我的问题。

答案 5 :(得分:0)

可能不同的问题会导致相同的错误消息。对我来说,我必须更新capistrano gem后更新每当gem获得角色支持。捆绑exec,无论何时在我升级之前都工作过。

答案 6 :(得分:0)

使用brightbox deployment gem,它为我处理捆绑器等(通过魔法,在其他一些食谱中)我发现这有效:

替换

require "whenever/capistrano"

内容https://github.com/javan/whenever/blob/master/lib/whenever/capistrano/v2/hooks.rb 然后修改它以在bundler之后加载:install finish(你可能有也可能没有那个任务,我不知道它是否是标准的)

# require "whenever/capistrano"
# hacked whenever/lib/whenever/capistrano/v2/hooks.rb below to work with brightbox bundler installation

require "whenever/capistrano/v2/recipes"

# Write the new cron jobs near the end.
after "bundler:install", "whenever:update_crontab"
# If anything goes wrong, undo.
after "deploy:rollback", "whenever:update_crontab"