2011-12-07 15 views
5

He creado una secuencia de comandos .thor para configurar un nuevo proyecto de ruby ​​de la manera que me gusta. Estoy usando el comando Thor :: Actions directory para construir la aplicación completamente desde una estructura de directorio de plantillas, en lugar de definirlas en línea con heredocs. El directorio de la escritura es como la siguiente:¿Cómo hacer que Thor encuentre plantillas para archivos .thor instalados en el sistema?

rubynu.thor 
template/ 
    bin/ 
    lib/ 
    %app_name%.rb.tt 
    %app_name% 
    README.markdown 
    .gitignore 
    ... 

Esto funciona muy bien, y me permite fácilmente visualizar y cambiar partes individuales de la plantilla como mis cambios en el gusto.

Pero no puedo encontrar una buena manera de conseguir que thor encuentre el directorio de la plantilla una vez que el archivo .thor está instalado en el sistema usando thor install rubynu.thor. Install almacena una copia del archivo .thor en ~/.thor pero ignora el directorio template/, por lo que las plantillas ya no se encuentran.

No quiero codificar la ruta source_root ni copiar manualmente sobre el directorio de la plantilla al ~/.thor. ¿Hay algo incorporado en thor que maneja la instalación de plantillas junto con el archivo .thor? Sería genial si pudieran empaquetarse juntos cuando se instalan.

Si no, ¿cuál es la mejor manera de evitar esto? Seguramente hay tareas thor instaladas en el sistema en alguna parte que usan archivos de plantilla. ¿Cómo lo hiciste? Supongo que podría pasar por alto thor install y proporcionar esto como una gema (aunque eso parece exagerado), o morder la viñeta y pegar todas las definiciones de plantilla en línea en un archivo .thor gigante (menos placentero hacer cambios en la estructura más adelante).

Para referencia, aquí es el simple archivo .thor que estoy usando:

class Rubynu < Thor::Group 
    include Thor::Actions 

    argument :app_name 

    def self.source_root 
    File.dirname(__FILE__) 
    end 

    def apply_directory_template 
    directory 'template', app_name 
    end 
end 

Gracias!

Respuesta

6

Si configura su archivo .thor así:

<my_thor_commands>/ 
    templates/ 
    bin/ 
    lib/ 
    ... 
    main.thor 

thor install <my_thor_command> buscará un archivo llamado main.thor, y luego instalarlo y cualquier otra cosa en <my_thor_command>. Después de eso, usted puede confiar en:

def self.source_root 
    File.dirname(__FILE__) 
end 

que le dará la ruta a la <my_thor_command>, ya que se ha instalado.

+0

Eso es exactamente lo que esperaba escuchar. Funciona perfectamente, gracias hombre! – Mitch

Cuestiones relacionadas