2012-03-03 10 views
83

Quiero crear un pequeño proyecto de rubí con 10-20 clases/archivos. Necesito algunas gemas y quiero usar rspec como marco de prueba.¿Cómo configurar un proyecto básico de rubí?

Es posible que desee construir una joya más adelante, pero eso no es seguro.

¿Hay algún tutorial o guía que me muestre cómo configurar la estructura básica de mi proyecto?

preguntas que tengo son:

  • Dónde puedo poner todos mis errores personalizados/Excepciones
  • ¿Hay algunas convenciones que hay para nombrar directorios como lib, bin, src, etc?
  • Dónde coloco los datos o documentos de prueba.
  • ¿Dónde necesito todos mis archivos para tener acceso a ellos en mi proyecto?

Sé que podría hacer de todo, desde cero, pero me gustaría obtener alguna orientación. Hay algunas buenas gemas que podría copiar, pero no estoy seguro de lo que realmente necesito y de lo que puedo eliminar.

Miré http://gembundler.com/, pero se detiene después de configurar el paquete.

+2

Pregunta relacionada: http://stackoverflow.com/questions/614309/ideal-ruby-project-structure –

Respuesta

129

Para obtener un buen comienzo, puede usar el comando bundle gem y 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 
  • código va en lib
  • especificaciones van en spec
  • datos de prueba o documentos van en spec/fixtures/
  • Exigir que todos los archivos de rubí en lib/my_lib.rb. Puede definir sus excepciones también en el archivo o en sus propios archivos, de acuerdo con sus propias preferencias.
  • archivos de origen C van en ext/my_lib
  • shell scripts y ejecutables van en bin

En caso de duda, basta con ver cómo otras gemas que están expuestos.


Más información:

se debe añadir rspec como una dependencia de desarrollo en su gemspec para facilitar las cosas para otros desarrolladores

  1. Editar my_lib.gemspec, añadiendo gem.add_development_dependency 'rspec' y gem.add_development_dependency 'rake' cerca El fondo.
  2. Agregue Bundler.setup y require 'my_lib' a la parte superior de spec/spec_helper.rb para asegurarse de que sus dependencias gemelas se carguen cuando ejecute sus especificaciones.
  3. Agregue require "rspec/core/rake_task" y task :default => :spec a su Rakefile, por lo que ejecutar rake ejecutará sus especificaciones.

Mientras que usted está trabajando en su más reciente creación, guard-rspec se puede ahorrar tiempo y molestias por automáticamente la publicación de sus especificaciones a medida que cambian los archivos, alertando a las especificaciones que fracasos.

~/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" 

Después de que esté satisfecho con su creación, empujarlo hasta 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 [email protected]:myusername/my_lib.git 
~/code/my_lib $ git push 

Luego, cuando esté listo para liberar su joya en Rubygems.org, ejecute rake release, que caminará a través de los pasos.

~/code/my_lib $ rake release 

Referencias adicionales

+1

puede usar '-b, [--bin = Generar un binario para su biblioteca.]' Con 'paquete gema' –

+0

También puede usar 'bundle gem -t' para hacer el equivalente de' rspec --init' a la vez. – pioto

+1

Cómo ejecutar el proyecto ruby. Construí un proyecto de ruby ​​basado en consola para el horario del maestro estudiante. ¿No estoy seguro de cómo ejecutarlo? – rAzOr

6

Estas son las convenciones más a menudo que he visto (suponiendo que el nombre de su proyecto es "foo"):

  • /lib/foo.rb - Define el espacio de nombres de alto nivel del proyecto y su versión; requiere archivos necesarios.
  • /lib/foo/- Contiene todas las clases para su proyecto, incluidas las clases relacionadas con errores.
  • /test/- Contiene pruebas para su proyecto.
  • /spec/- Contiene las especificaciones para su proyecto.
  • /bin/- Si su proyecto depende de archivos binarios (archivos JAR, etc.), generalmente entran allí.

Dentro de lib /, la convención generalmente es crear una carpeta para cada espacio de nombres secundario dentro de su espacio de nombres de nivel superior. Por ejemplo, la clase Foo :: Bar :: Baz generalmente se encuentra en /lib/foo/bar/baz.rb.

A algunas personas les gusta crear un archivo /lib/foo/version.rb solo para establecer la constante Foo :: VERSION, pero con mucha frecuencia he visto esto definido en el archivo /lib/foo.rb.

También, si está creando una joya, se necesitan los siguientes archivos:

  • /Rakefile - Define tareas rake (tales como las tareas para las pruebas, la construcción y empujando la gema).
  • /Gemfile: define la fuente de la gema (entre otras cosas posibles).
  • /foo.gemspec - Describe su gema y proporciona una lista de dependencias.
10

Hay some nice guides at rubygems.org que le dará a conocer a los convenios y la razonamiento detrás de algunos de ellos. En general, el Rubygems naming and directory conventions es seguido por la mayoría de los desarrolladores de Ruby.

Solo crearía clases de excepciones personalizadas si no pudiera encontrar ninguna clase en la biblioteca estándar que coincida con la descripción del error. Nido de su clase de error en la clase o módulo que se plantea:

class Parser::Error < RuntimeError; end 

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

Las pruebas unitarias van bien en /test, si está usando Test::Unit, o en /spec si está usando RSpec. Recomiendo lo último.

Bundler es una excelente manera de administrar su ruta de carga. Automáticamente configurará su entorno con solo las dependencias especificadas en el Gemfile y opcionalmente el gemspec. También le permite fácilmente require su código sin hacerlo una joya.

Sin embargo, dado que puede agrupar su código en una gema en el futuro, le recomiendo que investigue how to create gem specifications. Debe escribir su especificación manualmente. No use alguna herramienta para generarla automágicamente; en mi opinión, son enfoques de fuerza bruta que duplican información innecesariamente y causan estragos cuando se usan con control de fuente.

I created a gem que puede serle útil. Dado un archivo gemspec, define muchas tareas útiles Rake para trabajar con su gema, que incluyen tareas para construir, instalar y liberar su gema en el repositorio rubygems y git con etiquetado de versión automática. También proporciona una manera fácil de cargar su código en una sesión irb o pry.

# Rakefile 
require 'rookie' 

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

Existen algunas guías en Internet sobre cómo estructurar un proyecto de Ruby. Además, creo que la mejor manera de resolver esto es dirigiéndome a github y buscando algún famoso proyecto de Ruby, y verificando "sus" estructuras.

Además de los requisitos generales de la gema de rubí, que recomiendan las siguientes herramientas para un mejor flujo de trabajo:

  • editorconfig, ayuda a los desarrolladores definir y mantener estilos de codificación uniformes entre los diferentes editores y entornos de desarrollo.
  • rubocop, analizador de código estático para ruby, defac a linter en la comunidad de ruby.
  • guard, junto con un montón de complementos, puede ejecutar los comandos que desee cuando el código cambie, automáticamente.
  • rake, el controlador universal para diferentes tareas del proyecto, tales como:
    • package: construir el paquete joya
    • clean: limpia generada archivos
    • test: prueba de funcionamiento
  • yard, popular herramienta de documentación ruby.

Y además de todas las herramientas anteriores, their're algún servicio en línea para el proyecto de rubí:

e incluso se puede insignias genearate vía http://shields.io/ para su proyecto de código abierto.

Esa es mi experiencia, espero que ayude a alguien.

Cuestiones relacionadas