1

私は現在、別の 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すでに定数を知っている必要があります...

前もって感謝します!

4

1 に答える 1

0

まあ、さらに調査した結果、私が必要とする方法では実際には不可能のようです。

分散ルビーを使用して基本バージョンを実装しましたが、これでは満足できません。

require 'drb/drb'

URI = "druby://localhost:8787"

# Blank environment
pid = fork do
  Signal.trap("INT") { puts "Stopping Server.."; exit }

  class Application
    def call(env)
      [200,{},""]
    end
  end

  DRb.start_service(URI, Application.new)
  DRb.thread.join
end

# Working environment
DRb.start_service

app = DRbObject.new_with_uri(URI)
puts app.call({})

Process.kill("INT", pid)
Process.wait

誰かがより良いアプローチを思いついたら、それは大歓迎です!

于 2012-07-22T22:23:09.860 に答える