【问题标题】:Rails 4.2 ActiveJob: Every adapter results in PhusionPassenger error: Could not find [gem] in any of the sources (Bundler::GemNotFound)Rails 4.2 ActiveJob:每个适配器都会导致 PhusionPassenger 错误:在任何源中都找不到 [gem] (Bundler::GemNotFound)
【发布时间】:2015-01-29 14:20:24
【问题描述】:

我正在尝试使用 Rails 4.2 的 ActiveJob API 实现异步电子邮件处理。到目前为止,我已经尝试使用两个受支持的适配器:Sucker Punch 和 Delayed Job,但我都遇到了同样的问题。

在开发过程中似乎一切正常。但是,在部署到登台服务器并尝试在我的浏览器中加载网站后,我收到紫色 PhusionPassenger 错误屏幕并显示此错误:

Could not find delayed_job-4.0.6 in any of the sources (Bundler::GemNotFound)

以上是我尝试延迟作业时的情况。我的 gem 设置如下所示:

# Gemfile
gem 'delayed_job_active_record'

# Gemfile.lock
    delayed_job (4.0.6)
      activesupport (>= 3.0, < 5.0)
    delayed_job_active_record (4.0.3)
      activerecord (>= 3.0, < 5.0)
      delayed_job (>= 3.0, < 4.1)

当我尝试 Sucker Punch 时,PhusionPassenger 错误是相同的,只是在任何来源中都找不到的 gem 是 hitimes,它是 celluloid 的依赖项,它本身是 @987654325 的依赖项@。

我最初认为问题出在 Sucker Punch 上。在我的登台服务器上安装 Hitimes gem 并仍然收到错误后,我决定切换到延迟作业,现在我遇到了几乎相同的问题,所以我猜测还有一些更底层的问题,但我是不知道它可能是什么。我也尝试在登台服务器上更新捆绑器,但没有骰子。

提前感谢您的帮助!

编辑

我在延迟作业 github 上进行了更多探索,发现了这个命令 RAILS_ENV=production bin/delayed_job restart。当我尝试在我的登台服务器上运行RAILS_ENV=staging bin/delayed_job restart 时,我被警告我的bin/ 目录中没有delayed_job binstub。回顾我的本地开发环境,我确实看到bin/delayed_job 存在并且可以成功运行bin/delayed_job restart。暂存中缺少 binstub 是否会导致问题?如果是这样,为什么该 binstub 没有正确创建?我很确定我的 capistrano 部署过程使用bundle exec bundle install --binstubs。

编辑 2

通过下面概述的一些步骤,我能够让延迟作业出现在我的 bin/staging 中。我还尝试根据延迟作业 GitHub 上的建议添加“守护进程”gem,但仍然遇到相同的错误,现在是关于“守护进程”而不是“延迟作业”本身。

【问题讨论】:

  • 您确定乘客使用的是正确的红宝石吗?
  • 我不确定。不幸的是,我(目前)也没有系统管理员知识来检查哪个 ruby​​ 乘客正在使用或更改它。但是,我可以说没有 activejob 适配器的基本 rails4 分支在登台服务器上部署并运行良好。另外,我将添加一些我收集到的与 binstub 相关的更多信息,这些信息可能有用也可能没有帮助
  • 不,但我确实使用 rbenv
  • 你有多个 ruby​​ 版本吗?您的应用在与默认版本不同的其他版本中运行。?
  • rbenv 安装的唯一 ruby​​ 是 2.2.0。所以有那个和“系统”

标签: ruby-on-rails ruby ruby-on-rails-4 passenger rails-activejob


【解决方案1】:

很可能是您的 binstub 缺失,可以修复:

capistrano-bundler 有一个“问题”,它会尝试生成自己的 bin 存根,而不是从提交的 git repo 中获取它们。此后此问题已得到修复,但可以在此问题中看到: https://github.com/capistrano/bundler/issues/45

您可以通过从链接目录中删除 bin 来强制使用已提交的 binstub:

set :linked_dirs, fetch(:linked_dirs, []).push('bin', 'log', 'tmp/pids', 'tmp/cache' ...

变成:

set :linked_dirs, fetch(:linked_dirs, []).push('log', 'tmp/pids', 'tmp/cache' ...

还有设置

set :bundle_binstubs, nil

或者升级你的 cap-bundler gem。

【讨论】:

  • 我想我在关注你,但还没有完全到那里。我将 capistrano-bundler 升级到 1.1.4,重新部署,仍然没有 bin/delayed_job。然后我跑了bundler binstubs delayed_job 并得到了"There are no executables for the gem delayed_job." 我还需要做你上面列出的所有事情吗?
  • 另外,我在这里发现了同样的问题:stackoverflow.com/questions/22659507/…。一个人添加了“守护进程”gem,另一个人做了你上面列出的或更少的事情。但是,如果上述方法有效,并且也已添加到您链接的 PR 中,则不确定为什么升级后我仍然有问题
  • 我尝试添加守护进程,但现在我的 PhusionPasseneger 错误提示“无法在任何来源 (Bundler::GemNotFound) 中找到 daemons-1.1.9”
【解决方案2】:

事实证明,问题不在于 ActiveJob 适配器,而在于我在升级 Rails 4 后尝试在暂存中安装和使用的 any gem。我已经在登台服务器上安装了 rbenv 并添加了 2.2.0 作为全局 ruby​​,但Passenger 仍在寻找与系统 ruby​​ (1.9.3) 相关联的 gem。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-08
    • 1970-01-01
    • 1970-01-01
    • 2014-06-18
    • 2018-04-08
    • 2012-04-19
    • 2015-03-04
    • 2014-07-11
    相关资源
    最近更新 更多