1

我目前正在开发一个基本上执行另一个应用程序的框架,例如在另一个 ruby​​ 程序的上下文中的 rails。我最初的尝试只是像这样启动应用程序:

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

好吧,经过更多的研究,它似乎真的不像我需要的那样。

我现在使用分布式 ruby​​ 实现了一个基本版本,这对我不太满意:

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 回答