¿Cómo configuro un proyecto básico de Ruby?

103

Quiero crear un pequeño proyecto Ruby con 10 ~ 20 clases / archivos. Necesito algunas gemas y quiero usar RSpec como marco de prueba.

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

¿Hay algún instructivo 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 tener acceso a ellos en mi proyecto?

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

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

ayckoster
fuente

Respuestas:

156

Para empezar bien, puede utilizar el bundle gemcomando 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 entra lib
  • las especificaciones van en spec
  • los datos de prueba o los documentos entran spec/fixtures/
  • Requiere todos tus archivos ruby ​​en formato lib/my_lib.rb. También puede definir sus excepciones en ese archivo o en sus propios archivos, según sus preferencias.
  • Los archivos fuente de C entran ext/my_lib
  • los scripts de shell y los ejecutables van en bin

En caso de duda, mire cómo están distribuidas otras gemas.


Más información:

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

  1. Edite my_lib.gemspec, agregando gem.add_development_dependency 'rspec'y gem.add_development_dependency 'rake'cerca del final.
  2. Agregue Bundler.setupy require 'my_lib'al principio de spec / spec_helper.rb para asegurarse de que sus dependencias de gemas se carguen cuando ejecute sus especificaciones.
  3. Agregue require "rspec/core/rake_task"y task :default => :speca su Rakefile, para que la ejecución rakeejecute sus especificaciones.

Mientras trabaja en su creación más reciente, guard-rspec puede ahorrarle tiempo y molestias al ejecutar automáticamente sus especificaciones a medida que cambian los archivos, lo que le alerta 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"

Una vez que esté satisfecho con su creación, póngala en 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 git@github.com:myusername/my_lib.git
~/code/my_lib $ git push

Luego, cuando esté listo para lanzar su gema en Rubygems.org, ejecute rake release, que lo guiará a través de los pasos.

~/code/my_lib $ rake release

Referencias adicionales

John Douthat
fuente
1
puedes usar -b, [--bin=Generate a binary for your library.]con bundle gem.
Selman Ulug
También puede utilizar bundle gem <gem-name> -tpara hacer el equivalente de rspec --inittodos a la vez.
pioto
1
Cómo ejecutar el proyecto ruby. He creado un proyecto ruby ​​basado en consola para el horario de los estudiantes y profesores. ¿No estás seguro de cómo ejecutarlo?
RAZOR
11

Hay algunas guías interesantes 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 las convenciones de nomenclatura y directorio de Rubygems .

Solo crearía clases de excepción personalizadas si no pudiera encontrar ninguna clase en la biblioteca estándar que se ajuste a la descripción del error. Anida su clase de error debajo de la clase o módulo que la genera:

class Parser::Error < RuntimeError; end

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

Las pruebas unitarias entran en /test, si está usando Test::Unit, o en /specsi está usando RSpec. Recomiendo este último.

Bundleres una excelente manera de administrar su ruta de carga. Automáticamente configurará su entorno con solo las dependencias especificadas en Gemfiley, opcionalmente, el gemspec. También le permite requirecrear fácilmente su código sin convertirlo en una joya.

Sin embargo, dado que podría 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 generarlo automáticamente; 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 joya que puede resultarle útil. Dado un gemspecarchivo, se define muchos útiles Raketareas para trabajar con su gema, que incluyen tareas para la construcción, la instalación y la liberación de su joya a rubygemsy gitrepositorio con la versión de etiquetado automático. También proporciona una manera fácil de cargar su código en una sesión irbo pry.

# Rakefile
require 'rookie'

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

Estas son las convenciones que he visto con más frecuencia (asumiendo que el nombre de su proyecto es "foo"):

  • /lib/foo.rb: define el espacio de nombres de nivel superior del proyecto y su versión; requiere los archivos necesarios.
  • / lib / foo /: contiene todas las clases de su proyecto, incluidas las relacionadas con errores.
  • / test /: contiene pruebas para su proyecto.
  • / spec /: contiene las especificaciones de su proyecto.
  • / bin /: si su proyecto depende de archivos binarios (archivos JAR, etc.), por lo general van allí.

Dentro de lib /, la convención suele ser crear una carpeta para cada sub-espacio de nombres 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 muy a menudo 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 el origen de la gema (entre otras cosas posibles).
  • /foo.gemspec: describe su gema y proporciona una lista de dependencias.
usuario2398029
fuente
5

Hay algunas guías en Internet sobre cómo estructurar un proyecto Ruby. Además, creo que la mejor manera de resolver esto es dirigirse a github y buscar algún proyecto Ruby famoso, y verificar "sus" estructuras.

Además de los requisitos generales de gemas 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 consistentes entre diferentes editores e IDE.
  • rubocop , analizador de código estático para ruby, el defac para linter en la comunidad ruby.
  • guard , junto con un montón de complementos, puede ejecutar cualquier comando que desee cuando el código cambie, automáticamente.
  • rake , el controlador universal para diversas tareas del proyecto, como:
    • package: construir paquete de gemas
    • clean: limpiar archivos generados
    • test: ejecutar prueba
  • yarda , popular herramienta de documentación de ruby.

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

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

Esa es mi experiencia, espero que ayude a alguien.

Xiao Hanyu
fuente