独自の gem/engine を開発する興味深い (しかし少し混乱する) 世界にまだ飛び込んでいます。
私はそれを自分の (プライベート) GitHub アカウントに正常にデプロイしましたが、gem は継続的に開発されているため、何度も何度もデプロイしたくないbundle update
ので、gem を要求するオプションを見つけました。次のようなパスを指定します。
gem 'my_gem', path: 'path/to/my/gem'
これは開発時にうまく機能しますrails s
(実行時に gem から変更されたファイルをリロードするようにさえ見えます [少なくともヘルパーとビューの場合、それを行うようです。コントローラーとモデルはまだ使用していませんが、これが当てはまることを願っています)。 、あまりにも]、ホストRailsアプリですぐにエンジンを使用しながらエンジンを開発するのに最適です)。
しかし、本番サーバーにデプロイするときは、github から gem を取得したいと思います。
gem 'my_gem', git: "git@github.com:my_company/my_gem"
悲しいことに、バンドラーは宝石を複数回必要とすることを許可していないため (それらが別々development/test
のproduction
グループにある場合でも)、次のようにしています:
if File.directory?('../my_gem')
gem 'my_gem', path: '../my_gem'
else
gem 'my_gem', git: "git@github.com:my_company/my_gem.git"
end
これは今のところうまく機能しているようです (ただし、Capistrano を使用した展開はまだテストしていません)。しかし、いくつかの疑問が残ります:
1)これは私の問題を解決する「正しい」方法ですか?次のようなもっと簡単な方法をまだ見つけていないのは少し奇妙に思えます。
gem 'my_gem', path: '../my_gem', git: "git@github.com:my_company/my_gem.git"
...バンドラーが最初にオプションを試すことを期待し:path
、それが利用できない場合は、:git
オプションを試します。しかし、私が見る限り、これを行うときは:git
オプションのみを使用します。
2) このような宝石を開発するのは良い習慣ですか? ホスト アプリからいくつかの機能をエンジンに抽出し、同時にこの機能を強化しています。そのため、ホスト アプリ内にエンジンの gem をロードし、ホスト アプリ内から、Rails サーバーを再起動することなく、ホスト アプリ内に反映される (ありがたいことに!) エンジンのコードを変更します。これはかなり「正しい」気がしますが、作成されたエンジン内にダミーの Rails アプリがあるため、ホスト アプリから厳密に分離されたエンジンを開発する必要があるかどうかは少しわかりません。これは少し哲学的な質問だと思いますが、誰かがそれについて意見を持っていて、長所と短所を投稿できますか?
3) 自分の gem を GitHub から自動的に最新バージョンに常に更新するように Capistrano に指示するにはどうすればよいですか?