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:
- CI (Integración continua)
- Revisión de código
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
- Edite my_lib.gemspec, agregue
gem.add_development_dependency ''rspec''
ygem.add_development_dependency ''rake''
cerca de la parte inferior. - Agregue
Bundler.setup
yrequire ''my_lib''
en la parte superior de spec / spec_helper.rb para asegurarse de que sus dependencias gemelas se carguen cuando ejecute sus especificaciones. - Agregar
require "rspec/core/rake_task"
ytask :default => :spec
en su Rakefile, de modo que elrake
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
- La guía de patrones de Rubygems (y la página de inicio ), de la respuesta de Matheus Moreira. Son realmente buenas referencias
- Cómo empiezo por Steve Klabnik
- Ejercicio 46: Esqueleto de un proyecto de Learn Ruby de Zed Shaw The Hard Way
- Nuevo video de Gema con Bundler en Railscasts
- docs