Estrutura ideal do projeto Ruby


125

Estou atrás de uma visão geral / esclarecimento da estrutura ideal do projeto para um projeto ruby ​​(non-rails / merb / etc). Eu estou supondo que segue

app/
  bin/                  #Files for command-line execution
  lib/
    appname.rb
    appname/            #Classes and so on
  Rakefile              #Running tests
  README
  test,spec,features/   #Whichever means of testing you go for
  appname.gemspec       #If it's a gem

Eu entendi algo errado? Que partes eu perdi?


1
Eu sugiro usar o gerador Yeoman
Nishutosh Sharma

Respostas:


88

Eu acho que é muito bonito no local. Por padrão, Rubygems adicionará o diretório lib ao caminho de carregamento, mas você pode enviar qualquer diretório que desejar para ele usando a variável $: ie

$:.push File.expand_path(File.dirname(__FILE__) + '/../surfcompstuff')

Isso significa que, quando você disser, surfer.rbnesse diretório, poderá em require "surfer"qualquer lugar e o arquivo será encontrado.

Além disso, como convenção, classes e singletons obtêm um arquivo e módulos obtêm um diretório. Por exemplo, se você tivesse o LolCatzmódulo e a LolCatz::Moarclasse com a seguinte aparência:

lib/
  appname.rb
  lolcatz/
    moar.rb

É por isso que existe uma pasta lib / appname, porque a maioria das bibliotecas está no appnameespaço para nome.

Além disso, se você tentar executar o comando newgem --simple [projectname]que gerará rapidamente um andaime para você, com apenas o essencial para um projeto Ruby (e, por extensão, uma Ruby Gem). Existem outras ferramentas que fazem isso, eu sei, mas o newgem é bastante comum. Normalmente, me livre do arquivo TODO e de todas as coisas de script.


1
doce. Eu não sabia sobre newgem. Meus projetos não-rails geralmente refletem a estrutura do Rails, porque eu a achei familiar. Obrigado por esta dica de boas práticas.
Berlin.ab 06/03/09

Outro arquivo importante pode ser "LICENÇA"
bluehavana

2
Eu não entendo o comportamento que você descreve ao libser automaticamente adicionado ao caminho de carregamento. É uma coisa de 1,9? Alguma configuração especial necessária para que isso aconteça?
15149 Emily

5
Você também pode usar o pacote configurável para gerar um modelo de gema. O newgem não está comprometido há 9 meses no momento deste comentário. O comando ébundle gem gem_name
Ninjaxor 19/03/2013

10

Veja o exemplo a seguir em http://guides.rubygems.org/what-is-a-gem/

 % tree freewill
    freewill/
    ├── bin/
       └── freewill
    ├── lib/
       └── freewill.rb
    ├── test/
       └── test_freewill.rb
    ├── README
    ├── Rakefile
    └── freewill.gemspec

6

Tento imitar a estrutura do projeto Rails porque minha equipe, que geralmente lida com o Rails, entenderá a estrutura melhor do que outra configuração. Convenção sobre configuração - sangrando pelo Rails.


6
Se algum desenvolvedor externo examinar seu código, o que ele verá será apenas sua convenção pessoal . Penso que, para um projeto de médio / grande porte, o uso de um conjunto de convenções destinadas a um tipo totalmente diferente de projeto pode até causar mais confusão. É um aplicativo de trilhos, um aplicativo de rubi? Por que ele foi projetado como um aplicativo de trilhos? "É melhor entrar em contato com o desenvolvedor antes de quebrar alguma coisa ...?" Isso vai adicionar um pouco de direito cima desde o início ..
jj_

Eu concordo com @jj_. Sei que isso é meio velho, mas acho importante que as pessoas entendam por que existem convenções comunitárias. É assim que você pode tirar alguém da rua, eles podem ver seu projeto e se quebrar. É assim que você pode procurar algo e entender. Eu sinto que é importante usar as convenções do domínio. Convenção de domínio sobre a configuração do projeto.
precisa saber é o seguinte

2

Se você usar o bundler, a execução desse comando bundle gem app_namefornecerá a mesma estrutura de diretório.

Se você quiser usar rspec em vez de testes de unidade, poderá executar este comando rspec --init (certifique-se cd app_nameprimeiro)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.