Come imposto un progetto Ruby di base?


103

Voglio creare un piccolo progetto Ruby con 10 ~ 20 classi / file. Ho bisogno di alcune gemme e voglio usare RSpec come framework di test.

Potrei voler costruire una gemma in seguito, ma non è certo.

C'è qualche procedura o guida che mi mostri come impostare la struttura di base del mio progetto?

Le domande che ho sono:

  • Dove metto tutti i miei errori / eccezioni personalizzati?
  • Esistono delle convenzioni per denominare directory come lib, bin, src ecc.?
  • Dove inserisco dati o documenti di prova?
  • Dove ho bisogno di tutti i miei file in modo da potervi accedere nel mio progetto?

So che potrei fare tutto da zero, ma vorrei una guida. Ci sono alcune belle gemme là fuori che potrei copiare, ma non sono sicuro di cosa ho veramente bisogno e cosa posso eliminare.

Ho guardato http://gembundler.com/ , ma si interrompe dopo aver configurato Bundler.


Risposte:


156

Per iniziare bene, puoi usare il bundle gemcomando e 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
  • il codice entra lib
  • le specifiche entrano spec
  • dati di prova o documenti vengono inseriti spec/fixtures/
  • Richiedi tutti i tuoi file ruby ​​in formato lib/my_lib.rb. Puoi definire le tue eccezioni anche in quel file o nei loro file, in base alle tue preferenze.
  • I file sorgente C vengono inseriti ext/my_lib
  • gli script di shell e gli eseguibili vengono inseriti bin

In caso di dubbio, guarda come sono disposte le altre gemme.


Ulteriori informazioni:

Dovresti aggiungere rspec come dipendenza di sviluppo nel tuo gemspec per rendere le cose più facili per altri sviluppatori

  1. Modifica my_lib.gemspec, aggiungendo gem.add_development_dependency 'rspec'e gem.add_development_dependency 'rake'vicino al fondo.
  2. Aggiungi Bundler.setupe require 'my_lib'all'inizio di spec / spec_helper.rb per assicurarti che le tue dipendenze gem vengano caricate quando esegui le specifiche.
  3. Aggiungi require "rspec/core/rake_task"e task :default => :specal tuo Rakefile, così l'esecuzione rakeeseguirà le tue specifiche.

Mentre stai lavorando alla tua creazione più recente, guard-rspec può farti risparmiare tempo e fatica eseguendo automaticamente le tue specifiche man mano che i file cambiano, avvisandoti in caso di errori delle specifiche.

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

Dopo che sei soddisfatto della tua creazione, spostalo su 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

Quindi, quando sei pronto per rilasciare la tua gemma su Rubygems.org, corri rake release, che ti guiderà attraverso i passaggi.

~/code/my_lib $ rake release

Ulteriori riferimenti


1
puoi usare -b, [--bin=Generate a binary for your library.]con bundle gem.
Selman Ulug

Puoi anche usare bundle gem <gem-name> -tper fare l'equivalente di rspec --inittutto in una volta.
pioto

1
Come eseguire il progetto Ruby. Ho creato un progetto Ruby basato su console per l'orario degli studenti degli insegnanti. Non sei sicuro di come eseguirlo ??
rAzOr

11

Ci sono alcune belle guide su rubygems.org che ti introdurranno alle convenzioni e al ragionamento alla base di alcune di esse. In generale, le convenzioni di denominazione e directory di Rubygem sono seguite dalla maggior parte degli sviluppatori Ruby.

Creerei classi di eccezioni personalizzate solo se non riuscissi a trovare nessuna classe nella libreria standard adatta alla descrizione dell'errore. Annidate la vostra classe di errore sotto la classe o il modulo che la genera:

class Parser::Error < RuntimeError; end

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

I test unitari entrano in /test, se stai usando Test::Unit, o in /specse stai usando RSpec. Raccomando quest'ultimo.

Bundlerè un ottimo modo per gestire il percorso di caricamento. Configurerà automaticamente il tuo ambiente con solo le dipendenze specificate in Gemfilee, facoltativamente, in gemspec. Ti consente anche di inserire facilmente il requiretuo codice senza renderlo un gioiello.

Tuttavia, poiché in futuro potresti raggruppare il tuo codice in una gemma, ti consiglio di indagare su come creare le specifiche della gemma . È necessario scrivere manualmente le specifiche. Non utilizzare alcuno strumento per generarlo automagicamente: sono, secondo me, approcci di forza bruta che duplicano inutilmente le informazioni e provocano il caos se usati con il controllo del codice sorgente.

Ho creato una gemma che potresti trovare utile. Dato un gemspecfile, definisce molte Rakeattività utili per lavorare con la tua gemma, che includono attività per costruire, installare e rilasciare la tua gemma rubygemse il gitrepository con la codifica automatica della versione. Fornisce inoltre un modo semplice per caricare il codice in una sessione irbo pry.

# Rakefile
require 'rookie'

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

6

Ecco le convenzioni che ho visto più spesso (supponendo che il nome del tuo progetto sia "foo"):

  • /lib/foo.rb - Definisce lo spazio dei nomi di primo livello del progetto e la sua versione; richiede i file necessari.
  • / lib / foo / - Contiene tutte le classi per il progetto, comprese le classi relative agli errori.
  • / test / - Contiene i test per il tuo progetto.
  • / spec / - Contiene le specifiche per il tuo progetto.
  • / bin / - Se il tuo progetto dipende dai binari (file JAR, ecc.), di solito entrano lì.

All'interno di lib /, la convenzione è di solito creare una cartella per ogni spazio dei nomi secondario all'interno dello spazio dei nomi di primo livello. Ad esempio, la classe Foo :: Bar :: Baz si trova solitamente in /lib/foo/bar/baz.rb.

Ad alcune persone piace creare un file /lib/foo/version.rb solo per impostare la costante Foo :: VERSION, ma molto spesso l'ho visto definito nel file /lib/foo.rb.

Inoltre, se stai creando una gemma, avrai bisogno dei seguenti file:

  • / Rakefile - Definisce le attività di rake (come le attività per testare, costruire e spingere la gemma).
  • / Gemfile - Definisce l'origine della gemma (tra le altre cose possibili).
  • /foo.gemspec - Descrive la tua gemma e fornisce un elenco di dipendenze.

5

Ci sono alcune guide su Internet su come strutturare un progetto Ruby. Inoltre, penso che il modo migliore per risolvere questo problema sia andare su GitHub e cercare qualche famoso progetto Ruby, e controllare le "loro" strutture.

Oltre ai requisiti generali delle gemme rubino, consiglio i seguenti strumenti per un flusso di lavoro migliore:

  • editorconfig , aiuta gli sviluppatori a definire e mantenere stili di codifica coerenti tra diversi editor e IDE.
  • rubocop , analizzatore di codice statico per ruby, il defac per linter nella comunità di ruby.
  • guard , insieme a un sacco di plugin, puoi eseguire qualsiasi comando come preferisci quando il codice cambia, automaticamente.
  • rake , il driver universale per varie attività di progetto, come:
    • package: crea un pacchetto gem
    • clean: pulisce i file generati
    • test: esegui test
  • yard , popolare strumento di documentazione di ruby.

E oltre a tutti gli strumenti di cui sopra, ci sono alcuni servizi online per il progetto ruby:

E puoi persino generare badge tramite http://shields.io/ per il tuo progetto open source.

Questa è la mia esperienza, spero che aiuti qualcuno.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.