2016-07-27 67 views
2

我試圖讓Capistrano部署腳本。NoMethodError:undefined方法`內'爲主:對象

在我Capfile我確保所有rake任務包括

# Load tasks 
Dir.glob('config/capistrano_tasks/*.rake').each { |r| import r } 

接下來,我有一個 'migrations.rake' 載:

namespace :fileservice do 
    task :migrate do 
     within release_path do 
      info 'Doing migrations' 

      execute :php, fetch(:symfony_console_path), 'doctrine:migrations:migrate', '--no-interaction', fetch(:symfony_console_flags) 
     end 
    end 
end 

在我deploy.rb我調用任務的盡頭有:

after 'deploy:publishing', 'fileservice:migrate' 

出於某種原因,我不斷收到一個錯誤說:

NoMethodError: undefined method `within' for main:Object 

我沒有關於「內」的方法思路在哪裏看或什麼可能是錯誤的...當谷歌上搜索我得到了很多的「NoMethodError」擊中,但沒有和大多數是一般的Ruby錯誤。

哪裏應該定義「內」?我在軌道上的東西紅寶石?還是capistrano?

希望有人知道從哪裏開始尋找或包含哪個庫/腳本!

更新:我剛剛發現,沒有任何方法的工作。當刪除線我得到了「信息」和「執行」同樣的錯誤....所以我想的地方,缺少的東西.....

回答

3

你需要告訴Capistrano的其中(即什麼樣的服務器上)來運行你的SSH命令。做到這一點使用on塊,如下:

namespace :fileservice do 
    task :migrate do 
    on roles(:db) do 
     within release_path do 
     info 'Doing migrations' 
     execute :php, fetch(:symfony_console_path), 'doctrine:migrations:migrate', '--no-interaction', fetch(:symfony_console_flags) 
     end 
    end 
    end 
end 

更換roles(:db)適合您的任務,這取決於你想要的命令來運行。例如,表達式on roles(:all) do ... end將在所有服務器上運行命令。


您也可以按照官方文件在http://capistranorb.com,或者這兩者的Capistrano README,顯示task/on/execute語法的例子。

+0

確實是這個問題。因爲此時只有一臺服務器,所以我刪除了它。有沒有想法它實際上是強制性的!謝謝您的幫助! –

0

正如你已經得到了答案,但讓我從基本的燈泡。

SSHKit實際上是用Capistrano 3開發和發佈的,它基本上是一個較低級別的工具,它提供了與遠程服務器連接和交互的方法;換句話說,它爲Capistrano做了所有的繁重工作。

您需要了解四種主要方法。

on():指定服務器上

within()運行:指定的目錄路徑中

as()運行:指定用戶爲

with()運行:指定環境要運行的變量

通常,您將通過使用on()方法指定要在其上運行命令的服務器來啓動任務。然後,您可以使用as(),within()with()方法的任意組合,這些方法可以按任何順序重複和堆疊。

希望這對你有所幫助

相關問題