[英]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.