我目前正在开发一个基本上执行另一个应用程序的框架,例如在另一个 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
已经必须知道常数...
提前致谢!