53

開発ボックスでローカルに動作する基本的な Rails 3 アプリがありますが、すべてが機能することを確認するために、早い段階で展開をテストしたいと考えています。Capistrano を使用してデプロイしています。

私が実行するとcap deploy(他のすべての必要なセットアップの後)、このコマンドで次のエラーが発生して中断します。

[...]
* executing 'bundle:install'
* executing "bundle install --gemfile /var/www/trex/releases/20100917172521/Gemfile --path /var/www/trex/shared/bundle --deployment --quiet --without development test"

servers: ["www.[my domain].com"]
[www.[my domain].com] executing command
** [out :: www.[my domain].com] sh: bundle: command not found
command finished
[...]

bundleそのため、サーバー上でコマンドが見つからないようです。

しかし、サーバーにログインすると...

$ ruby -v
ruby 1.9.2p0 (2010-08-18 revision 29036) [x86_64-linux]
$ rails -v
Rails 3.0.0
$ bundle -v
Bundler version 1.0.0

...bundleコマンドは問題なく動作します。

何がうまくいかないのですか?

-

(さらに、完全を期すために:)

$ which ruby
~/.rvm/rubies/ruby-1.9.2-p0/bin/ruby
$ which rails
~/.rvm/gems/ruby-1.9.2-p0/bin/rails
$ which bundle
~/.rvm/gems/ruby-1.9.2-p0/bin/bundle
4

8 に答える 8

89

アップデート:

RVM >= 1.11.3 の場合、rvm-capistrano gem を使用する必要があります。古い RVM >= 1.0.1 の場合、以下の回答が引き続き適用されます。


元の答え:

さて、まだ完全には機能していませんが、この問題cap deployは解決しました。問題は、Capistrano が Bundler (およびその他の gem) に RVM パスとは異なるパスを使用しようとしたことです。

cap shellを実行して、Capistrano パスを確認しますecho $PATH/usr/local/binおそらく標準のとが表示されます/usr/binが、RVM が Bundler などを格納している場所ではありません。

Capistrano ファイルを編集し、次の手順に従ってconfig/deploy.rb次の行を追加します。

# Add RVM's lib directory to the load path.
$:.unshift(File.expand_path('./lib', ENV['rvm_path']))

# Load RVM's capistrano plugin.    
require "rvm/capistrano"

set :rvm_ruby_string, '1.9.2'
set :rvm_type, :user  # Don't use system-wide RVM

これにより、最終的に Capistrano は Bundler を確認し、適切に gem をロードし始めました。

于 2010-09-20T15:16:46.460 に答える
26

.bash_profile が読み込まれておらず、PATH が間違っているため、Bundler が見つかりません。これはおそらく、RVM スクリプトが .bash_profile にあるためです。

簡単な答えは、RVM スクリプトを .bash_profile から .bashrc に移動することです。Capistrano はそれを見つけることができるはずです (.bash_profile ソースが .bashrc であることも確認してください)。

Capistrano は SSH を使用して、非対話型シェル経由でサーバー上でコマンドを実行します。このシェル セッションは.bashrc を source しますが、 .bash_profile は source しません。両方に ECHO ステートメントを追加し、SSH 経由で LS を実行しました。以下の結果で、.bashrc のみがソースであることがわかります。

$ ssh user@123.amazonaws.com ls
.bashrc loaded
git
file1
file2
于 2011-08-12T11:20:09.590 に答える
11

rbenv を使用しても同じ問題が発生しました。解決策は、.bashrc ファイルの下部から rbenv 固有の行を取得し、それらを上部に配置することでした。シェルがインタラクティブ モードで実行されていない場合、.bashrc ファイルの最初の行は中止を返していました。

于 2012-02-15T23:31:33.497 に答える
7

その最後の行は実際には

set :rvm_type, :user

つまり、 user は変数ではなくシンボルでなければなりません。そうしないと、

undefined local variable or method `user'
于 2010-11-24T15:46:27.107 に答える
7

私にとってはうまくいきませんでしrvm/capistranoた。私が見つけた最良の解決策は、次の行をファイルに追加することでしたdeploy.rb(これはシステム全体のRVM用ではありません):

set :bundle_cmd, 'source $HOME/.bash_profile && bundle'

于 2011-11-27T03:45:14.637 に答える
2

ユーザーの ~/.bash_profile で定義された PATH 変数が Capistrano によってロードされないため、bundle コマンドが見つからないことは私の理解でした。

これを回避するために、タスク :bundle_gems を作成しました。

task :bundle_gems do
    run "cd #{deploy_to}/current && export PATH=/usr/local/pgsql/bin:/opt/ruby-enterprise-X.X.X/bin:$PATH && bundle install vendor/gems"
end

PostgreSQL バイナリへのパスも含めていることに注意してください。バンドルが見つかった場合でも、pg gem が見つからなかったため、pg gem のインストールは失敗していました。

ただし、これは厄介なアプローチのように思えます。おそらく、私が知らないバイナリへのパスを定義するための、より「グローバルな」場所があるでしょう。

23/12 更新

すべてのユーザーの $PATH にディレクトリを追加するには: https://serverfault.com/questions/102932/adding-a-directory-to-path-in-centos

ただし、これは非対話型の非ログイン シェルであるため、まだロードされません。

1 つの提案は、/etc/bashrc へのパスを追加することでした: `ssh user@host command` が機能するように $PATH を設定するにはどうすればよいですか?

しかし、これも私にはうまくいきませんでした。SSHが/etc/bashrcもロードしないためだと思います。

別の提案は、 ~/.ssh/environment: http://www.ruby-forum.com/topic/79248を編集することでした。しかし、これは deploy.rb でパスを指定するのと同じくらい面倒です。

于 2010-12-19T16:23:42.593 に答える
1

これは私のために働いた:

set :bundle_cmd, 'source $HOME/.bash_profile && bundle'

于 2014-02-14T13:53:00.220 に答える
0

私はいくつかの提案を試しました。RVM 環境の deploy.rb ファイルにパスを設定する際に問題がありました。私の最終的な解決策は、以下を含めることでした。

config/deploy.rb ファイルに以下を追加します。

require "bundler/capistrano"

また、config/deploy.rb、または私の場合はconfig/production.rbで、カピストラーノのマルチステージオプションを使用していたため

after "deploy", "rvm:trust_rvmrc"

この手順では、「.rvmrc ファイルを信頼しますか」というメッセージが表示されないようにするだけで、次のような deploy.rb ファイル内のタスクが呼び出されます。

namespace :rvm do
   task :trust_rvmrc do
      run "rvm rvmrc trust #{release_path}"
   end
end

これらのわずかな変更を加えた後cap production deploy、コードをチェックアウトして実行することができました。アセット パイプラインのデプロイを実行し、リリース フォルダーを現在のフォルダーにリンクし、実行bundle installしてクリーンアップしました。

于 2013-02-20T23:33:03.867 に答える