簡體   English   中英

“資源” - 紅寶石寶石的目錄

[英]“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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM