Idealna struktura projektu Ruby

125

Jestem po omówieniu / wyjaśnieniu idealnej struktury projektu dla projektu rubinowego (bez szyn / merb / itp.). Zgaduję, że to wynika

app/
  bin/                  #Files for command-line execution
  lib/
    appname.rb
    appname/            #Classes and so on
  Rakefile              #Running tests
  README
  test,spec,features/   #Whichever means of testing you go for
  appname.gemspec       #If it's a gem

Czy coś się stało? Jakie części przegapiłem?

dylanfm
źródło
1
Sugerowałbym użycie generatora Yeoman
Nishutosh Sharma

Odpowiedzi:

88

Myślę, że to jest trafne. Domyślnie Rubygems doda katalog lib do ścieżki ładowania, ale możesz przesłać do niego dowolny katalog, używając zmiennej $:. to znaczy

$:.push File.expand_path(File.dirname(__FILE__) + '/../surfcompstuff')

Oznacza to, że kiedy powiesz, surfer.rbw tym require "surfer"katalogu , możesz gdziekolwiek i plik zostanie znaleziony.

Ponadto, zgodnie z konwencją, klasy i singletony otrzymują plik, a moduły otrzymują katalog. Na przykład, gdybyś miał LolCatzmoduł i LolCatz::Moarklasę, które wyglądałyby następująco:

lib/
  appname.rb
  lolcatz/
    moar.rb

Dlatego istnieje folder lib / appname, ponieważ większość bibliotek znajduje się w appnameprzestrzeni nazw.

Dodatkowo, jeśli spróbujesz uruchomić polecenie newgem --simple [projectname], które szybko wygeneruje dla Ciebie rusztowanie, zawierające tylko podstawowe elementy projektu Ruby (a co za tym idzie, Klejnot Ruby). Wiem, że istnieją inne narzędzia, które to robią, ale newgem jest dość powszechny. Zwykle pozbywam się pliku TODO i całego skryptu.

Chris Lloyd
źródło
1
Słodkie. Nie wiedziałem o Newgem. Moje projekty niezwiązane z Railsami często odzwierciedlały strukturę Railsów, ponieważ wydawało mi się to znajome. Dzięki za tę wskazówkę dotyczącą najlepszych praktyk.
berlin.ab
Innym ważnym plikiem może być „LICENCJA”
bluehavana,
2
Nie rozumiem zachowania, które libopisujesz, jako automatycznego dodawania do ścieżki ładowania. Czy to sprawa 1,9? Czy wymagana jest jakaś specjalna konfiguracja, aby to się stało?
Emily
5
Możesz także użyć pakietu do wygenerowania szablonu klejnotów. newgem nie był zaangażowany przez 9 miesięcy w momencie tego komentarza. Polecenie brzmibundle gem gem_name
Ninjaxor
10

Zobacz poniższy przykład z http://guides.rubygems.org/what-is-a-gem/

 % tree freewill
    freewill/
    ├── bin/
       └── freewill
    ├── lib/
       └── freewill.rb
    ├── test/
       └── test_freewill.rb
    ├── README
    ├── Rakefile
    └── freewill.gemspec
Sam Shiles
źródło
6

Próbuję naśladować strukturę projektu Railsów, ponieważ mój zespół, który zazwyczaj ma do czynienia z Railsami, zrozumie strukturę lepiej niż inna konfiguracja. Konwencja nad konfiguracją - wykrwawia się z Railsów.

berlin.ab
źródło
6
Jeśli jakiś zewnętrzny programista spojrzy na twój kod, zobaczy to tylko twoją osobistą konwencję. Myślę, że w przypadku średniego / dużego projektu użycie zestawu konwencji przeznaczonych dla zupełnie innego rodzaju projektu może nawet spowodować więcej zamieszania. Czy jest to aplikacja Rails, aplikacja Ruby? Dlaczego jest zaprojektowany jak aplikacja railsowa? „Lepiej skontaktuję się z programistą, zanim coś zepsuję…?” To doda trochę narzutu od samego początku ..
jj_,
Zgadzam się z @jj_. Wiem, że to trochę stare, ale myślę, że ważne jest, aby ludzie rozumieli, dlaczego istnieją konwencje wspólnotowe. Chodzi o to, abyś mógł kogoś wyciągnąć z ulicy, aby zobaczył Twój projekt i zaczął pękać. Chodzi o to, abyś mógł coś sprawdzić i zrozumieć. Uważam, że ważne jest, aby stosować konwencje domeny. Konwencja domeny zamiast konfiguracji projektu.
WattsInABox
2

Jeśli używasz bundlera, uruchomienie tej komendy bundle gem app_nameda ci taką samą strukturę katalogów.

Jeśli chcesz użyć rspec zamiast testów jednostkowych, możesz uruchomić to polecenie rspec --init (tylko upewnij się, że cd app_namenajpierw)

8bithero
źródło