gpt4 book ai didi

ruby - "resources"- ruby​​ gem 目录

转载 作者:数据小太阳 更新时间:2023-10-29 07:27:23 24 4
gpt4 key购买 nike

我目前正在尝试用 Ruby 创建我自己的 gem。 gem 需要一些静态资源(比如 ICO 格式的图标)。我应该将这些资源放在我的 gem 目录树中的什么位置以及如何从代码访问它们?

此外,我的部分扩展是 native C 代码,我希望 C 部分也能访问这些资源。

最佳答案

除了 lib 目录之外,您可以将资源放在任何您想要的地方。由于它将成为 Ruby 加载路径的一部分,因此应该存在的唯一文件是您希望人们要求的文件。

例如,我通常将翻译后的文本存放在i18n/ 目录中。对于图标,我只是将它们放在 resources/icons/ 中。

至于如何访问这些资源...我遇到这个问题够多了 I wrote a little gem只是为了避免重复。

基本上,我一直在这样做:

def Your::Gem.root
# Current file is /home/you/code/your/lib/your/gem.rb
File.expand_path '../..', File.dirname(__FILE__)
end

Your::Gem.root
# => /home/you/code/your/

我把它包装成一个不错的 DSL,添加了一些额外的便利的东西,最后是这样的:

class Your::Gem < Jewel::Gem
root '../..'
end

root = Your::Gem.root
# => /home/you/code/your/

# No more joins!
path = root.resources.icons 'your.ico'
# => /home/you/code/your/resources/icons/your.ico

至于在 C 中访问您的资源,path 只是一个 Pathname .您可以将它作为字符串传递给 C 函数,打开文件并执行您需要执行的操作。您甚至可以将对象返回到 Ruby 世界:

VALUE your_ico_new(VALUE klass, VALUE path) {
char * ico_file = NULL;
struct your_ico * ico = NULL;

ico_file = StringValueCStr(path);
ico = your_ico_load_from_file(ico_file); /* Implement this */
return Data_Wrap_Struct(your_ico_class, your_ico_mark, your_ico_free, ico);
}

现在您可以从 Ruby 访问它:

ico = Your::Ico.new path

关于ruby - "resources"- ruby​​ gem 目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11051840/

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