proyecto hacer ejemplo como basico ruby project-structure

ruby - ejemplo - como hacer un proyecto basico



¿Cómo configurar un proyecto básico de Ruby? (4)

Quiero crear un pequeño proyecto de ruby ​​con 10-20 clases / archivos. Necesito algunas gemas y quiero usar rspec como marco de prueba.

Quizás quiera construir una joya más tarde, 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?

Las preguntas que tengo son:

  • ¿Dónde pongo todos mis errores / excepciones personalizados?
  • ¿Existen algunas convenciones para nombrar directorios como lib, bin, src, etc.?
  • ¿Dónde pongo los datos o documentos de prueba?
  • ¿Dónde necesito todos mis archivos para poder acceder a ellos en mi proyecto?

Sé que podría hacer todo desde cero, pero me gustaría recibir 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 bundler.


Aquí están las convenciones que he visto con más frecuencia (suponiendo que el nombre de su proyecto sea "foo"):

  • /lib/foo.rb - Define el espacio de nombres de nivel superior 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.

Además, si está creando una gema, necesitará los siguientes archivos:

  • / Rakefile: define las tareas de rake (como tareas para probar, construir y empujar la gema).
  • / Gemfile: define la fuente de la gema (entre otras cosas posibles).
  • /foo.gemspec - Describe tu gema y proporciona una lista de dependencias.

Hay algunas buenas guías en rubygems.org que le presentarán las convenciones y el razonamiento detrás de algunas de ellas. En general, la mayoría de los desarrolladores de Ruby siguen los convenios de nombres y directorios de Rubygems .

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. Anida tu clase de error debajo de la clase o módulo que lo plantea:

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

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

http://gembundler.com/ es una excelente forma de administrar su ruta de carga. Configurará automáticamente su entorno con solo las dependencias especificadas en Gemfile y opcionalmente gemspec . También le permite solicitar fácilmente su código sin hacerlo una joya.

Sin embargo, dado que puede agrupar su código en una gema en el futuro, le recomiendo investigar cómo crear especificaciones de gemas . 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.

Creé una gema que puede serle útil. Dado un archivo gemspec , define muchas tareas de Rake útiles para trabajar con su gema, que incluyen tareas para construir, instalar y liberar su gema a rubygems y repositorio de 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!


Hay 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 gema de rubí, recomiendo las siguientes herramientas para un mejor flujo de trabajo:

  • editorconfig , ayuda a los desarrolladores a definir y mantener estilos de codificación coherentes entre diferentes editores e IDE.
  • rubocop , analizador de código estático para ruby, defac to linter en ruby ​​community.
  • 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 varias tareas del proyecto, tales como:
    • package : paquete de gemas de construcción
    • clean : limpiar archivos generados
    • test : prueba de funcionamiento
  • yard , herramienta popular de documentación de rubíes.

Y además de todas las herramientas anteriores, hay algún servicio en línea para el proyecto Ruby:

E incluso puedes generar insignias a través de http://shields.io/ para tu proyecto de código abierto.

Esa es mi experiencia, espero que ayude para alguien.


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

  • el código va en lib
  • especificaciones van en la spec
  • los datos o documentos de prueba entran en spec/fixtures/
  • Requiera todos sus archivos ruby ​​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.
  • Los archivos fuente C van en ext/my_lib
  • los scripts de shell y los ejecutables van en el bin

En caso de duda, solo mira cómo se disponen otras gemas.

Más información:

Debería agregar rspec como una dependencia de desarrollo en su gemspec para facilitar las cosas a otros desarrolladores

  1. Edite my_lib.gemspec, agregue gem.add_development_dependency ''rspec'' y gem.add_development_dependency ''rake'' cerca de la parte inferior.
  2. Agregue Bundler.setup y require ''my_lib'' en la parte superior de spec / spec_helper.rb para asegurarse de que sus dependencias gemelas se carguen cuando ejecute sus especificaciones.
  3. Agregar require "rspec/core/rake_task" y task :default => :spec en su Rakefile, de modo que el rake ejecución ejecutará sus especificaciones.

Mientras trabajas en tu creación más reciente, guard-rspec puede ahorrarte tiempo y problemas al ejecutar automáticamente tus especificaciones a medida que cambian los archivos, alertándote sobre fallas en las especificaciones.

~/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és contento con tu creación, empújala hacia 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 gema en Rubygems.org, ejecute el rake release , que lo guiará por los pasos.

~/code/my_lib $ rake release

Referencias adicionales