为什么 bundler 使用 Capistrano 部署时找不到 rake?

为什么 bundler 使用 Capistrano 部署时找不到 rake?

我有一个在 Ubuntu 18.04 上运行的 Rails 项目,我刚刚将系统升级到 Ubuntu 20.04。

cap production deploy在步骤中失败deploy:assets:precompile

00:07 deploy:assets:precompile
      01 /home/deploy/.rbenv/bin/rbenv exec bundle exec rake assets:precompile
      01 bundler: failed to load command: rake (/var/www/framelinker/shared/bundle/ruby/2.6.0/bin/rake)
      01 Gem::Exception: can't find executable rake for gem rake. rake is not currently included in the bundle, perhaps you meant to add it to your Gemfile?

我尝试将 rake 添加到我的 gemfile 中,尽管我觉得这不是答案,因为 a) 它没有任何区别,并且 b) 当一切在 Ubuntu 18.04 上运行时,rake 不在我的 gemfile 中。

谷歌搜索告诉我运行gem update --system,但我不想手动弄乱服务器。

我在服务器上使用 rbenv。我的 gemfile 锁定在 ruby​​ 2.6.1。

这是怎么回事?rake 不是内置在 ruby​​ 中的吗?为什么我必须将其添加到 gemfile 中?

--------------- 编辑 --------------
我想知道 Capistrano 是否应该使用类似这样的东西,而不是上面所做的:

/home/deploy/.rbenv/bin/rbenv/shims/rake assets:precompile

我的 Capfile 内容:

# Load DSL and set up stages
require "capistrano/setup"

# Include default deployment tasks
require "capistrano/deploy"

require 'capistrano/sidekiq'
install_plugin Capistrano::Sidekiq # Default sidekiq tasks
# Then select your service manager
install_plugin Capistrano::Sidekiq::Systemd

# Load the SCM plugin appropriate to your project:
#
# require "capistrano/scm/hg"
# install_plugin Capistrano::SCM::Hg
# or
# require "capistrano/scm/svn"
# install_plugin Capistrano::SCM::Svn
# or
require "capistrano/scm/git"
install_plugin Capistrano::SCM::Git

# Include tasks from other gems included in your Gemfile
#
# For documentation on these, see for example:
#
#   https://github.com/capistrano/rvm
#   https://github.com/capistrano/rbenv
#   https://github.com/capistrano/chruby
#   https://github.com/capistrano/bundler
#   https://github.com/capistrano/rails
#   https://github.com/capistrano/passenger
#
# require "capistrano/rvm"
 require "capistrano/rbenv"
# require "capistrano/chruby"
 require "capistrano/bundler"
 require "capistrano/rails/assets"
 require 'capistrano/rails/collection'
 require "capistrano/rails/migrations"
 require "capistrano/passenger"

# Load custom tasks from `lib/capistrano/tasks` if you have any defined
Dir.glob("lib/capistrano/tasks/*.rake").each { |r| import r }

答案1

登录服务器并手动执行以下操作可解决此问题:

/home/deploy/.rbenv/bin/rbenv exec gem update --system

从可重复性/CI 的角度来看这并不令人满意,但至少它给了我一些继续下去的方法,并且我的服务器可以再次运行。

答案2

我也遇到了类似的问题,更新后也是如此。

事实证明,我在 capistrano 配置中没有为 rbenv 设置的 ruby​​ 版本与服务器上安装的版本完全匹配。

再次检查你的 capistrano 安装文件,特别是检查 ruby​​ 版本,你的服务器上有哪些 ruby​​ 版本,哪些 ruby​​ 版本可以为 rbenv 设置,等等。

虽然错误消息建议在 Gemfile 中包含 rake,但是一旦解决了其他问题,就不需要这样做了。

我确实需要运行gem update --system,尽管我必须确保我以设置 rbenv 的用户身份登录。因为 gem 的 rbenv shim 已经到位,所以我不需要运行 rbenv exec。

相关内容