Rails 4エンジン。 マウント可能なエンジンによる宝石の開発-サーバーログの読み取り



たまたま自分のRails gemを書きたいという抵抗できない欲求がありました。 第一に、学問的な関心-私はまだこれをしていません。第二に、問題が熟しています。その解決策は私にとって重要であり、いくつかのプロジェクトで使用したいと思います。



gem'ovの作成に関するHabréの記事がすでにありました( 時間 2、3



しかし、それらに基づいて、本格的な宝石を作成することは不可能です-それらは非常に時代遅れであり、原則として、平均的な公式文書の翻訳です。 そして最も重要なことは、それらは主にReadmeファイルとライセンスファイルの作成を説明し、実際のgem'a機能はHello Worldに伝わります。



問題



誰がどのようにそれを持っているのかわかりませんが、私は定期的に状況を抱えています-新しい機能をローカルでねじ込み、チェックしましたが、うまくいくようです。 cap deployを実行し、サーバーを見て、そこに
「申し訳ありませんが、何かがおかしくなりました。

あなたがアプリケーションの所有者である場合、詳細についてはログを確認してください。


それでは、サーバーにsshし、アプリケーションフォルダーにcdしてログを掘ります。 vimとemacsのファンが何と言っても、彼らの助けを借りてログで何かを見つけようとすることは別の教訓です。 tailfを実行し、手で見つけようとする方が簡単です。 rmateもありますが、どういうわけか定着しませんでした。



アイデア



tailコマンドの結果を指定されたパスのブラウザーに出力するgemを作成します。 log /フォルダー内のすべての.logファイルを監視できることをお勧めします



最後に何が起こったのかをすぐに示します。



必要なのはGemfileに登録することだけです

gem 'tail'
      
      





gemをインストールする

 bundle install
      
      





そして、それをアプリケーションの目的のポイントにマウント( config/routes.rb



)します。例えば

 mount Tail::Engine, at: "/tail"
      
      





その後、サーバーで

このページが表示されます:


ローカルでまったく同じように機能します。



アプリケーションがDeviseを使用する場合、最初にユーザー名とパスワードを入力する必要があります。



方法



通常、シナトラベースの宝石はそのような場合に使用されます(

個人的には、Railsを使用しており、sinatraは必要ないため、gemのポイントはわかりません。



そもそも、実際のアプリケーションを作成することは理にかなっています。その後、アプリケーションは別のgemになります。

私の場合、1つのコントローラーと1つのアクションで構成されます。



  class LogsController < ApplicationController before_filter :authenticate_user! if defined? Devise def index @web_logger ||= Log.instance @web_logger.n = params[:n] log_file_name = params[:file_name] || "#{Rails.env}.log" @files = @web_logger.tail(log_file_name) end end
      
      





簡単です。1つのシングルトンクラスを使用して、特定の.logファイルから特定の行数を返します。 Logクラス自体は重要ではありません。 ログを取得するまさにその方法を除いて:



 @files.include?(file_name) ? `tail -n #{@n} log/#{file_name}`.lines : []
      
      





Rubyはネイティブに、これらの文字(地獄はそれらが正しく呼ばれていることを知っている)の文字で囲むだけでOSコマンドを実行できます: `tail -n 40 production.log`



ファイルから最後の40行を返します。



結果の行はテーブルに配置され、CSSでわずかに洗練されて表示されます。



JavaScriptの1行(よく知られているフレームワーク-Vanilla.js )は、画面を最後の行までスクロールします。



 'window.scrollTo(0, document.body.scrollHeight);'
      
      







アプリケーションからgemを作成します。



Habréと尊敬されるRyan Batesの記事では、bundle gemコマンドによるgem'aの作成について説明されています。 最新のビデオは2011年11月にさかのぼります。

現在、 エンジンを介してRails gemを作成することをお勧めします。



エンジンは本質的に、元のアプリケーションとともに起動され、そのリソースを(相互に)使用する別のRailsアプリケーションです。 一般にシャム双生児。 または、好きなようにインプラントします。 親アプリケーションでは、新しいエンジン/プラグイン/ gemの接続ポイントが示され、このアドレスで新しいアプリケーションのすべての機能が利用可能になります。 説明は、詳細に興味のある指では原始的です-私は以下のリンクを示しました。



したがって、すべての種類の管理者、統計の宝石、アクティビティの監視などを実装することは非常に便利です。一般に、一方では比較的独立しており、メインアプリケーションとそれほど密接に関係しないものはすべて、Railsのすべての機能を利用します-モデル、コントローラー、ビューなど

それ以外の場合は、アプリケーションの初期化、移行、アクセス制御、セキュリティなどの順序に真剣に取り組む必要があります。 ゴロヴニャクはまだそこにいますが、不可能なことは何もありません。 誰が気にします- この記事から始めることができます



限られたRails機能でのみ機能するgem(たとえば、新しいヘルパーやコントローラーフィルターの作成)- プラグインを使用することをお勧めします



だから、テールと呼ばれる将来の宝石を作成します


 rails plugin new tail --mountable
      
      





--mountable



実際には、比較的単純なプラグインからマウント可能なエンジンの作成を分離します。



私の場合、私は書きました
rails plugin new tail --mountable --skip-active-record

私はデータベースでの作業を使用しないので。



非常に面白いチーム。 結果として作成されたフォルダー構造を見ると、通常のRailsアプリケーションとbundle gem



コマンドの結果が混在しています。



3つの主なポイント:



最初に


libフォルダーは将来のgemの基礎となり、その中で最も重要なファイルはengine.rb





 module Tail class Engine < ::Rails::Engine isolate_namespace Tail end end
      
      





gemと呼ばれるモジュールは、分離された名前空間で作成され、すべてのモデル、コントローラー、ビュー、およびクラスがラップされます。 つまり SomeClass



クラスの代わりに、ルートとパスと同じTail::SomeClass



あります。たとえば、 messages_path



代わりに、gem Webパーツにtail.messages_path



する必要がある場合は、 tail.messages_path



を記述します。

もちろん、これは、gem名とそれがマウントされるアプリケーションの競合を排除するために行われます。



app/



アプリケーション内のフォルダーの構造に注意してください。gemという名前の追加のサブフォルダーがそれぞれに追加され、必要なファイルが追加されます。 ファイルおよびヘルパーへのパスに影響します。

非表示のテキスト




第二


.gemspecファイル-個人情報の説明に加えて、他のgemへの依存関係のリストと、アセンブリに必要なファイルのリストが含まれています。



lib / version.rb-gem'aバージョン番号。 semver.orgで説明されている表記法を使用することをお勧めします。 簡単なことですが、バージョンを変更せずにgem'aを次に公開することは許可されていないため、注意が必要です。



そして3番目:


test / dummyフォルダー-これには既にマウントされている偽のアプリケーションが含まれています(/test/dummy/config/routes.rb)。 つまり、gemの動作を確認するには、このフォルダーに移動してrailsサーバーを起動します。 私のアプリケーションはlocalhost:3000 / tailにあります。 本当にとても快適です。

非表示のテキスト




宝石を埋める



 rails generate resource log
      
      





CRUDとビューの生成の必要がないため、scaffoldは使用しません。



既存のクラスから生成されたファイルにコードを転送します。 test/dummy



から偽のアプリケーションを実行して、すべてが機能することを確認する価値があります。



これからは、gemを別のアプリケーションに接続してデバッグできます。

 gem 'tail', path: '~/projects/tail'
      
      





または

 gem 'tail' , git: 'git://github.com/k2m30/tail.git' #   push  github
      
      





主なことは、バージョンファイルを更新し、変更のたびにgemを使用してアプリケーションでbundle update tail



を行うことを忘れないことです。



転記



rubygemsでgemを公開するには、そこに登録する必要があります。



その後、gemプロジェクトフォルダーに

gemをビルドするには

 rake build
      
      





ヘルパーチーム

 gem push
      
      





gemの作成には関与しません。rubygemsのクレデンシャルをリリースするよう指示する簡単な方法です。 一度だけ入力する必要があります。



実際に出版。

 rake release
      
      





その直後、gem rubygemsの検索に表示され、gemのインストールを通じて他の開発者が利用できるようになります。



合計



1.マウント可能なRails gemを作成するには、次の手順を実行します。

スケルトンを作成する

 rails plugin new tail --mountable
      
      





2.使い慣れたRailsアプリケーションで埋めます

マイナーな機能がありますが、それらは少数であり、 十分に説明されています。

test/dummy/



フォルダでrails server



を実行して何をしたかを見るのはとても簡単です



3. gemを作成します

 rake build
      
      





4. ruby​​gems.orgに登録し、ユーザー名とパスワードを指定します。

 gem push
      
      





リリースする

 rake release
      
      





それだけです、あなたはあなた自身の宝石の幸せな所有者です



ちなみに、発行時点では、rubygemsは私のgemがすでに151回ダウンロードされていると主張しています。 信じるのは難しくありませんが、いいです。



一般に、開発中、インストールと使用の容易さに重点が置かれました。 絶対に。 他のオプションもあります-たとえば、 gem webtailはログの内容をソケットに送信するため、ログの変更をリアルタイムで監視できます。 このような実装は、ファイアウォールとの追加のダンスが必要な場合にのみ適しています。 美しいけど。



私の記事、そして宝石自体が有用であり、誰かの時間と神経を節約することがわかってくれることを本当に願っています。






参照資料



http://wangjohn.github.io/railties/rails/gsoc/2013/07/10/introduction-to-railties.html

http://blog.thepete.net/2010/11/creating-and-publishing-your-first-ruby.html

ロシア語のレール

github.comの宝石自体

彼はrubygems.orgにいます



All Articles