Ruby on rails Capistrano3,使用上传!在lib/capistrano/tasks中的任务中

Ruby on rails Capistrano3,使用上传!在lib/capistrano/tasks中的任务中,ruby-on-rails,ruby,capistrano3,Ruby On Rails,Ruby,Capistrano3,我正在使用Capistrano3,我想创建自己的任务。因此,我在lib/capistrano/tasks中创建了一个文件my_new_thing.rake,当我运行cap-T时可以看到该任务。但是。。。有些方法不可用。当我尝试使用上传!我明白了 cap aborted! NoMethodError: undefined method `upload!' for main:Object 但是如果我将相同的任务移动到config/deploy.rb中,然后上传!方法是可用的 发生了什么事?如何创建

我正在使用Capistrano3,我想创建自己的任务。因此,我在lib/capistrano/tasks中创建了一个文件my_new_thing.rake,当我运行cap-T时可以看到该任务。但是。。。有些方法不可用。当我尝试使用上传!我明白了

cap aborted!
NoMethodError: undefined method `upload!' for main:Object
但是如果我将相同的任务移动到config/deploy.rb中,然后上传!方法是可用的


发生了什么事?如何创建新的Capistrano任务?将它们放在单独的文件中并让它们工作?

如果要将它们保存在单独的文件中,可以为Capistrano配方创建文件夹
config/recipes

使用
.rb
扩展名,因为这不是常规的rake任务

config/deploy.rb
中添加此行

load File.expand_path('../recipes/my_new_thing.rb', __FILE__)

如果您想使用rake任务,那么您需要在部署文件中创建一个任务,该任务调用rake任务,这不是一个明智的移动。因此,正如@Sharagoz所建议的,最好的方法是创建自己的配方文件并将其包含在中。

我也遇到了同样的问题,我在一个单独的文件中创建了自己的配方,该文件已加载到deploy中,但无法上传!工作

对我来说,解决这个问题的方法是在任务中添加一个角色过滤器,使我的最终配方看起来像这样:

 namespace :figaro do      
   desc "Transfer Figaro's application.yml to shared/config"
   task :upload do
     on roles(:all) do
       upload! "config/application.yml", "#{shared_path}/config/application.yml"
     end
   end
 end
 before "deploy:check", "figaro:upload"

我希望这有帮助

角色检查是我所需要的一切。谢谢+1我必须在
上传之前添加
执行“mkdir-p{shared_path}/config”
行,因为该目录在服务器上尚不存在。