2011-06-03 15 views
36

Escribo mi primera joya y me gustaría que el usuario pueda recuperar y establecer opciones específicas a través de un archivo config.yml.Dónde colocar/acceder al archivo de configuración en gem?

¿Dónde se debe colocar este archivo dentro de la estructura de mi archivo gem y cómo alguien modifica el archivo al instalar mi gema? Supongo que pueden pasar opciones específicas al instalar la gema, y ​​esas opciones pueden asignarse al archivo config.yml, pero ¿cómo es posible?

Además, ¿es la mejor manera de recuperar el archivo a través de YAML.load_file?

He visto las grabaciones de Ryan sobre la creación de una gema a través de Bundler, pero él no cubre este tema.

Respuesta

49

Estoy saltando en este un poco tarde pero dejaré una implementación de ejemplo de cómo generalmente manejo esto, para referencia futura.

Como se mencionó, normalmente querrá permitir la configuración mediante archivos y hash. Es bastante fácil y ligero incluir ambas formas, por lo que debes hacerlo.

Algo como esto funciona para mí en la mayoría de escenarios:

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 

Una buena práctica añadido sería tener valores predeterminados para todas sus claves de configuración (como en el ejemplo anterior). De esta forma, le está dando al usuario la máxima libertad sobre cómo pueden configurar su biblioteca.

+7

Me siento más inteligente por haber leído esta respuesta. –

+0

Sigo recibiendo un 'método indefinido' to_sym 'para {hash =>' var '}: Hash (NoMethodError' cuando uso algo como esto. Se queja del método self.configure(). – Pred

+0

Cambié el k.to_sym a: k.to_sym, y el error ya no ocurre, pero ni siquiera intenta leer mi archivo de configuración. – Pred

2

Como gema, debe permitir que las personas interactúen con ella como quieran. No puedes asumir ningún tipo de estructura de aplicación. En su lugar, exponga una API que permite al desarrollador pasar un hash de opciones o una ruta a su propio archivo YAML que puede leer y analizar.

Pero intentar establecer una convención de nomenclatura de archivo de una gema probablemente no es lo que desea.

+0

Una joya creada a través de una estructura Bündler ha especificado ya establecido para usted. Estoy tratando de encontrar el mejor lugar para guardar mi archivo de configuración dentro de esta estructura (dentro de mi propia joya). Hay muchas gemas que permiten a los usuarios especificar opciones. Digamos, por ejemplo, que estás escribiendo una gema que se está comunicando con un servicio RESTful. Bueno, necesitamos una URL para conectarse al servicio. En lugar de codificar el URL en mi código de conexión, me gustaría ubicarlo en un archivo de configuración y recuperarlo dentro de mi código desde ese archivo. – webren

+0

Además, supongamos que su gema permite a los usuarios conectarse a cualquier servicio RESTful, pero su usuario necesita saber la URL. ¿Cómo toma la URL del usuario y la ubica en la lógica de conexión de servicio de su código? (esto refleja la pregunta 2). – webren

+0

¿Desea cargar un archivo yaml empaquetado en su joya de su joya? ¿O desea cargar automáticamente un archivo yaml del código que consume su gema? –

4

Si su gema incluye un comando que puede ser ejecutado de forma interactiva por el usuario, sería mejor solicitar los detalles necesarios en la primera ejecución. Un buen lugar para guardar la configuración estaría en el directorio de inicio del usuario como un archivo de puntos.

Si su gema es puramente para uso en otro código como una biblioteca, entonces la configuración debe pasar como un hash o similar.

+0

Mi situación es la última (mi código se usará como biblioteca). ¿Cómo voy a permitir que los usuarios envíen opciones a través de un hash? – webren

Cuestiones relacionadas