在Rails中使用Capistrano进行部署时无法运行/etc/profile.d/chruby.sh

alc*_*t95 6 ruby bash shell ruby-on-rails chruby

我一直在尝试在EC2实例上部署我的rails应用程序。我已经采取的步骤是

本地:

  1. 我通过Gemfile和编写了所有的gem bundle install

    group :development do
      gem 'capistrano'
      gem 'capistrano3-puma'
      gem 'capistrano-rails', require: false
      gem 'capistrano-bundler', require: false
      gem 'capistrano-chruby'
    end
    
    Run Code Online (Sandbox Code Playgroud)
  2. 我编辑了我Capfile的要求模块

    require "capistrano/setup"
    require "capistrano/deploy"
    require "capistrano/scm/git"
    install_plugin Capistrano::SCM::Git
    require "capistrano/chruby"
    require "capistrano/bundler"
    require "capistrano/rails/assets"
    require "capistrano/rails/migrations"
    require "capistrano/puma"
    Dir.glob("lib/capistrano/tasks/*.rake").each { |r| import r }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 我也进行了必要的更改config/deploy.rb,特别是

    set :chruby_ruby, 'ruby-2.3.0'
    
    Run Code Online (Sandbox Code Playgroud)

在服务器/实例上:

  1. 已安装的Ruby
  2. 已安装Chruby,并包括在/etc/profile.d/chruby.sh其中:

    group :development do
      gem 'capistrano'
      gem 'capistrano3-puma'
      gem 'capistrano-rails', require: false
      gem 'capistrano-bundler', require: false
      gem 'capistrano-chruby'
    end
    
    Run Code Online (Sandbox Code Playgroud)
  3. 为app制作了一个文件夹,还创建了database.ymlapplication.yml

完成所有这些操作后,当我运行时cap production deploy,它开始可以进行检查和git克隆以及链接文件和目录,但操作失败bundler:install,出现类似错误

require "capistrano/setup"
require "capistrano/deploy"
require "capistrano/scm/git"
install_plugin Capistrano::SCM::Git
require "capistrano/chruby"
require "capistrano/bundler"
require "capistrano/rails/assets"
require "capistrano/rails/migrations"
require "capistrano/puma"
Dir.glob("lib/capistrano/tasks/*.rake").each { |r| import r }
Run Code Online (Sandbox Code Playgroud)

由于只有使用RVM或JRuby将Rails部署到AWS的示例,因此我无法弄清楚哪里出了问题。

das*_*h-o 4

从表面上看,问题出在“/bin/sh”上,它不支持“source”。

使用“bash”时,源是“.”的别名 命令。目前尚不清楚系统上默认的“/bin/sh”是什么。如果是 /bin/dash (Mint 19) - 你必须将每个 sourec 替换为 .'

. xx/xx/xx/chruby.sh
. xx/xx/xx/auto.sh
Run Code Online (Sandbox Code Playgroud)

您可能必须对可能使用“源”的引用文件(/etc/profile.d/*.sh)进行类似的修复。

更新 1 假设 '/bin/ls' 是破折号(用readlink -f /bin/sh,它将显示 /bin/dash 或其他 *sh 程序)。alias如果使用“dash”,可以在检查是否在 dash 下运行后在 /etc/profile 中进行设置。理论上,将允许使用“源”的脚本无需更改即可工作。

case "$(readlink -f /proc/$$/exe)" in
    */dash) alias source=. ;;
esac
Run Code Online (Sandbox Code Playgroud)