8

次のようなファイル構造を持つfooというgemがあるとしましょう。

foo.gemspec
test_foo.rb
lib/foo.rb
lib/foo/file1.rb
lib/foo/file2.rb

このファイルtest_foo.rbには、gemを試すために使用するコードが含まれています。次の行でgemのコードにアクセスします。

require './lib/foo'

次に、lib/foo.rbgemに必要な他のファイルに次のようにアクセスします。

require './lib/foo/file1'
require './lib/foo/file2'

はgemディレクトリのルートにあるため、ルートディレクトリからの完全なパスでtest_foo.rbファイルを要求する必要があります。lib/foo

これはすべて正常に機能し、で使用されているコードを変更することで、すぐにgemを試すことができますtest_foo.rb

requireただし、gemを作成する場合は、次のように呼び出しをに変更する必要があります。

require 'foo/file1'
require 'foo/file2'

それ以外の

require './lib/foo/file1'
require './lib/foo/file2'

これは、宝石を作成するたびに行うのが面倒です。

そこで、私はそれを試す別の方法を考えました。それはrake、gemのビルドとインストールを自動化するために使用することでした。次のようなものです。

task :build do
    `gem build foo.gemspec`
    `gem uninstall foo`
    `gem install ./foo-0.0.0.gem`
end

そして、コードに変更を加えて試してみたいと思ったら、を実行して、rake buildを呼び出します。require 'foo'test_foo.rb

しかし、それは非常に遅いプロセスであり、試してみる前にコードをビルドする必要がない言語であるルビーのポイントを打ち負かすように少し感じます。

だから、私の質問は、宝石を積極的に開発してテストするときに使用するのに最適なワークフローは何ですか?

4

3 に答える 3

8

requireさまざまな状況 (ローカル テスト、gem としての「運用」など) でコードを実行するために、ソース ファイル内のパスをいじる必要があり、エラーが発生しやすく、混乱を招きます。

「一度書けば、どこでも実行できる」ようにするためのいくつかのトリックがあります (Java の盗用で申し訳ありません)。これはあなたが目指すべきものでもあります。これらの標準的なプラクティスを使用することで、他の人があなたのコードを理解しやすくなり、何かが期待どおりに機能しない場合にあなたを助けやすくなります.

あなたのコードは既に共通の gem ディレクトリ レイアウトに従っています。そこでは何も変更する必要はありません。しかし、一般的な経験則として、require「ライブラリ」をロードするために を使用し、 require_relative(Ruby >1.9 を使用している場合) 作業中のソース ファイルに関連するソース ファイルをロードする必要があります。

1) ファイル test_foo.rb には次の行のみを含める必要があります。

require 'foo'

つまり、require パスから「./lib」の部分を省略します。gem のエントリーポイント (「require_path」) は、一般的に「lib」が選択されます。それについては後で詳しく説明します (3)。

2) 次に、foo.rb でrequire_relative(ここでも Ruby 1.9 を想定して) 相対ソース ファイルを取得します。

require_relative 'foo/file1'
require_relative 'foo/file2'

3) gem の require_path を lib に設定するには、gemspec ファイルを追加することをお勧めします。

コードをテストするには (たとえば、test_foo.rb を使用して)、いくつかのオプションがあります。

4) ruby​​ のオプションを指定して test_foo.rb を実行-Iし、ロード パスに lib/ ディレクトリを含めることができます。

ruby -I lib test_foo.rb

これは、追加のインクルードをコードに直接追加するよりも目立たなくなります。

5) Bundlerは、特に相互に依存する 2 つ以上の gem を一度に開発する場合に、「実際の」条件下でコード/gem をテストするためにコード/gem を管理するためのさらに優れた方法です。Bundler には、これらの gem をローカルで参照するオプションがあるため、開発中に機能をテストするために正式にデプロイする必要はありません。Bundler を使用するには、Gemfile を gem コードのルート ディレクトリに追加します。

6) 最後に、便宜上、開発プロセスの一般的なステップを Rakefile に統合し、rake を使用してプロセスを駆動することは理にかなっています。

私は自分のプロジェクトでこれらの手法をかなり使用しています。具体的な例を示すための参照用のリンクがいくつかあります。

1)テスト ファイルには「require 'foo'」が含まれているだけです。

2)「メイン」ファイルから「require_relative」を使用して、後続の部分を取り込みます

3) require_path を「lib」に設定した gemspec の例

5) Gemfile の例

6) Rakefile の例

もちろん、これらの手法をすべて使用する必要はありません。おそらく、手順 1 ~ 4 を使用しても問題ありませんが、プロジェクトが大きくなるにつれて、追加の作業が確実に報われます。

于 2012-06-09T13:40:12.373 に答える
2

$:.unshift File.expand_path("./lib", __FILE__)テストファイルを追加すると、使用できます

require 'foo/file1'

「./lib」の変更は、フォルダーの構造によって異なります

于 2012-06-09T10:03:25.787 に答える
1

これは数年遅すぎることはわかっていますが、gem の作成方法を学習しているときに検索結果にこの質問がたくさん出てきたので、追加しようと思いました。

Bundler gem ジェネレーター ( ) を使用して gem を作成すると、実際にインストールしなくても、ロードされた gemで始まるbundle gem my_gem_nameruby​​ 実行可能ファイルが生成されます。./bin/consoleirb

于 2016-07-13T06:52:15.583 に答える