/ usr / bin / env ruby​​没有这样的文件或目录:使用capistrano 3,capistrano / rbenv,capistrano / bundler和capistrano / rails(使用rails 4)

我正在使用capistrano,capistrano / rbenv,capistrano / bundler和capistrano / rails。 我在capistrano编译资产的步骤中收到此错误:

DEBUG [49a50df6] /usr/bin/env: DEBUG [49a50df6] ruby DEBUG [49a50df6] : No such file or directory DEBUG [49a50df6] 

在生产服务器/usr/bin/env ruby -v是正确的。 我知道这一点: 为什么 – 做什么 – 在我的ssh-session中工作 – 但不是在capistrano但我无法让它工作。

这是我的Capfile

 # Load DSL and Setup Up Stages require 'capistrano/setup' # Includes default deployment tasks require 'capistrano/deploy' # Includes tasks from other gems included in your Gemfile # # For documentation on these, see for example: # # https://github.com/capistrano/rvm # https://github.com/capistrano/rbenv # https://github.com/capistrano/chruby # https://github.com/capistrano/bundler # https://github.com/capistrano/rails/tree/master/assets # https://github.com/capistrano/rails/tree/master/migrations # # require 'capistrano/rvm' require 'capistrano/rbenv' # require 'capistrano/chruby' require 'capistrano/bundler' require 'capistrano/rails/assets' require 'capistrano/rails/migrations' # Loads custom tasks from `lib/capistrano/tasks' if you have any defined. Dir.glob('lib/capistrano/tasks/*.cap').each { |r| import r } 

这是我的deploy.rb

 # rbenv set :rbenv_type, :user set :rbenv_ruby, '2.0.0-p247' # bundler set :bundle_gemfile, -> { release_path.join('Gemfile') } set :bundle_dir, -> { shared_path.join('bundle') } set :bundle_flags, '--deployment --quiet' set :bundle_without, %w{development test}.join(' ') set :bundle_binstubs, -> { shared_path.join('bin') } set :bundle_roles, :all # rails set :rails_env, 'production' set :application, 'MY APP' set :repo_url, 'MY_REPO.git' # ask :branch, proc { `git rev-parse --abbrev-ref HEAD`.chomp } # set :deploy_to, '/var/www/my_app' # set :scm, :git # set :format, :pretty # set :log_level, :debug # set :pty, true set :linked_files, %w{.env config/database.yml} # set :linked_dirs, %w{bin log tmp/pids tmp/cache tmp/sockets vendor/bundle public/system} # set :default_env, { path: "/opt/ruby/bin:$PATH" } set :keep_releases, 5 namespace :deploy do desc 'Restart application' task :restart do on roles(:app), in: :sequence, wait: 5 do # Your restart mechanism here, for example: # execute :touch, release_path.join('tmp/restart.txt') end end after :restart, :clear_cache do on roles(:web), in: :groups, limit: 3, wait: 10 do # Here we can do anything such as: # within release_path do # execute :rake, 'cache:clear' # end end end after :finishing, 'deploy:cleanup' end 

这是我的staging.rb

 set :stage, :staging # Simple Role Syntax # ================== # Supports bulk-adding hosts to roles, the primary # server in each group is considered to be the first # unless any hosts have the primary property set. #role :app, %w{deploy@example.com} #role :web, %w{deploy@example.com} #role :db, %w{deploy@example.com} # Extended Server Syntax # ====================== # This can be used to drop a more detailed server # definition into the server list. The second argument # something that quacks like a has can be used to set # extended properties on the server. #server 'example.com', user: 'deploy', roles: %w{web app}, my_property: :my_value server 'my_server', user: 'my_user', roles: %w{web app db} # you can set custom ssh options # it's possible to pass any option but you need to keep in mind that net/ssh understand limited list of options # you can see them in [net/ssh documentation](http://net-ssh.github.io/net-ssh/classes/Net/SSH.html#method-c-start) # set it globally # set :ssh_options, { # keys: %w(/home/rlisowski/.ssh/id_rsa), # forward_agent: false, # auth_methods: %w(password) # } # and/or per server # server 'example.com', # user: 'user_name', # roles: %w{web app}, # ssh_options: { # user: 'user_name', # overrides user setting above # keys: %w(/home/user_name/.ssh/id_rsa), # forward_agent: false, # auth_methods: %w(publickey password) # # password: 'please use keys' # } # setting per server overrides global ssh_options # fetch(:default_env).merge!(rails_env: :staging) set :deploy_to, '/home/my_user' 

这是完整的痕迹:

  INFO [c24b8f94] Running RBENV_ROOT=~/.rbenv RBENV_VERSION=2.0.0-p247 ~/.rbenv/bin/rbenv exec bundle exec rake assets:precompile on 162.243.16.201 DEBUG [c24b8f94] Command: cd /home/my_app/releases/20131101193513 && ( RAILS_ENV=production RBENV_ROOT=~/.rbenv RBENV_VERSION=2.0.0-p247 ~/.rbenv/bin/rbenv exec bundle exec rake assets:precompile ) DEBUG [c24b8f94] /usr/bin/env: DEBUG [c24b8f94] ruby DEBUG [c24b8f94] : No such file or directory DEBUG [c24b8f94] cap aborted! rake stdout: Nothing written rake stderr: Nothing written /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/sshkit-1.1.0/lib/sshkit/command.rb:94:in `exit_status=' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/sshkit-1.1.0/lib/sshkit/backends/netssh.rb:125:in `block (4 levels) in _execute' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/net-ssh-2.7.0/lib/net/ssh/connection/channel.rb:551:in `call' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/net-ssh-2.7.0/lib/net/ssh/connection/channel.rb:551:in `do_request' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/net-ssh-2.7.0/lib/net/ssh/connection/session.rb:561:in `channel_request' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/net-ssh-2.7.0/lib/net/ssh/connection/session.rb:465:in `dispatch_incoming_packets' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/net-ssh-2.7.0/lib/net/ssh/connection/session.rb:221:in `preprocess' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/net-ssh-2.7.0/lib/net/ssh/connection/session.rb:205:in `process' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/net-ssh-2.7.0/lib/net/ssh/connection/session.rb:169:in `block in loop' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/net-ssh-2.7.0/lib/net/ssh/connection/session.rb:169:in `loop' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/net-ssh-2.7.0/lib/net/ssh/connection/session.rb:169:in `loop' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/net-ssh-2.7.0/lib/net/ssh/connection/channel.rb:269:in `wait' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/sshkit-1.1.0/lib/sshkit/backends/netssh.rb:147:in `block (2 levels) in _execute' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/net-ssh-2.7.0/lib/net/ssh/connection/channel.rb:514:in `call' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/net-ssh-2.7.0/lib/net/ssh/connection/channel.rb:514:in `do_open_confirmation' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/net-ssh-2.7.0/lib/net/ssh/connection/session.rb:545:in `channel_open_confirmation' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/net-ssh-2.7.0/lib/net/ssh/connection/session.rb:465:in `dispatch_incoming_packets' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/net-ssh-2.7.0/lib/net/ssh/connection/session.rb:221:in `preprocess' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/net-ssh-2.7.0/lib/net/ssh/connection/session.rb:205:in `process' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/net-ssh-2.7.0/lib/net/ssh/connection/session.rb:169:in `block in loop' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/net-ssh-2.7.0/lib/net/ssh/connection/session.rb:169:in `loop' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/net-ssh-2.7.0/lib/net/ssh/connection/session.rb:169:in `loop' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/sshkit-1.1.0/lib/sshkit/backends/netssh.rb:149:in `block in _execute' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/sshkit-1.1.0/lib/sshkit/backends/netssh.rb:106:in `tap' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/sshkit-1.1.0/lib/sshkit/backends/netssh.rb:106:in `_execute' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/sshkit-1.1.0/lib/sshkit/backends/netssh.rb:54:in `execute' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/capistrano-rails-1.0.0/lib/capistrano/tasks/assets.rake:61:in `block (6 levels) in ' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/sshkit-1.1.0/lib/sshkit/backends/abstract.rb:89:in `with' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/capistrano-rails-1.0.0/lib/capistrano/tasks/assets.rake:60:in `block (5 levels) in ' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/sshkit-1.1.0/lib/sshkit/backends/abstract.rb:81:in `within' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/capistrano-rails-1.0.0/lib/capistrano/tasks/assets.rake:59:in `block (4 levels) in ' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/sshkit-1.1.0/lib/sshkit/backends/netssh.rb:42:in `instance_exec' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/sshkit-1.1.0/lib/sshkit/backends/netssh.rb:42:in `run' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/sshkit-1.1.0/lib/sshkit/runners/parallel.rb:12:in `block (2 levels) in execute' Tasks: TOP => deploy:assets:precompile 

顺便说一下,我认为它与$PATH无关,因为bundle install运行得很好。

有谁知道发生了什么?

谢谢!

好吧,因为我有同样的问题,我花了很长时间来解决它:

您可能想知道为什么当您使用ssh使用shell登录时,此命令无法正常工作。

我不是专家(当我错了时,请纠正我):问题是使用ssh登录远程服务器有几点不同。 引用capistrano的文档:

这真的是一个关于Capistrano使用哪种shell的问题,它是关于登录,非登录,交互或非交互的可能性的矩阵。

它们在这里有一个花哨的图形(在底部),它们说明了在登录过程中执行的文件的路径。 – 如果您想继续阅读本主题,给定的来源也很有趣。

出了什么问题?

当您使用ssh登录时,您(在登录时)执行多个文件(例如,当您使用bash时.bash_profile)。 通常,您的$ PATH变量会通过几个路径扩展到您的环境中的重要function。 但是不同的登录“样式”包括不同的文件。

正如文件中所述:

默认情况下,Capistrano始终指定一个非登录的非交互式shell。

在我的情况下,这导致我的登录文件.bash_profile不包括在内但它包括我的rvm的设置。 capistrano登录会话不知道我的rvm路径的结果。

我怎样才能解决这个问题?

对我来说,结果只是在Capfile (位于rails-project的根目录中)中需要’capistrano / rvm’ (我正在使用RVM)行中取消注释

希望能帮助别人。

编辑:

并确保在Gemfile中包含gem’capistrano gem 'capistrano-rvm'

好的,修好了。

我补充说:

 set :default_env, { path: "~/.rbenv/shims:~/.rbenv/bin:$PATH" } 

到我的deploy.rb

我不确定是最好的解决方案,但它确实有效。

我想你应该执行

 apt-get install git-core 

在你的服务器上

我使用rbenv时遇到了同样的问题。 为我解决的是在捆绑器之前包括rbenv库 – 而不是之后。 订单结果非常重要。 这是我的Capfile中的内容:

 require 'capistrano/rbenv' require 'capistrano/bundler' 

如果你做得对,你应该看到使用rbenv前缀执行bundle命令,沿着这些方向:

 XX RBENV_ROOT=$HOME/.rbenv RBENV_VERSION=2.3.0 $HOME/.rbenv/bin/rbenv exec bundle install ... 

错误的解决方案:

/ usr / bin / env git没有这样的文件或目录capistrano

在远程服务器中安装git,即要进行部署的机器。

 apt-get install git 

确保在Capfile中要求所有这些gem。

当我在终端上以交互方式键入bundle install ,它工作正常。 现在,当我通过Capistrano使用它时,它不起作用。

我这样解决了:

在Ubuntu中, ~/.bashrc中有一段代码表示:

 # If not running interactively, don't do anything case $- in *i*) ;; *) return;; esac 

当你运行Capistrano时,它实际上会使用你的~/.bashrc 但它不会在该代码块下面运行任何命令。

因此,我修复了将bundle install所需的代码行移到该代码块之上的问题,因此Capistrano可以加载它们。

你可以通过运行which bundle来获得一些移动线的提示。