Capistrano 3 rbenv 问题:没有要加载的文件 -- ruby​​gems (LoadError)

Capistrano 3 rbenv issue: no such file to load -- rubygems (LoadError)

我在使用 Capistrano 3 和 capistrano-rbenv 时遇到 运行 ruby gem 命令的问题(我假设它找不到 ruby 解释器),特别是 delayed_job。我已经发布了与该问题相关的必要文件:

`require': no such file to load -- rubygems (LoadError)

如有任何帮助,我们将不胜感激。

宝石文件

gem 'capistrano', "~> 3.6"
gem 'capistrano-rbenv', '~> 2.0'

Capfile

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

# Include default deployment tasks
require "capistrano/deploy"
require "capistrano/rbenv"

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

deploy.rb

# config valid only for current version of Capistrano
lock '3.6.1'

set :application, 'youtube_rank_tracker'
set :repo_url, './.git'

# Default branch is :master
# ask :branch, `git rev-parse --abbrev-ref HEAD`.chomp

# Default deploy_to directory is /var/www/my_app_name
set :deploy_to, '/dogecoin'

# Default value for :scm is :git
set :scm, :git

# Default value for :format is :airbrussh.
set :format, :airbrussh

# You can configure the Airbrussh format using :format_options.
# These are the defaults.
set :format_options, command_output: true, log_file: 'log/capistrano.log', color: :auto, truncate: :auto

# Default value for :pty is false
set :pty, true

# Default value for :linked_files is []
# append :linked_files, 'config/database.yml', 'config/secrets.yml'

# Default value for linked_dirs is []
# append :linked_dirs, 'log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'public/system'

# Default value for default_env is {}
# set :default_env, { path:  '$HOME/.rbenv/shims:$HOME/.rbenv/bin:$PATH' }

# Default value for keep_releases is 5
set :keep_releases, 5

# set :default_env, { path: "$HOME/.rbenv/bin:$PATH" }
set :rbenv_type, :user # or :system, depends on your rbenv setup
set :rbenv_ruby, '2.1.2'
set :rbenv_prefix, "RBENV_ROOT=#{fetch(:rbenv_path)} RBENV_VERSION=#{fetch(:rbenv_ruby)} #{fetch(:rbenv_path)}/bin/rbenv exec"
set :rbenv_map_bins, %w{rake gem bundle ruby rails}
set :rbenv_roles, :all # default value

namespace :deploy do
    desc 'Restart application'
  task :restart do
    on roles(:all) do |host|
        execute :mkdir, "-p #{release_path}/tmp"
      execute :touch, release_path.join('tmp/restart.txt')
      execute "cd #{release_path} && RAILS_ENV=production bin/delayed_job restart;"
      # execute "cd #{release_path} && bundle exec rake -T"
    end
    end
end

after 'deploy:publishing', 'deploy:restart'

错误

he deploy has failed with an error: Exception while executing as root@.....: cd /.... && RAILS_ENV=production bin/delayed_job restart; exit status: 1
cd /.... && RAILS_ENV=production bin/delayed_job restart; stdout: /usr/lib/ruby/vendor_ruby/bundler/shared_helpers.rb:2:in `require': no such file to load -- rubygems (LoadError)
    from /usr/lib/ruby/vendor_ruby/bundler/shared_helpers.rb:2
    from /usr/lib/ruby/vendor_ruby/bundler/setup.rb:1:in `require'
    from /usr/lib/ruby/vendor_ruby/bundler/setup.rb:1

简答

与其自己写,不如使用半官方的 Capistrano 3 Delayed Job 集成 Gem:https://github.com/AgileConsultingLLC/capistrano3-delayed-job

长答案

如果你真的自己写这个,capistrano-rbenv 只会影响一小部分默认命令列表,如下所示:https://github.com/capistrano/rbenv/blob/master/lib/capistrano/tasks/rbenv.rake#L47

在这种情况下,您可能需要如下内容:

namespace :deploy do
  desc 'Restart application'
  task :restart do
    on roles(:all) do |host|
      within release_path do
        execute :ruby, "bin/delayed_job", 'restart'
      end
    end
  end
end

不要创建 tmp/ 目录,而是将其添加到配置中的 :linked_dirs

此外,您似乎正在触摸 tmp/restart.txt 以重新启动 Passenger。或者,使用 capistrano-passenger gem 来做到这一点。它可以 运行 在使用乘客命令重新启动您的应用程序的较新模式中,或者您可以告诉它使用触摸文件机制。

最后,不要使用 cd ${release_path},而是使用 within DSL 方法。这将完成同样的事情并且不会破坏命令映射。