加载两个名称相同的Ruby Modules / Gems
发布时间:2020-12-17 04:14:25 所属栏目:百科 来源:网络整理
导读:我正在尝试使用两个Gems来访问Amazon Web Services(AWS).一个是亚马逊’aws-sdk’,另一个是’amazon-ec2′.我正在使用第二个,因为aws-sdk没有涵盖亚马逊服务的cloudwatch部分. 问题是两者都加载到同一名称空间. require 'aws-sdk' # aws-sdk gemrequire 'AWS
我正在尝试使用两个Gems来访问Amazon Web Services(AWS).一个是亚马逊’aws-sdk’,另一个是’amazon-ec2′.我正在使用第二个,因为aws-sdk没有涵盖亚马逊服务的cloudwatch部分.
问题是两者都加载到同一名称空间. require 'aws-sdk' # aws-sdk gem require 'AWS' # amazon-ec2 gem config = {:access_key_id => 'abc',:secret_key => 'xyz'} # start using the API with aws-sdk ec2 = AWS::EC2.new(config) # start using the API for anazon-ec2 cw = AWS::Cloudwatch::Base.new(config) 现在,这可以理解地在最后一行引发错误,因为AWS模块指向第一个必需的库,在本例中为aws-sdk. NameError: uninitialized constant AWS::Cloudwatch 那么,我可以将其中一个加载到另一个名称空间中吗?就像是 require 'aws-sdk','AWS_SDK' require 'AWS','AWS_EC2' ec2 = AWS_SDK::EC2.new(config) cw = AWS_EC2::Cloudwatch::Base.new(config) 或者我可以在这里使用另一种技巧吗? 谢谢 解决方法
在Ruby中,来自不同gem的同名模块不会互相替换.如果一个宝石实现
module AWS class Foo end end 和另一个工具 module AWS class Bar end end 并且你需要它们两个,你将得到一个包含类Foo和类Bar的AWS模块(除非第二个做了一些非常棘手的事情,比如在定义自己的东西之前明确地取消定义模块中已有的东西,这是非常不可能).只要第二个gem没有重新定义第一个gem中的任何方法(或者尝试将模块用作类,反之亦然),它们都应该正常工作.我想你可能在寻找错误的解决方案. 编辑: .rvm/gems/ree-1.8.7-2011.03@ec2/gems/amazon-ec2-0.9.17/lib/AWS/EC2.rb:2: EC2 is not a module (TypeError) 可能是因为错误被某个地方吞没而且模块AWS :: Cloudwatch尚未定义,只是因为宝石的初始化出错了? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |