Hãy tưởng tượng một ứng dụng Rack, khi khởi động, tạo ra các cá thể của một số ứng dụng Ruby khác và ánh xạ các tuyến đường đến các ứng dụng đó. Ứng dụng này có phụ thuộc Rack là 1.2.2.Tránh khai báo phụ thuộc Bundler thừa cho Rack
Bây giờ hãy tưởng tượng chúng tôi đang phát triển một ứng dụng phụ sẽ được chạy bởi ứng dụng này. Nó có sự phụ thuộc của Sinatra là 1.2.6 và sử dụng Bundler. Đó là gemfile là một cằn cỗi:
source "http://rubygems.org"
gem "sinatra", "1.2.6"
Thật không may, khi chúng ta bundle install
tiểu ứng dụng, Bundler, không có kiến thức về Rack 1.2.2 phụ thuộc của các ứng dụng phụ huynh, sẽ cài đặt phiên bản mới nhất của rack đó là tương thích với Sinatra 1.2.6: hiện tại 1.3.2. Gemfile.lock của chúng tôi sẽ là:
GEM
remote: http://rubygems.org/
specs:
rack (1.3.2)
sinatra (1.2.6)
rack (~> 1.1)
tilt (< 2.0, >= 1.2.2)
tilt (1.3.2)
PLATFORMS
ruby
DEPENDENCIES
sinatra (= 1.2.6)
Khi chúng tôi cố gắng để khởi động ứng dụng cha mẹ (mà bắt đầu sub-ứng dụng của chúng tôi), chúng tôi sẽ nhận được:
You have already activated rack 1.2.2, but your Gemfile requires rack 1.3.2. Consider using bundle exec. (Gem::LoadError)
cách chính xác là gì để xử lý tình huống này? Có, chúng tôi có thể yêu cầu một cách rõ ràng giá 1.2.2, nhưng chúng tôi thực sự có thể nêu rõ sự phụ thuộc của sự phụ thuộc. Tôi tưởng tượng rằng, lý tưởng, ứng dụng cha mẹ sẽ là một viên ngọc mà ứng dụng con của chúng ta sẽ yêu cầu, nhưng trong tình huống này, chúng ta không có khả năng làm như vậy.
Làm cách nào để bạn bắt đầu ứng dụng con của mình chính xác? 'bundle exec rackup' có thể là một ý tưởng tốt để gắn bó với các phụ thuộc bị khóa –
Tôi đoán cách" tốt nhất "là cập nhật ứng dụng mẹ của bạn để nó không yêu cầu phiên bản" cũ "của Rack. – henrikhodne