Ruby on rails 3 从capistrano、cap deploy bash运行远程rake任务:-c:第1行:语法错误:意外的文件结尾

Ruby on rails 3 从capistrano、cap deploy bash运行远程rake任务:-c:第1行:语法错误:意外的文件结尾,ruby-on-rails-3,rake,capistrano,Ruby On Rails 3,Rake,Capistrano,在这个主题中,我遵循了@Coward的答案: 要添加自定义任务rake:invoke在mydeploy.rb中,以便能够远程调用rake任务 它本身的工作非常完美,但当我的capdeploy处理正在执行资产时,我会遇到以下错误:预编译 [mydomain.com] rvm_path=/usr/local/rvm /usr/local/rvm/bin/rvm-shell '1.9.2@ziya' -c 'cd /var/deploy/ziya/releases/20120223100338 &am

在这个主题中,我遵循了@Coward的答案: 要添加自定义任务
rake:invoke
在my
deploy.rb
中,以便能够远程调用rake任务

它本身的工作非常完美,但当我的
capdeploy
处理正在执行
资产时,我会遇到以下错误:预编译

[mydomain.com] rvm_path=/usr/local/rvm /usr/local/rvm/bin/rvm-shell '1.9.2@ziya' -c 'cd /var/deploy/ziya/releases/20120223100338 && #<Capistrano::Configuration::Namespaces::Namespace:0x007ff2b4a4bad8> RAILS_ENV=staging RAILS_GROUPS=assets assets:precompile'
 ** [out :: my domain.com] bash: -c: line 1: syntax error: unexpected end of file
    command finished in 1265ms

但是,如果我将
任务:invoke
移动到
名称空间:deploy
,删除
名称空间:rake
,那么一切都正常了,这太令人困惑了。

这是因为Capistrano在其源代码中,以这种方式使用部署文件中的
set:rake
指令将哪个命令用作rake命令行

但是,由于capistrano内部的原因,当您声明
rake
命名空间时,它将优先于声明的rake变量。因此,当capistrano执行其预编译资产的配方时,它将使用
rake
变量而不是返回
“rake”
字符串返回已声明的名称空间,并将其转换为字符串。您可以在生成的命令行的这一部分中看到它:

 ... && #<Capistrano::Configuration::Namespaces::Namespace:0x007ff2b4a4bad8> RAILS_ENV=staging RAILS_GROUPS=assets assets:precompile'
…&&#RAILS\u ENV=暂存RAILS\u组=资产资产:预编译'

这显然会导致shell语法错误,这就是更改名称空间解决问题的原因。

Awesome!救了我的命!谢谢
 ... && #<Capistrano::Configuration::Namespaces::Namespace:0x007ff2b4a4bad8> RAILS_ENV=staging RAILS_GROUPS=assets assets:precompile'