2013-01-25 59 views
2

我可以有條件地跳過在Ruby中需要文件嗎?如何在ruby中跳過require?

begin 
    require 'aws-sdk' 
rescue LoadError 
    puts "aws-sdk gem not found" 
end 

namespace :db do 
    desc "import local postgres database to heroku. user and database name is hardcoded" 
    task :import_to_heroku => [:environment, "db:dump_for_heroku"] do 
    # code using aws-sdk gem 
    end 
end 

在上面的代碼,我可以問紅寶石不讀後rescue LoadError
我可以包裝在有條件的整個代碼,但是這是不雅。我試過nextreturn

編輯:在Can I conditionally skip loading "further" ruby code in the same file?增加了一個新問題。抱歉。沒有問這個問題的正確

+0

肯定能。你可以有條件地「要求」某些東西,或者使用「救援」來找到失敗的東西。 –

+0

我已經救了'LoadError',但是我希望如果執行'LoadError',則不應執行進一步的代碼。在給出的例子中,耙子任務'db:import_to_heroku'不應該叫 – deepak

+1

請參閱「[安全需要Ruby中的gem](http://stackoverflow.com/questions/7307785/safely-require-gems-in-ruby? rq = 1)「 –

回答

1

我有救了LoadError,但我想如果LoadError被執行,進一步的代碼不應該被執行。在上述例子中,rake任務分貝:import_to_heroku不應該叫

然後做:

begin 
    require 'aws-sdk' 

    namespace :db do 
    desc "import local postgres database to heroku. user and database name is hardcoded" 
    task :import_to_heroku => [:environment, "db:dump_for_heroku"] do 
     # code using aws-sdk gem 
    end 
    end 
rescue LoadError 
    puts "aws-sdk gem not found" 
end 
+0

不錯:-)我想,而不是包裝在條件的整個代碼。這似乎是一個有條件但更好看的我猜。前面的代碼的唯一優點是我知道'aws-sdk'有一個'LoadError'。但我可以匹配錯誤信息,我猜。 – deepak

+0

實際上是希望得到一個ruby'syntax'什麼會跳過加載文件。不想以任何方式包裝或修改我的主代碼 – deepak

+0

實際上想要的東西像http://stackoverflow.com/questions/14526268/can-i-conditionally-skip-loading-further-ruby-code-in-the-同一文件 – deepak

7

日誌後,也許增加一個exit

begin 
    require 'aws-sdk' 
rescue LoadError 
    puts "aws-sdk gem not found" 
    exit 
end 

namespace :db do 
    desc "import local postgres database to heroku. user and database name is hardcoded" 
    task :import_to_heroku => [:environment, "db:dump_for_heroku"] do 
    # code using aws-sdk gem 
    end 
end 

而且中止功能是登錄和退出在同一呼叫:

abort("aws-sdk gem not found") 
+0

我不知道'abort' :-) – mdesantis

+0

我想」跳過「加載文件而不是中止。這會停止程序執行 – deepak

+0

此時不會退出正在運行的腳本嗎? –