Struktur proyek Ruby yang ideal


125

Saya setelah ikhtisar / klarifikasi struktur proyek ideal untuk proyek ruby ​​(non-rails / merb / etc). Saya menduga ini mengikuti

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

Apakah ada yang salah? Bagian apa yang saya lewatkan?


1
Saya sarankan menggunakan generator Yeoman
Nishutosh Sharma

Jawaban:


88

Saya pikir itu cukup tepat. Secara default, Rubygems akan menambahkan direktori lib ke loadpath, tetapi Anda bisa mendorong direktori mana pun yang Anda inginkan ke sana menggunakan variabel $:. yaitu

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

Itu berarti ketika Anda telah mengatakan, surfer.rbdi dir itu, Anda dapat di require "surfer"mana saja dan file tersebut akan ditemukan.

Juga, sebagai konvensi, kelas dan lajang mendapatkan file dan modul mendapatkan direktori. Misalnya, jika Anda memiliki LolCatzmodul dan LolCatz::Moarkelas yang akan terlihat seperti:

lib/
  appname.rb
  lolcatz/
    moar.rb

Itulah sebabnya ada folder lib / appname karena sebagian besar perpustakaan ada di appnamenamespace.

Selain itu, jika Anda mencoba menjalankan perintah newgem --simple [projectname]yang akan dengan cepat menghasilkan perancah untuk Anda hanya dengan esensi telanjang untuk proyek Ruby (dan dengan ekstensi Permata Ruby). Ada alat lain yang melakukan ini, saya tahu, tetapi newgem cukup umum. Saya biasanya menyingkirkan file TODO dan semua hal skrip.


1
manis. Saya tidak tahu tentang pengantin baru. Proyek non-rel saya sering mencerminkan struktur Rails karena saya merasa sudah terbiasa. Terima kasih atas tip praktik terbaik ini.
berlin.ab

File penting lainnya mungkin "LICENSE"
bluehavana

2
Saya tidak mendapatkan perilaku yang Anda gambarkan dengan libditambahkan secara otomatis ke loadpath. Apakah ini sesuatu yang 1.9? Adakah konfigurasi khusus yang diperlukan untuk mewujudkannya?
Emily

5
Anda juga dapat menggunakan bundel untuk membuat templat permata. newgem belum berkomitmen selama 9 bulan pada saat komentar ini. Perintahnya adalahbundle gem gem_name
Ninjaxor

10

Lihat contoh berikut dari http://guides.rubygems.org/what-is-a-gem/

 % tree freewill
    freewill/
    ├── bin/
       └── freewill
    ├── lib/
       └── freewill.rb
    ├── test/
       └── test_freewill.rb
    ├── README
    ├── Rakefile
    └── freewill.gemspec

6

Saya berusaha meniru struktur proyek Rails karena tim saya, yang biasanya berurusan dengan Rails, akan memahami struktur lebih baik daripada konfigurasi lain. Convention over Configuration - perdarahan dari Rails.


6
Jika beberapa pengembang eksternal melihat kode Anda, apa yang akan dilihatnya hanyalah konvensi pribadi Anda . Saya pikir untuk proyek menengah / besar, menggunakan seperangkat konvensi yang dimaksudkan untuk jenis proyek yang sama sekali berbeda bahkan dapat menyebabkan lebih banyak kebingungan. Apakah ini aplikasi rel, aplikasi ruby? Mengapa ini dirancang seperti aplikasi rel? "Lebih baik aku menghubungi pengembang sebelum aku memecahkan sesuatu ...?" Itu akan menambahkan sedikit overhead langsung dari awal ..
jj_

Saya setuju dengan @jj_. Saya tahu ini agak tua, tetapi saya pikir penting bagi orang untuk memahami mengapa ada konvensi masyarakat. Ini agar Anda dapat menarik seseorang keluar dari jalan, mereka bisa melihat proyek Anda dan mendapatkan cracking. Ini agar Anda dapat mencari sesuatu dan memahaminya. Saya merasa penting untuk menggunakan konvensi domain. Konvensi domain lebih dari konfigurasi proyek.
WattsInABox

2

Jika Anda menggunakan bundler, menjalankan perintah ini bundle gem app_nameakan memberi Anda struktur direktori yang sama.

Jika Anda ingin menggunakan rspec alih-alih pengujian unit, Anda dapat menjalankan perintah ini rspec --init (Pastikan Anda cd app_nameterlebih dahulu)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.