Criando geradores com Thor


Leia em 1 minuto

O Thor é uma excelente biblioteca para quem quer criar geradores. Possui diversos métodos para criar e copiar arquivos e diretórios, alterar arquivos, criar links simbólicos, ler arquivos remotos, dentre outras ações. Ele é especialmente bom quando você quer criar uma gem que irá gerar uma estrutura de arquivos e diretórios, como o Ruby on Rails faz.

A primeira coisa a fazer é criar nossa classe que será um gerador.

require 'thor'
require 'thor/group'

class MyGem::Generator < Thor::Group
  include Thor::Actions
  desc 'Generate a new filesystem structure'
end

A classe Thor::Group é perfeita para geradores, já que ela permite executar todas as ações de uma única vez. Para utilizar as ações do Thor, você só precisa incluir o módulo Thor::Actions.

Veja algumas das ações possíveis:

class MyGem::Generator < Thor::Group
  include Thor::Actions
  desc 'Generate a new filesystem structure'

  def self.source_root
    File.dirname(__FILE__) + '/../../templates'
  end

  def create_config_file
    copy_file 'config.yml', 'config/mygem.yml'
  end

  def create_git_files
    copy_file 'gitignore', '.gitignore'
    create_file 'images/.gitkeep'
    create_file 'text/.gitkeep'
  end

  def create_output_directory
    empty_directory 'output'
  end
end

Note que o método MyGem::Generator.source_root define o diretório onde nossos arquivos de template estão localizados.

Agora, para executar nosso gerador, você só precisa instanciar a classe MyGem::Generator.

generator = MyGem::Generator.new
generator.destination_root = '/some/path'
generator.invoke_all

Perceba que estamos definindo o diretório de destino. Este é um método opcional, que usa o diretório atual como valor padrão.

Para saber mais sobre o Thor, acesse a documentação. Para ver a lista completa de ações disponíveis, veja a documentação de Thor::Actions.