[英]“resources”-directory for ruby gem
我目前正在嘗試在Ruby中創建自己的gem。 gem需要一些靜態資源(比如ICO格式的圖標)。 我在哪里將這些資源放在我的gem目錄樹中以及如何從代碼中訪問它們?
此外,我的擴展的一部分是本機C代碼,我希望C部分也可以訪問資源。
您可以將資源放在任何您想要的位置, lib
目錄除外。 因為它將成為Ruby的加載路徑的一部分,所以應該存在的唯一文件是您希望人們require
。
例如,我通常將翻譯后的文本存儲在i18n/
目錄中。 對於圖標,我只是將它們放在resources/icons/
。
至於如何訪問這些資源......我遇到了這個問題, 我寫了一個小寶石只是為了避免重復。
基本上,我一直這樣做:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.