web-dev-qa-db-ja.com

gemのどこにconfigファイルを配置/アクセスしますか?

私は最初のgemを書いており、config.ymlファイルを介してユーザーが特定のオプションを取得および設定できるようにしたいと考えています。

このファイルは、gemファイル構造内のどこに配置する必要がありますか?gemをインストールするときに、誰かがファイルをどのように変更しますか?私はそれらがgemをインストールするときに特定のオプションを渡すことができると思います、そしてそれらのオプションはconfig.ymlファイルにマップすることができますが、これはどのように可能ですか?

また、YAML.load_fileを介してファイルを取得する最善の方法は何ですか?

Bundlerを介して宝石を作成することに関するライアンのレールキャストを見てきましたが、彼はこのトピックをカバーしていません。

40
webren

私はこれに少し遅れてジャンプしますが、今後の参照のために、これを一般的に処理する方法の実装例を残します。

言及したように、通常はファイルとハッシュの両方を介した構成を許可する必要があります。両方の方法を含めるのは非常に簡単で軽いので、実行する必要があります。

このようなものはほとんどのシナリオで私にとってうまくいきます:

require 'yaml'

module MyGem
  # Configuration defaults
  @config = {
              :log_level => "verbose",
              :min => 0,
              :max => 99 
            }

  @valid_config_keys = @config.keys

  # Configure through hash
  def self.configure(opts = {})
    opts.each {|k,v| @config[k.to_sym] = v if @valid_config_keys.include? k.to_sym}
  end

  # Configure through yaml file
  def self.configure_with(path_to_yaml_file)
    begin
      config = YAML::load(IO.read(path_to_yaml_file))
    rescue Errno::ENOENT
      log(:warning, "YAML configuration file couldn't be found. Using defaults."); return
    rescue Psych::SyntaxError
      log(:warning, "YAML configuration file contains invalid syntax. Using defaults."); return
    end

    configure(config)
  end

  def self.config
    @config
  end
end

追加のベストプラクティスは、すべての構成キーにデフォルトを設定することです(上記の例のように)。このようにして、ユーザーはライブラリを構成する方法に究極の自由を与えます。

53
Nicholas B.

ジェムにユーザーがインタラクティブに実行できるコマンドが含まれている場合は、最初の実行時に必要な詳細情報を入力することをお勧めします。設定を保存するのに適した場所は、ドットファイルとしてユーザーのホームディレクトリにあります。

宝石が純粋にライブラリとして他のコードで使用される場合は、構成をハッシュなどとして渡すことを許可する必要があります。

5
Iain Wilson

構成ファイルを使用しない別のパターン:

YourGem.configure do |config|
  config.api_key = 'your_key_here'
end

https://robots.thoughtbot.com/mygem-configure-block

3
Artur Beljajev

宝石として、あなたは人々が彼らが望む方法でそれとやり取りできるようにする必要があります。アプリの構造を想定することはできません。代わりに、開発者がオプションのハッシュ、または読み取りと解析が可能な独自のYAMLファイルへのパスを渡すことができるAPIを公開します。

しかし、gemからファイルの命名規則を確立しようとすることは、おそらく望んでいることではありません。

2
Alex Wayne