私は現在、別の Ruby プログラムのコンテキスト内でレールなど、別のアプリケーションを基本的に実行するフレームワークを開発しています。私の最初の試みは、単に次のようにアプリを起動することでした:
def load_app!
# Load the rails application
require './config/application'
# Initialize the rails application
@app = App::Application.initialize!
end
ここでの問題は、フレームワークがロードされたアプリケーションと競合する必要があるためinitialize!
、通常の Ruby プログラムでは呼び出しが機能しないことです。
したがって、私の質問は、基本的にこの呼び出しを空の RVM 環境のように動作するユニットにスコープする方法を誰かが知っているかどうかです。したがって、基本的には次のような動作です。
require 'json'
puts JSON.generate({:name => "test"})
blank_environment do
puts JSON.generate({:name => "test"})
#=> uninitialized constant JSON
require 'json'
puts JSON.generate({:name => "test"})
end
現在ロードされている定数の定義解除またはアンロードは行われません。他の依存関係を持つgemを再度使用しているため、それらのすべてがわからないためです。
それで、クールな方法はありますか?またはこれを処理する他の方法はありますか?
アップデート:
ちょうどアイデアに出くわしました。ruby のrequire
メソッドが常にグローバル スコープを必要とするのはなぜですか? 現在のモジュールの下にロードされたモジュールを実際にスコープすることは、非常に優れた機能ではないでしょうか?
module ScopeA
require 'json' #> adds support for ScopeA::JSON
# due to normal ruby scoping everything can be called like normal in here
JSON.parse("something")
end
# JSON should not be available here
module ScopeB
require 'yaml'
YAML.parse("something") # but no JSON, of course
end
このようなものは存在しませんか?include
すでに定数を知っている必要があります...
前もって感謝します!