ライブラリ(requireを介してロード)が見つからない場合、同じファイルに「さらに」ルビーコードをロードすることを条件付きでスキップできますか?
begin
require 'aws-sdk'
rescue LoadError
puts "aws-sdk gem not found"
return #does not work. nor does next
end
# code after here should not be executed as `aws-sdk` gem was not found
puts "=== should not get executed"
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
上記のコードで、を押した後にファイルをそれ以上ロードしないようにRubyに依頼できますか rescue LoadError
?
アーリーリターンのようですが、関数ではなくファイルのロード用です。
私はrubygemを必要とするaws-sdk
レーキタスクを持っているのでそれが必要ですが、私はそれを私のローカルマシンでのみ使用しています。見つからない場合aws-sdk
は、後で同じファイルにコードをロードしても意味がありません。コードを小さなファイルに分割して、require呼び出しでワープできると思います
if Rails.env.development?
require 'import_to_heroku'
end
しかし、既存のコードをワープまたは変更したくない
また、コード全体を条件付きでラップすることもできますが、それはエレガントではありません。begin-rescueブロックも、明示的な制御フローの形式です。元のコードをラップしたり触れたりしたくないのはなんらかの方法です
多分次のようなAPI
require_or_skip_further_loading 'aws-ruby`
だから私は私のコードが機能的に同等であることを望んでいます
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
または条件付きの場合
library_found = false
begin
require 'aws-sdk'
library_found = true
rescue LoadError
puts "aws-sdk gem not found"
return #does not work
end
if library_found
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
end
発生した後もプログラムの実行を継続したいLoadError
。すなわち。同じファイルに記述されたコードを適切に処理LoadError
し、ロードしないでください。そして、特に後のコードは、rubyインタープリターによって実行(またはロード)されるべきではありませLoadError
んexit
abort
LoadError
LoadError
もともとルビーでrequireをスキップする方法を尋ねていましたか? しかし、私はきちんと質問をしませんでした。これがより良い言葉であるといいのですが