繁体   English   中英

Rails 3 — Bundler / Capistrano错误

[英]Rails 3 — Bundler/Capistrano Errors

我在开发箱上本地有一个基本的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

更新:

对于RVM> = 1.11.3,现在应该只使用rvm-capistrano gem 对于较旧的RVM> = 1.0.1,以下答案仍然适用。


原始答案:

好的,尽管我没有完全cap deploy才能工作,但是我确实解决了这个问题。 问题是Capistrano试图为Bundler(和其他gems)使用与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并开始适当地装载宝石。

未找到Bundler,因为未加载.bash_profile,因此您的PATH错误。 这可能是因为您在.bash_profile中具有RVM脚本。

简单的答案是将RVM脚本从.bash_profile移到.bashrc,Capistrano应该能够找到它(还要验证.bash_profile的来源.bashrc)。

Capistrano使用SSH通过非交互式shell在服务器上执行命令。 该Shell会话将源.bashrc而不是.bash_profile 我向两者都添加了ECHO语句,并通过SSH运行了LS。 您可以在下面的结果中看到仅.bashrc源:

$ ssh user@123.amazonaws.com ls
.bashrc loaded
git
file1
file2

我在使用rbenv时遇到了相同的问题。 解决的办法是从我的.bashrc文件的底部开始选择rbenv特定行,并将其放在顶部。 如果外壳不在交互模式下运行,我的.bashrc文件的第一行将返回中止状态。

最后一行实际上应该是

set :rvm_type, :user

也就是说,用户必须是符号而不是变量,否则您将获得

undefined local variable or method `user'

没有rvm/capistrano为我工作。 我发现最好的解决方案是deploy.rb添加到deploy.rb文件中(适用于非系统范围的RVM):

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

据我了解,未找到bundle命令,因为Capistrano未加载用户〜/ .bash_profile中定义的PATH变量。

为了解决这个问题,我创建了一个任务: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的安装失败,因为即使找到了包,也找不到它们。

但是,这似乎是一种凌乱的方法。 大概还有一个“全局”的地方来定义我不知道的二进制文件的路径。

更新23/12

要为所有用户向$ PATH添加目录: https : //serverfault.com/questions/102932/adding-a-directory-to-path-in-centos

但是,由于它是非交互式非登录外壳,因此仍然不会加载。

一个建议是将路径添加到/ etc / bashrc: 如何设置$ PATH以便`ssh user @ host command`起作用?

但是,这对我也不起作用。 我相信这是因为SSH也不会加载/ etc / bashrc。

另一个建议是编辑〜/ .ssh / environment: http : //www.ruby-forum.com/topic/79248 但是,这似乎与在deploy.rb中指定路径几乎一样混乱。

这个为我工作:

设置:bundle_cmd,'源$ HOME / .bash_profile &&包'

我尝试了一些建议。 在RVM环境的deploy.rb文件中设置路径时遇到问题。 我的最终解决方案是包括以下内容:

在config / deploy.rb文件中添加:

require "bundler/capistrano"

同样在config / deploy.rb中,或者在我的情况下是config / production.rb,就像我在Capistrano中使用多级选项一样

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并清理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM