【问题标题】:Finding the gem root寻找宝石根
【发布时间】:2012-04-12 22:46:18
【问题描述】:

有没有办法知道我的 gem 的根路径?我正在尝试从 gems 路径中的 yaml 加载默认配置。如何使用 ruby​​ 获取 gems 根目录?

【问题讨论】:

    标签: ruby gem


    【解决方案1】:

    给定以下项目结构:

    your_gem/
      lib/
        your_gem.rb
    

    我会这样做:

    # your_gem.rb
    
    module YourGem
      def self.root
        File.expand_path '../..', __FILE__
      end
    end
    

    Ruby 2.0 引入了Kernel#__dir__ 方法;它可以实现更短的解决方案:

    # your_gem.rb
    
    module YourGem
      def self.root
        File.dirname __dir__
      end
    end
    

    如果您需要访问其他目录,您可以简单地在 root 上构建:

    module YourGem
      def self.bin
        File.join root, 'bin'
      end
    
      def self.lib
        File.join root, 'lib'
      end
    end
    

    【讨论】:

    • 为我工作,因为我引用了我作为 gemspec 的一部分包含的“docs”文件夹,其中使用默认 Rails.root.join("docs") 失败。谢谢!
    • 我正在使用 ruby​​ 2.0.0p0(2013-02-24 修订版 39474)。 File.dirname __dir__ 对我不起作用。我收到此错误:TypeError: no implicit conversion of nil into String。碰巧知道为什么?谢谢。
    • @E.E.33,__dir__ is documented to return nil if __FILE__ is also nil。你是如何运行你的脚本的?
    • 我刚刚打开 irb 并运行命令 __dir__。我只是从一个文件中运行 if ,并得到了想要的结果。谢谢老哥!
    • File.expand_path('../', File.dirname(__FILE__) 是我平时看到的。
    【解决方案2】:

    这是可执行文件和库的通用解决方案。它使用 Gem API 加载规范,因此路径始终正确:

    spec = Gem::Specification.find_by_name("your_gem_name")
    gem_root = spec.gem_dir
    yaml_obj = YAML.load(gem_root + "/file_name.yaml")
    

    【讨论】:

    • 使用File.join 代替字符串连接。
    • @MatheusMoreira 为什么重要?
    • File.join 确保您为您的操作系统使用适当的路径分隔符,从而使代码跨平台。 “/”是特定于 linux 的。 Microsoft Windows 的许多版本(全部?)都使用“\”。
    • @JonathanR.Wallace - 同意 File.join 有助于平台/应用程序的兼容性,但是 Windows 文件 I/O API 会将它在路径中找到的任何“/”转换为“\”。也就是说,许多检查路径的 Windows 应用程序将在“/”上失败,而不是让操作系统决定要做什么。见注:Naming Files, Paths and Namespaces
    【解决方案3】:

    gem list <gem> -d

    或者,如果您使用的是捆绑器:

    bundle show <gem>

    【讨论】:

    • 在 gem 本身内:我试图调用 File.load。什么是宝石根?
    猜你喜欢
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-15
    • 1970-01-01
    • 2012-12-10
    • 2017-06-29
    相关资源
    最近更新 更多