理想的なRubyプロジェクトの構造


125

Ruby(非Rails / Merbなど)プロジェクトの理想的なプロジェクト構造の概要/明確化を求めています。私はそれが続くと思います

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

何か間違ったことはありますか?どの部分を逃したのですか?


回答:


88

私はそれがかなりのスポットだと思います。デフォルトでは、Rubygemsはlibディレクトリをロードパスに追加しますが、$:変数を使用して任意のディレクトリをそのディレクトリにプッシュできます。すなわち

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

つまりsurfer.rb、そのディレクトリでは、require "surfer"どこにいてもファイルを見つけることができます。

また、慣例として、クラスとシングルトンはファイルを取得し、モジュールはディレクトリを取得します。たとえば、次のようなLolCatzモジュールとLolCatz::Moarクラスがあるとします。

lib/
  appname.rb
  lolcatz/
    moar.rb

ほとんどのライブラリはappname名前空間にあるため、lib / appnameフォルダーがあるのはこのためです。

さらに、コマンドnewgem --simple [projectname]を実行してみると、Rubyプロジェクト(およびRuby Gemの拡張により)の必要不可欠な要素だけが含まれた足場がすぐに生成されます。これを行うツールは他にもありますが、newgemはかなり一般的です。私は通常、TODOファイルとすべてのスクリプトを取り除きます。


1
甘い。私はnewgemについて知りませんでした。Rails以外のプロジェクトは、Rails構造をよく理解しているため、Rails構造をミラーリングしていることがよくあります。このベストプラクティスのヒントをありがとう。
berlin.ab 2009年

別の重要なファイルは「ライセンス」かもしれません
bluehavana

2
libロードパスに自動的に追加されるため、あなたが説明した動作が得られません。それは1.9のものですか?それを実現するために必要な特別な設定はありますか?
エミリー

5
bundleを使用して、gemテンプレートを生成することもできます。このコメントの時点では、newgemは9か月間コミットされていません。コマンドはbundle gem gem_name
Ninjaxor 2013年


6

私は通常Railsを扱う私のチームが他の構成よりも構造をよく理解するため、Railsプロジェクトの構造を模倣しようとします。構成に関する規約-Railsからの流出。


6
外部の開発者があなたのコードを見る場合、彼/彼女が見るものはあなたの個人的な慣習にすぎません。中規模/大規模のプロジェクトでは、まったく異なる種類のプロジェクト向けの一連の規則を使用すると、さらに混乱を招く可能性があると思います。Railsアプリ、Rubyアプリですか?なぜRailsアプリのように設計されているのですか?「何かを壊す前に、開発者に連絡した方がいい...」それは最初からオーバーヘッド右のビットを追加するために起こっているの...
jj_

@jj_に同意します。これは少し古いことだと思いますが、なぜコミュニティ規約があるのか​​を人々が理解することが重要だと思います。それは、誰かが通りから離れることができるようにするためのものであり、彼らはあなたのプロジェクトを見て、ひびが入る可能性があります。何かを調べて理解できるようにするためです。ドメインの規約を使用することが重要だと感じています。プロジェクト構成に対するドメイン規約。
WattsInABox 2014

2

bundlerを使用している場合、このコマンドbundle gem app_nameを実行すると同じディレクトリ構造が得られます。

単体テストの代わりにrspecを使用する場合は、このコマンドを実行できrspec --init ます(cd app_name最初に確認してください)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.