このパッチ - http://seclists.org/oss-sec/2012/q2/504をアプリに適用する必要があったとき、すべてが始まりました。一見単純な作業が、*ss にとっては苦痛であることが判明しました。
次のオプションがあることを知っていました。
1.Monkeypatch;
2.Vendor rails;
3.fork Rails, apply the patch for 2.3 to the 2-3-stable
branch and use it in the Gemfile.
オプション #3 は、必要に応じて公式リポジトリにリベースできるため、私には最も魅力的に見えました。クリーンな方法で追加の変更を適用します。Rails の gem からの多数のソース ファイルでアプリ リポジトリをクロブする必要はありません (ベンダーが行うように)。2.3-stable ブランチはそれほど頻繁に更新されていないため、モンキー パッチがうまく機能している可能性がありますが、このようなパッチ用のクラスを開くのはあまり好きではありません。
だから私は#3に進みました。
1. I forked Rails;
2. I cloned my Rails repo locally;
3. I applied the 2.3 patch (http://seclists.org/oss-sec/2012/q2/att-504/2-3-sql-injection.patch)
using git am --signoff;
4. I pushed the changes.
5. I went to our app's Gemfile and added:
gem "rails","2.3.14", :git => "git://github.com/fullofcaffeine/rails.git", :branch => "2-3-stable"
6. Ran bundle install
バンドルのインストールが正常に終了したため、すべてがうまく見えました。Rails サーバーを起動しようとすると、"no such file to load --initializer"エラーが発生しました。
少しグーグルで調べた後、次の投稿を見つけました - How to use a branch in a fork of rails in a project with bundler。私は彼が言った通りに手動で gemspecs を作成し、それに応じて Gemfile を変更しました。バンドラーを実行しようとすると、驚くべきことに問題なく実行され、出力に次のように表示されました。
Using activerecord (2.3.14) from git://github.com/fullofcaffeine/rails.git (at 2-3-stable) Successfully built RubyGem
Name: activerecord
Version: 2.3.14
File: activerecord-2.3.14.gem
Using rails (2.3.14) from git://github.com/fullofcaffeine/rails.git (at 2-3-stable) Successfully built RubyGem
Name: rails
Version: 2.3.14
File: rails-2.3.14.gem
...
など、gemspec を作成した各 gem についてです。
ただし、Rails サーバーを実行しようとすると、次のようになります。
$ script/server
/Users/fullofcaffeine/.rvm/gems/ruby-1.8.7-p357@myapp/gems/bundler-1.0.21/lib/bundler/source.rb:572:in `load_spec_files': git://github.com/fullofcaffeine/rails.git (at 2-3-stable) is not checked out. Please run `bundle install` (Bundler::GitError)
from /Users/fullofcaffeine/.rvm/gems/ruby-1.8.7-p357@myapp/gems/bundler-1.0.21/lib/bundler/source.rb:385:in `local_specs'
from /Users/fullofcaffeine/.rvm/gems/ruby-1.8.7-p357@myapp/gems/bundler-1.0.21/lib/bundler/source.rb:555:in `specs'
from /Users/fullofcaffeine/.rvm/gems/ruby-1.8.7-p357@myapp/gems/bundler-1.0.21/lib/bundler/definition.rb:356:in `converge_locked_specs'
from /Users/fullofcaffeine/.rvm/gems/ruby-1.8.7-p357@myapp/gems/bundler-1.0.21/lib/bundler/definition.rb:345:in `each'
from /Users/fullofcaffeine/.rvm/gems/ruby-1.8.7-p357@myapp/gems/bundler-1.0.21/lib/bundler/definition.rb:345:in `converge_locked_specs'
from /Users/fullofcaffeine/.rvm/gems/ruby-1.8.7-p357@myapp/gems/bundler-1.0.21/lib/bundler/definition.rb:143:in `resolve'
from /Users/fullofcaffeine/.rvm/gems/ruby-1.8.7-p357@myapp/gems/bundler-1.0.21/lib/bundler/definition.rb:90:in `specs'
from /Users/fullofcaffeine/.rvm/gems/ruby-1.8.7-p357@myapp/gems/bundler-1.0.21/lib/bundler/definition.rb:135:in `specs_for'
from /Users/fullofcaffeine/.rvm/gems/ruby-1.8.7-p357@myapp/gems/bundler-1.0.21/lib/bundler/definition.rb:124:in `requested_specs'
from /Users/fullofcaffeine/.rvm/gems/ruby-1.8.7-p357@myapp/gems/bundler-1.0.21/lib/bundler/environment.rb:23:in `requested_specs'
from /Users/fullofcaffeine/.rvm/gems/ruby-1.8.7-p357@myapp/gems/bundler-1.0.21/lib/bundler/runtime.rb:11:in `setup'
from /Users/fullofcaffeine/.rvm/gems/ruby-1.8.7-p357@myapp/gems/bundler-1.0.21/lib/bundler.rb:110:in `setup'
from ./script/../config/../config/preinitializer.rb:16
from ./script/../config/boot.rb:28:in `load'
from ./script/../config/boot.rb:28:in `preinitialize'
from ./script/../config/boot.rb:10:in `boot!'
from ./script/../config/boot.rb:125
from script/server:3:in `require'
from script/server:3
また、Bundler が作成した gem (Bundler が gem を作成することについて上に貼り付けたメッセージ) を見つけようとしても、見つかりません。
どうすればいいのか本当にわかりません。そのような単純な作業が悪夢に変わりました。これに時間をかけすぎていることがわかった場合は、クラスにモンキーパッチを適用するだけかもしれません。
- したがって、実際の問題は、この「必要に応じて Rails にパッチを適用するかカスタマイズする必要がある」というシナリオに対する最も現実的な解決策は何かということです。
編集:私は今のところmonkeypatchingによって問題を解決しました.以下の私の最後のコメントを見てください.