私は現在、次の 4 つの部分に分かれた Rails 3 プロジェクトに取り組んでいます。
- 公開ウェブサイト
- 管理ウェブサイト/バックエンド
- モデル
- サードパーティ データ アクセス用の API
モデルは 3 つの主要コンポーネント間で共有されるため、それらを 1 つのメイン プロジェクトに含めないようにしたいと考えています。ただし、各パーツはモデルにアクセスする必要がありますが、コードを繰り返したり、どこでも異なるバージョンを使用したりしたくありません。
現在、モデル コードは gem にあり、各プロジェクトの Gemfile では、次の行でそれらを参照しています。
gem "my_models", :path => "../my_models/"
ただし、同僚がシステムを評価するためにテストサーバーにデプロイするときは、外部リポジトリからモデルをプルする必要があるため、上記の行を次の行に置き換えます。
gem "my_models", :git => "git@private.repository.com:username/my_models.git"
これ自体はうまく機能しますが、「バージョン」に関してはかなり不格好です (つまり、テスト サーバーに変更をデプロイするたびにバージョンを上げる必要があります)。ローカルではなく git を使用するように行を切り替えます。ファイルを適切にプッシュしていることを確認してください。
以前は、共有の git サブモジュールを使用していましたが、これも同様に厄介でした。
私はすべてを 1 つの巨大プロジェクトに組み込むことは避けたいと考えています。なぜなら、これらは巨大で保守が困難になる傾向があるからです。また、可能であれば懸念事項を分離したいと考えています。他のコンポーネントに影響を与える可能性があります - 明らかにモデルが問題を引き起こす可能性がありますが、それは私が検討し理解しているリスクです.
このようなことになると、そこにいる人々は何を提案しますか? それとも、私はそれを完全に間違った方法で行っていますか?
いくつかの追加の背景:
このアプリは、「すべてを 1 つのプロジェクトにまとめる」というモデルに従った既存の Web サイトを書き直したものです。残念ながら、ここには 2 つの問題があります。
- アプリの開発が不十分でした - 私はこのプロジェクトを継承しましたが、最初にそれを手にしたとき、読み込み時間は 1 人のユーザーでページあたり約 2 分でした - これはその後短縮されましたが、まだ問題があります
- 現在、現在のサイトのキャパシティ制限に達しており、今後 6 か月でさらに多くの負荷をかける必要があると予想しています。ただし、「オールインワン」アプリでスケールアウトすると、スケールアウトにリソースが浪費されることになります。それを必要としないサイトのバックエンド。
基本的に、私が分離したいものは 2 つあります。フロント エンド (公開 Web サイトと API) とバック エンドです。ソフトウェア開発について私が知っていることは、これらすべてを組み合わせることは理想的なソリューションではないことを示しています (そして過去の歴史が示しています)。これら2つを分割することは、フロントエンドのパフォーマンスを確保するという点で良い動きだと思います)。
おそらく、これを別の角度から見る必要があります。モデルを各プロジェクトに保持し、プロジェクト間でモデルを共有する代わりに、機能領域ごとに機能のサブセットを削減します (つまり、バックエンドは誰が投稿を作成したかを知る必要がありますが、フロントエンドはそれをあまり気にしないので、モデルを読み込むときはそのロジックを省略してください)。