gpt4 book ai didi

ruby - 如何为用 Ruby 编写的 Ruby 命令行实用程序提供配置文件?

转载 作者:太空宇宙 更新时间:2023-11-03 16:05:55 26 4
gpt4 key购买 nike

我有一个使用 GLI 框架用 Ruby 编写的命令行实用程序。我想在我的主目录中配置我的命令行实用程序,使用 Ruby 本身作为 DSL 来处理它(类似于 GemfileRakefile)。

我在文件夹 lib/myapp 中有类 ConfigData。该类看起来像以下方式:

class ConfigData
@@data = {}

class ConfigItem
def initialize
@data = {}
end
def missing_method(name, *args)
@data[name] = args[0]
end
end

def self.add(section)
item = ConfigItem.new()
yield item
@@data[section]=item
end

end

现在,我想要的是配置文件,最好是名称为 Myappfile,位于当前工作文件夹中,包含以下内容

add('section1') do |i|
i.param1 'Some data'
i.param2 'More data'
end

当此代码包含在 ConfigData 的 classend 之间时,它工作正常。但现在我想将它放在我启动应用程序的工作文件夹中。

我尝试在 ConfigData 的 classend 之间使用 require('./Myappfile'),但它对我不起作用。我试图阅读 rake 的源代码,但对我来说不是很清楚。

任何提示如何解决这个问题?

最佳答案

要在实例的上下文中评估代码,这是您想要做的,您需要 instance_eval() 方法。永远不要使用正常的评估。曾经。无论如何,这是加载 fingi 文件并获取数据的方式:

config = ConfigData.new
config.instance_eval(File.read("Myconfig"))
#Access configuration data here from the config object

就这么简单。以这种方式加载对象后,您可以访问对象的值。

警告:这不是很安全。这实际上是一个巨大的安全漏洞。这是安全版本:

f = Fiber.new {str = File.read("Myconfig"); $SAFE = 4; config = ConfigData.new; config.instance_eval(str); Fiber.yield config}
confdata = f.resume
#Access configuration data here from confdata.

这会在(某种)沙箱中执行外部代码,因此它不能做任何卑鄙的事情。


此外,您为什么不直接使用 YAML 配置?除非配置需要运行 pwd 之类的代码或访问 RUBY_VERSION,否则 YAML 更简单、更安全,而且更不易出错。

关于ruby - 如何为用 Ruby 编写的 Ruby 命令行实用程序提供配置文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14011690/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com