Estructura ideal del proyecto Ruby


125

Estoy buscando una descripción general / aclaración de la estructura ideal del proyecto para un proyecto de rubí (sin rieles / merb / etc.). Supongo que sigue

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

¿Tengo algo mal? ¿Qué partes me he perdido?


1
Sugeriría usar el generador Yeoman
Nishutosh Sharma

Respuestas:


88

Creo que eso es bastante acertado. De manera predeterminada, Rubygems agregará el directorio lib a la ruta de carga, pero puede insertar cualquier directorio que desee utilizando la variable $:. es decir

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

Eso significa que cuando haya surfer.rbdicho , en ese directorio, puede require "surfer"hacerlo en cualquier lugar y se encontrará el archivo.

Además, como convención, las clases y los singletons obtienen un archivo y los módulos obtienen un directorio. Por ejemplo, si tuviera el LolCatzmódulo y la LolCatz::Moarclase que se vería así:

lib/
  appname.rb
  lolcatz/
    moar.rb

Es por eso que hay una carpeta lib / appname porque la mayoría de las bibliotecas están en el appnameespacio de nombres.

Además, si intenta ejecutar el comando newgem --simple [projectname]que generará rápidamente un andamio para usted con lo esencial para un proyecto Ruby (y, por extensión, una Gema Ruby). Hay otras herramientas que hacen esto, lo sé, pero newgem es bastante común. Por lo general, me deshago del archivo TODO y todas las cosas del script.


1
dulce. No sabía sobre newgem. Mis proyectos que no son de Rails a menudo reflejan la estructura de Rails porque me resulta familiar. Gracias por este consejo de mejores prácticas.
berlin.ab

Otro archivo importante podría ser "LICENCIA"
bluehavana

2
No entiendo el comportamiento que describe al libagregarse automáticamente a la ruta de carga. ¿Es una cosa 1.9? ¿Se requiere alguna configuración especial para que suceda?
Emily el

55
También puede usar el paquete para generar una plantilla de gemas. newgem no se ha comprometido durante 9 meses al momento de este comentario. El comando esbundle gem gem_name
Ninjaxor

10

Vea el siguiente ejemplo de 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

Intento imitar la estructura del proyecto Rails porque mi equipo, que generalmente se ocupa de Rails, comprenderá la estructura mejor que otra configuración. Convención sobre configuración: sangrado de rieles.


66
Si algún desarrollador externo mira su código, lo que verá será solo su convención personal . Creo que para un proyecto mediano / grande, el uso de un conjunto de convenciones destinadas a un tipo de proyecto totalmente diferente podría incluso causar más confusión. ¿Es una aplicación de rieles, una aplicación de rubí? ¿Por qué está diseñado como una aplicación de rieles? "Será mejor que me ponga en contacto con el desarrollador antes de romper algo ..." Eso va a agregar un poco de sobrecarga desde el principio ..
jj_

Estoy de acuerdo con @jj_. Sé que esto es un poco viejo, pero creo que es importante que la gente entienda por qué hay convenciones comunitarias. Es para que puedas sacar a alguien de la calle, que pueda ver tu proyecto y ponerse manos a la obra. Es para que puedas buscar algo y entenderlo. Siento que es importante usar las convenciones del dominio. Convención de dominio sobre la configuración del proyecto.
WattsInABox

2

Si usa bundler, ejecutar este comando bundle gem app_namele dará la misma estructura de directorios.

Si desea utilizar rspec en lugar de pruebas unitarias, puede ejecutar este comando rspec --init (solo asegúrese de hacerlo cd app_nameprimero)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.