Como faço para configurar um projeto básico de Ruby?

103

Eu quero criar um pequeno projeto Ruby com 10 ~ 20 classes / arquivos. Preciso de algumas joias e quero usar RSpec como framework de teste.

Eu posso querer construir uma joia mais tarde, mas isso não é certo.

Existe algum guia prático que me mostra como configurar a estrutura básica do meu projeto?

As perguntas que tenho são:

  • Onde coloco todos os meus erros / exceções personalizados?
  • Existem algumas convenções para nomear diretórios como lib, bin, src etc?
  • Onde coloco dados de teste ou documentos?
  • Onde eu exijo todos os meus arquivos para ter acesso a eles no meu projeto?

Eu sei que poderia fazer tudo do zero, mas gostaria de alguma orientação. Existem algumas joias boas por aí que eu poderia copiar, mas não tenho certeza do que realmente preciso e do que posso excluir.

Eu olhei em http://gembundler.com/ , mas ele para depois de configurar o Bundler.

Ayckoster
fonte

Respostas:

156

Para começar bem, você pode usar o bundle gemcomando e rspec --init.

~/code $ bundle gem my_lib
      create  my_lib/Gemfile
      create  my_lib/Rakefile
      create  my_lib/LICENSE.txt
      create  my_lib/README.md
      create  my_lib/.gitignore
      create  my_lib/my_lib.gemspec
      create  my_lib/lib/my_lib.rb
      create  my_lib/lib/my_lib/version.rb
Initializating git repo in /Users/john/code/my_lib
~/code $ cd my_lib/
~/code/my_lib $ git commit -m "Empty project"
~/code/my_lib $ rspec --init
The --configure option no longer needs any arguments, so true was ignored.
  create   spec/spec_helper.rb
  create   .rspec
  • o código entra lib
  • especificações vão em spec
  • dados de teste ou documentos entram spec/fixtures/
  • Exija todos os seus arquivos ruby ​​em lib/my_lib.rb. Você também pode definir suas exceções nesse arquivo ou em seus próprios arquivos - de acordo com sua preferência.
  • Arquivos de origem C vão para ext/my_lib
  • scripts shell e executáveis ​​vão em bin

Em caso de dúvida, veja como as outras joias estão dispostas.


Outras informações:

Você deve adicionar rspec como uma dependência de desenvolvimento em seu gemspec para tornar as coisas mais fáceis para outros desenvolvedores

  1. Edite my_lib.gemspec, adicionando gem.add_development_dependency 'rspec'e gem.add_development_dependency 'rake'próximo ao final.
  2. Adicione Bundler.setupe require 'my_lib'no topo de spec / spec_helper.rb para garantir que suas dependências de gem sejam carregadas quando você executar suas especificações.
  3. Adicione require "rspec/core/rake_task"e task :default => :specao seu Rakefile, para que a execução rakeexecute suas especificações.

Enquanto você está trabalhando em sua criação mais recente, guard-rspec pode economizar tempo e aborrecimento executando automaticamente suas especificações conforme os arquivos mudam, alertando-o sobre as falhas de especificação.

~/code/my_lib $ git add spec/spec_helper.rb
~/code/my_lib $ git commit -am "Add RSpec"
~/code/my_lib $ vim my_lib.gemspec # add guard development dependency
~/code/my_lib $ bundle
~/code/my_lib $ bundle exec guard init
~/code/my_lib $ vim Guardfile # Remove the sections below the top one
~/code/my_lib $ git add Guardfile
~/code/my_lib $ git commit -am "Add Guard"

Quando estiver satisfeito com sua criação, envie-o para o github

# create a github repository for your gem, then push it up
~/code/my_lib $ curl -u myusername https://api.github.com/user/repos -d '{"name":"my_lib"}' 
~/code/my_lib $ git remote add origin git@github.com:myusername/my_lib.git
~/code/my_lib $ git push

Então, quando você estiver pronto para lançar sua joia em Rubygems.org, execute rake release, que o guiará pelas etapas.

~/code/my_lib $ rake release

Referências adicionais

John Douthat
fonte
1
você pode usar -b, [--bin=Generate a binary for your library.]com bundle gem.
Selman Ulug
Você também pode usar bundle gem <gem-name> -tpara fazer o equivalente a rspec --inittudo de uma vez.
pioto
1
Como executar o projeto ruby. Eu construí um projeto ruby ​​baseado em console para o horário dos alunos e professores. Não tem certeza de como executá-lo ??
rAzOr
11

Existem alguns guias interessantes em rubygems.org que irão apresentá-lo às convenções e o raciocínio por trás de algumas delas. Em geral, as convenções de nomenclatura e diretório do Rubygems são seguidas pela maioria dos desenvolvedores Ruby.

Eu só criaria classes de exceção personalizadas se não conseguisse encontrar nenhuma classe na biblioteca padrão que se encaixasse na descrição do erro. Aninhe sua classe de erro sob a classe ou módulo que o gera:

class Parser::Error < RuntimeError; end

begin
  Parser.new(:invalid).parse!
rescue Parser::Error => e
  puts e.message
end

Os testes de unidade vão para /test, se você estiver usando Test::Unit, ou /specse estiver usando RSpec. Eu recomendo o último.

Bundleré uma ótima maneira de gerenciar seu caminho de carregamento. Ele configurará automaticamente seu ambiente apenas com as dependências especificadas no Gemfilee, opcionalmente, no gemspec. Ele também permite que você facilmente requireseu código sem torná-lo uma jóia.

No entanto, como você pode agrupar seu código em uma gema no futuro, recomendo investigar como criar especificações de gema . Você deve escrever sua especificação manualmente. Não use alguma ferramenta para gerá-la automaticamente - elas são, na minha opinião, abordagens de força bruta que duplicam informações desnecessariamente e causam estragos quando usadas com o controle de origem.

Eu criei uma joia que você pode achar útil. Dado um gemspecarquivo, ele define muitos úteis Raketarefas para trabalhar com a sua jóia, que incluem tarefas para a construção, instalação e liberando sua jóia para rubygemse gitrepositório com a versão de marcação automática. Ele também fornece uma maneira fácil de carregar seu código em uma sessão irbou pry.

# Rakefile
require 'rookie'

# Run `rake -T` for the complete task list
Rookie::Tasks.new('your_gem.gemspec').define_tasks!
Matheus Moreira
fonte
6

Aqui estão as convenções que tenho visto com mais frequência (presumindo que o nome do seu projeto seja "foo"):

  • /lib/foo.rb - Define o namespace de nível superior do projeto e sua versão; requer os arquivos necessários.
  • / lib / foo / - Contém todas as classes para seu projeto, incluindo classes relacionadas a erros.
  • / test / - Contém testes para seu projeto.
  • / spec / - Contém as especificações do seu projeto.
  • / bin / - Se o seu projeto depende de binários (arquivos JAR, etc.), eles geralmente vão lá.

Dentro de lib /, a convenção geralmente é criar uma pasta para cada sub-namespace dentro de seu namespace de nível superior. Por exemplo, a classe Foo :: Bar :: Baz é normalmente encontrada em /lib/foo/bar/baz.rb.

Algumas pessoas gostam de criar um arquivo /lib/foo/version.rb apenas para definir a constante Foo :: VERSION, mas muitas vezes eu vi isso definido no arquivo /lib/foo.rb.

Além disso, se estiver criando uma gema, você precisará dos seguintes arquivos:

  • / Rakefile - Define tarefas de rake (como tarefas de teste, construção e envio de joias).
  • / Gemfile - Define a origem da gema (entre outras coisas possíveis).
  • /foo.gemspec - Descreve sua gema e fornece uma lista de dependências.
user2398029
fonte
5

Existem alguns guias na internet sobre como estruturar um projeto Ruby. Além disso, acho que a melhor maneira de resolver isso é ir ao github e procurar por algum projeto Ruby famoso e verificar "suas" estruturas.

Além dos requisitos gerais de rubi gem, recomendo as seguintes ferramentas para um melhor fluxo de trabalho:

  • editorconfig , ajuda os desenvolvedores a definir e manter estilos de codificação consistentes entre diferentes editores e IDEs.
  • rubocop , analisador de código estático para rubi, defac to linter na comunidade ruby.
  • guard , junto com um monte de plugins, você pode executar qualquer comando que quiser quando o código muda, automaticamente.
  • rake , o driver universal para várias tarefas do projeto, como:
    • package: construir pacote de gemas
    • clean: limpar arquivos gerados
    • test: teste de corrida
  • jarda , ferramenta popular de documentação de rubi.

E além de todas as ferramentas acima, eles são alguns serviços online para o projeto Ruby:

E você pode até gerar crachás via http://shields.io/ para o seu projeto de código aberto.

Essa é a minha experiência, espero que ajude para alguém.

Xiao Hanyu
fonte