2011-09-07 11 views
12

Tôi có ứng dụng Sinatra yêu cầu một loại đá quý khác mà tôi đang phát triển tại địa phương. Tôi đang gặp sự cố khi định cấu hình Bundler để sử dụng mã đá quý cục bộ của mình trong quá trình phát triển nhưng mã đá quý được bán trong sản xuất.Làm thế nào để Bundler/Gemfile được cấu hình để sử dụng các nguồn đá quý khác nhau trong quá trình phát triển?

Lý tưởng nhất là tôi có thể làm một cái gì đó như thế này, nhưng Bundler không cho phép bạn chỉ định các viên ngọc cùng hai lần:

# Doesn't work: 
group :development do 
    gem 'awesome', :path => "~/code/awesome" 
end 

group :production do 
    gem 'awesome', :path => "vendor/gems/awesome-0.0.1" 
end 

Trong khi chờ đợi tôi đã viện đến tay vendoring viên ngọc & cập nhật các nguồn đá quý trong Gemfile mỗi lần tôi triển khai, điều này khá phức tạp. công việc của tôi là thế này:

  1. Point để đá quý địa phương của tôi trong phát triển (gem 'awesome', :path => "~/code/awesome")
  2. Khi đã sẵn sàng để triển khai, đá quý giải nén vào vendor/gems
  3. Cập nhật Gemfile để trỏ đến vendored đá quý (gem 'awesome', :path => "vendor/gems/awesome-0.0.1")
  4. Run bundle install (để cập nhật Gemfile.lock)
  5. Mã triển khai
  6. Quay lại bước 1.

Thật là rắc rối! Tôi muốn làm một cái gì đó sạch hơn là chỉ cần viết các nhiệm vụ Rake để tự động hóa thiết lập hiện tại của tôi.

Quy trình làm việc tốt nhất cho kịch bản này là gì?

Trả lời

2

Rõ ràng, bạn có thể sử dụng Ruby thông thường trong Gemfile của bạn. Theo this article bạn có thể đặt biến môi trường (hoặc bất kỳ biến nào khác, tôi đã tìm thấy), để cho phép bạn chọn phiên bản của một viên ngọc bạn muốn sử dụng.

## based on an ENV variable 
if ENV['RACK_ENV'] == "development" 
    gem 'awesome', :path => "~/code/awesome" 
else 
    gem 'awesome', :path => "vendor/gems/awesome-0.0.1" 
end 

Có thể điều đó sẽ hiệu quả. Nếu bạn cần nhà cung cấp đá quý đang tiến hành của bạn, bạn có thể tạo một tập lệnh nhỏ bé sẽ thiết lập ENV, bán nó và đặt lại ENV. Eh?

+0

Tôi đã thử những gì bài viết này đề xuất trước đó, và đối với hầu hết các phần đó là OK. Vấn đề là khi tôi triển khai, Gemfile.lock đề cập đến gem cục bộ của tôi (xem hai mẫu mã cuối cùng của anh ta). Tôi đoán tôi có thể cài đặt đá quý sản xuất tại địa phương và sau đó triển khai, hoặc loại trừ Gemfile.lock từ git hoàn toàn ... nhưng tôi không chắc chắn một trong những tùy chọn đó là phương pháp tốt nhất. –

+0

Vâng tôi muốn thực hiện điều tương tự nhưng dường như không có cách nào để làm điều này. –

13

Có một tính năng mới cho phép để làm điều đó, bằng cách đơn giản specyfing local.gem_name tùy chọn cấu hình, như:

bundle config local.rack ~/path/to/local/rack 

chỉ này hoạt động nếu viên ngọc có một repo git và chi nhánh theo quy định tại các Gemfile.

Xem Thr docs Bundler để biết thêm chi tiết: http://bundler.io/v1.3/bundle_config.html

-3

Dưới đây là một gợi ý mà tôi đã không nhận được để làm việc đầy đủ (sử dụng cho một chủ đề Spree và tôi có vấn đề với một số stylesheets từ chủ đề):

group :production do 
     gem 'gemname', '~> 0.1.6', :git => 'git://github.com/foouser/gemname.git' 
end 

group :development do 
     gem 'gemnamedev', :path => '~/path/gemname' # use local version 
end 

Sao chép tệp gemname.gemspec của bạn và gọi nó là gemnamedev.gemspec và thay đổi s.name bên trong nó thành "gemnamedev".

+0

điều này sẽ không hoạt động. Bundler cung cấp cho bạn một lỗi nói rằng bạn không thể có hai đá quý từ các nguồn khác nhau – jakecraige