Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

最初のRubyGemを抽出するためのガイド

GitHubコントリビューションチャートは灰色で表示されていますか?オープンソースプロジェクトを使用して作業することができます。ただし、最初から始める必要はありません。 便利なサイドプロジェクトを作成する最も簡単な方法は、既に作成しているアプリからプロジェクトを引き出すことです。 それがRailsの誕生です!

しかし、何を抽出するかをどうやって知るのでしょうか?そして、ワークフローを破壊することなく、どのようにしてそれを宝石に変えるのですか?

抽出するコードを見つけます。

アプリの奥深くに、そこに属していないコードがあります。 必要のないコード その仕事をするためにあなたのアプリ。どこにありますか?

時々、あなたはただ推測しなければならないでしょう。 しかし、同じいくつかの場所で抽出可能なコードを見つけることがよくあります:

  • 検証

    属性のカスタム検証を作成しましたか?それらは素晴らしい宝石を作ることができます。

  • Railsに加えた変更

    時々、Railsをいじって、テストでコミットフックを機能させたり、データベースでNULLに変換するための空白の属性を取得したりする必要があります。この種のロジックを宝石に移すたびに、より安定して理解しやすくなります。

  • 非アクティブレコードモデル

    メールアドレスや電話番号を解析して、独自のクラスに移動しましたか?これらのクラスは他のアプリで役立つことが多く、宝石に変えるのは非常に簡単です。

  • モックオブジェクトとカスタムアサーション

    カスタムアサーションを使用して、より読みやすいテストを作成できます。また、ライブラリまたはパターン用に作成された優れたカスタムアサーションがあれば、そのライブラリまたはパターンを使用する他のすべての人に役立ちます。

大きく考える必要はありません。私のお気に入りの宝石のいくつかはたった1つのファイルです!

それでも何を抽出するかを決定できない場合は、RubyToolboxのカテゴリリストを参照してインスピレーションを得てください。

コードをgemのようなディレクトリに配置します

どのコードをgemに変換するかがわかったら、そのコードを移動して、アプリ内のgemのような構造に適合させます。

Railsアプリでは、lib/を使用します gemステージングエリアとして 。 lib/ 独自の宝石に変わる可能性のあるコードを置く場所です。したがって、「json_api_client」というgemを作成している場合は、Railsアプリのlib/ ディレクトリは次のようになります:

...
my_rails_app/lib/json_api_client.rb
my_rails_app/lib/json_api_client/associations.rb
my_rails_app/lib/json_api_client/connection.rb
...

ほとんどのgemには、lib/の下にファイルがあります。 宝石にちなんで名付けられました(lib/json_api_client.rb )、およびそのgemにちなんで名付けられたディレクトリ内の一連のファイル(lib/json_api_client/の下のすべて )。したがって、同じ構造を取り、Railsアプリ内で一致させます。これにより、後でコードをgemに移動するのがはるかに簡単になります。

gemのレイアウトがどのように見えるかについて混乱している場合は、GitHubでお気に入りのgemのソースをいくつか見てください。 パターンをすぐに理解できます。

テストはどうですか?

以前はlib/をフォローしていました test/unit/内のの構造 :

...
my_rails_app/test/unit/json_api_client_test.rb
my_rails_app/test/unit/json_api_client/associations_test.rb
my_rails_app/test/unit/json_api_client/connection_test.rb
...

モデルとライブラリを同じフォルダに配置するのが少し面倒になったとしても、問題なく動作しました。

ただし、Railsはtest/models/を使用しています test/unit/の代わりに 。 そして、lib/を保存します test/models/内のテスト あまり意味がありません。このためのコンベンションはまだ決めていません。何か提案はありますか?

依存関係を解消する

コードがgem内に入ると、アプリに依存することはできなくなります。つまり、lib/に入れたコードを確認する必要があります 、アプリに固有のクラス、オブジェクト、または動作に依存する場所を探します。

これらの依存関係のいずれかが見つかった場合は、それらを解除する必要があります。依存関係を壊す(または注入する)方法については多くの優れた記述があるので、ここでは実際には説明しません。

宝石を作成する

bundle gemを使用しています 私の宝石を作成します。 具体的には、bulk_cache_fetcherというgemを作成します :

bundle gem bulk_cache_fetcher -t minitest

-t いくつかのテストヘルパーファイルとテストタスクをgemのRakefileに追加します 。

次に、.gemspecに入力するなど、ハウスキーピングを行う必要があります。 、READMEを記述します 、LICENSEを選択します 、すべてのもの。

そして、Railsアプリのlib/にすでにgemのコードがあるので フォルダの場合、そのコードとそのテストをlib/に移動するだけです。 およびtest/ 新しい宝石のフォルダ。

多くの場合、見逃したり忘れたりしたことや、アプリについて宝石の内部では真実ではないことを想定したコードがあります。 次に進む前に、宝石に移動したテストを実行し、すべてが合格することを確認してください。

アプリで新しい宝石を使用する

宝石ができたので、それを使いたいですよね?ただし、Railsアプリ内でgemへの変更をテストすると、すぐに煩わしくなります。次のことを行う必要があります:

  1. 宝石に変更を加える
  2. 宝石を作る
  3. システムからgemの痕跡をすべて削除するか、バージョンを更新します
  4. 宝石をインストールする
  5. サーバーを再起動します

これはかなりひどいです。 幸いなことに、バンドラーはあなたに簡単な方法を提供します。 ~/Source/bulk_cache_fetcherでgemを作成したとします。 。宝石の変更をテストしているときに、RailsアプリのGemfile内にこれを書き込むことができます :

Gemfile
gem "bulk_cache_fetcher", path: "~/Source/bulk_cache_fetcher"

次に、bundle installを実行します 、そして、そのコードがアプリのlib/にまだ存在しているかのように、gemに変更を加えることができます。 フォルダ。

最後に、path:を必ず削除してください。 コードをチェックインする前に! そのパスは他のシステムの適切な場所を指していない可能性があるため、マシン以外の場所では機能しない可能性があります。

構築、出荷、お楽しみください!

宝石の準備ができたら、それを世界に送ることができます。

したがって、RubyGemsのアカウントをまだ登録していない場合はサインアップし、変更をチェックインして、rake releaseを実行します。 。 おめでとうございます、あなたは宝石の作者になりました! そして、その宝石をgithubにプッシュすると、その日の素敵な緑色の正方形が表示されます。

抽出可能と思われる独自のアプリの部分はありますか?良い宝石になると思うものはありますか?それについて聞きたいのですが、下にコメントを残してください。

そして、トンを学びたい場合 Ruby Gemの作成、管理、保守の詳細については、BrandonHilkertのBuildaRubyGemを強くお勧めします 。彼の本が従うプロセスはこれに非常に近く、さらに多くのことをカバーしています。


  1. Rubyでの関数型プログラミング(完全ガイド)

    関数型プログラミングについて聞いたばかりで、いくつか質問があるかもしれません。 いいね… 関数型プログラミングとは正確には何ですか? オブジェクト指向プログラミングと比較してどうですか? Rubyで関数型プログラミングを使用する必要がありますか? これらの質問に答えて、これがどのように機能するかをよりよく理解できるようにします。 関数型プログラミングとは これは単なる流行や派手な言葉ではなく、長い間存在していた実際のプログラミングパラダイムですが、最近人気を取り戻しています。 そして、このパラダイムの背後にある基本的な考え方は、あなたが思っているよりも理解しやすいです。 関数型

  2. Rubyでの静的分析

    ソースコードを解析して、すべてのメソッド、それらが定義されている場所、およびそれらが取る引数を見つけたいとします。 どうすればこれができますか? あなたの最初のアイデアはそれのために正規表現を書くことかもしれません… しかし、もっと良い方法はありますか? はい! 静的分析 は、ソースコード自体から情報を抽出する必要がある場合に使用できる手法です。 これは、ソースコードをトークンに変換する(解析する)ことによって行われます。 さっそく始めましょう! パーサージェムの使用 Rubyには標準ライブラリで利用可能なパーサーがあります。名前はRipperです。出力を操作するのは難し