2011-08-05 14 views
9

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.

+1

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 –

+0

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

Trả lời

0

Cố gắng xóa Kệ 1.2.2 từ đá quý địa phương

1

quá trình "chính" của bạn nên sử dụng bundle exec để khởi động trình con, cũng giống như các thông báo lỗi khuyến cáo.

Điều đó sẽ buộc ứng dụng mới khởi chạy trong phạm vi bối cảnh bó của nó là riêngGemfile, chứ không phải ngữ cảnh toàn cầu. Do đó, ứng dụng mới sẽ được khởi chạy bằng Rack 1.3.2 hoặc mới hơn, không phải là Giá 1.2.2.