基本的なRubyプロジェクトを設定するにはどうすればよいですか?


103

10〜20クラス/ファイルの小さなRubyプロジェクトを作りたいです。いくつかのgemが必要で、RSpecをテストフレームワークとして使用したい。

後で宝石を作りたいと思うかもしれませんが、それは確かではありません。

プロジェクトの基本構造を設定する方法を示すハウツーまたはガイドはありますか?

私が持っている質問は:

  • すべてのカスタムエラー/例外をどこに配置すればよいですか?
  • lib、bin、srcなどのディレクトリの命名規則はありますか?
  • テストデータまたはドキュメントはどこに配置しますか?
  • 私のプロジェクトでそれらにアクセスできるように、すべてのファイルをどこに要求しますか?

私はすべてを最初から行うことができることを知っていますが、ガイダンスをお願いします。コピーできる優れた宝石がいくつかありますが、本当に必要なものや削除できるものはわかりません。

私が見http://gembundler.com/が、それはバンドラーを設定した後に停止します。


回答:


156

良いスタートを切るには、bundle gemコマンドとを使用できます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
  • コードが入る lib
  • スペックが入る spec
  • テストデータまたはドキュメントが入る spec/fixtures/
  • すべてのルビファイルをに要求しますlib/my_lib.rb。自分の好みに応じて、例外をそのファイルでも独自のファイルでも定義できます。
  • Cソースファイルが入ります ext/my_lib
  • シェルスクリプトと実行可能ファイルが入ります bin

疑問がある場合は、他の宝石がどのように配置されているかを確認してください。


さらに詳しい情報:

他の開発者が作業しやすいように、gemspecの開発依存関係としてrspecを追加する必要があります

  1. my_lib.gemspecを編集して、下部に追加gem.add_development_dependency 'rspec'gem.add_development_dependency 'rake'ます。
  2. spec / spec_helper.rbの先頭にBundler.setuprequire 'my_lib'を追加して、スペックの実行時にgemの依存関係が確実に読み込まれるようにします。
  3. をRakefileに追加require "rspec/core/rake_task"task :default => :specて、rake実行するとスペックが実行されるようにします。

最新の作成に取り組んでいる間、guard-rspecを使用すると、ファイルの変更時にスペックを自動的に実行してスペックの失敗を警告することで、時間と手間を節約できます。

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

作成に満足したら、それを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

次に、Rubygems.orgでgemをリリースする準備ができたら、を実行rake releaseします。これにより、手順が説明されます。

~/code/my_lib $ rake release

その他の参考資料


1
あなたが使用することができます-b, [--bin=Generate a binary for your library.]bundle gem
セルマンウルグ

を使用bundle gem <gem-name> -tして、rspec --initすべての操作を一度に実行することもできます。
pioto 2015年

1
rubyプロジェクトの実行方法。私は生徒の先生の時間割のためにコンソールベースのルビープロジェクトを構築しました。それを実行する方法がわからない??
rAzOr 2017年

11

rubygems.orgには、規約とその背後にある理由を紹介する優れたガイドいくつかあります。一般に、Rubygemsの命名規則とディレクトリ規則は、ほとんどのRuby開発者が従います。

エラーの説明に適合する標準ライブラリでクラスを見つけることができなかった場合にのみ、カスタム例外クラスを作成します。エラークラスを、それを発生させるクラスまたはモジュールの下にネストします。

class Parser::Error < RuntimeError; end

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

単体テストは、を/test使用Test::Unitしている/spec場合は、またはを使用している場合はいずれかの状態になりますRSpec。後者をお勧めします。

Bundlerロードパスを管理する優れた方法です。それは、Gemfileとオプションでで指定された依存関係のみを使用して環境を自動的にセットアップしますgemspec。またrequire、宝石にすることなく、コードを簡単に作成できます。

ただし、将来的にコードをgemにバンドルする可能性があるため、gem仕様の作成方法を調査することをお勧めします。仕様は手動で記述する必要があります。自動的に生成するために何らかのツールを使用しないでください-私の意見では、これらは無力なアプローチであり、情報を不必要に複製し、ソース管理で使用すると大混乱を引き起こします。

私はあなたが役に立つかもしれない宝石を作成しました。与えられたgemspecファイルに、それは多くの有用な定義Rakeにあなたの宝石を、建物の設置及び解除するためのタスクが含まれ、あなたの宝石を扱うためのタスク、rubygemsおよびgit自動バージョンタギングでリポジトリを。また、irbまたはpryセッションでコードをロードする簡単な方法も提供します。

# Rakefile
require 'rookie'

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

6

以下は、私が最もよく目にする規則です(プロジェクトの名前が "foo"であると想定しています)。

  • /lib/foo.rb-プロジェクトのトップレベルの名前空間とそのバージョンを定義します。必要なファイルが必要です。
  • / lib / foo /-エラー関連のクラスを含む、プロジェクトのすべてのクラスが含まれています。
  • / test /-プロジェクトのテストが含まれています。
  • / spec /-プロジェクトの仕様が含まれています。
  • / bin /-プロジェクトがバイナリ(JARファイルなど)に依存している場合、通常はそこに格納されます。

lib /内では、通常、最上位のネームスペース内に各サブネームスペース用のフォルダーを作成するという慣例があります。たとえば、クラスFoo :: Bar :: Bazは通常、/ lib / foo / bar / baz.rbの下にあります。

Foo :: VERSION定数を設定するためだけに/lib/foo/version.rbファイルを作成したい人もいますが、/ lib / foo.rbファイルでこれが定義されているのをよく目にします。

また、gemを作成する場合は、次のファイルが必要です。

  • / Rakefile-レイクタスク(gemのテスト、ビルド、プッシュなど)を定義します。
  • / Gemfile-(他の可能なことの中でも)gemのソースを定義します。
  • /foo.gemspec-gemについて説明し、依存関係のリストを提供します。

5

Rubyプロジェクトの構成方法については、インターネット上にいくつかのガイドがあります。その上、これを解決する最良の方法は、githubに向かい、いくつかの有名なRubyプロジェクトを探して、「それらの」構造を確認することです。

一般的なruby gem要件に加えて、ワークフローを改善するために以下のツールをお勧めします。

  • editorconfigは、開発者がさまざまなエディターとIDEの間で一貫したコーディングスタイルを定義および維持するのに役立ちます。
  • rubocopは、Rubyの静的コードアナライザーです。
  • ガードと一連のプラグインを併用すると、コードが変更されたときに任意のコマンドを自動的に実行できます。
  • rake、以下のようなさまざまなプロジェクトタスク用のユニバーサルドライバー:
    • package:gemパッケージをビルドする
    • clean:生成されたファイルを消去する
    • test:テストを実行
  • ヤード、人気のあるルビー文書化ツール。

上記のツールのほかに、これらはrubyプロジェクトのオンラインサービスです。

また、オープンソースプロジェクトのバッジをhttp://shields.io/で生成することもできます。

それは私の経験です、それが誰かのために役立つことを願っています。

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