2012-01-01 38 views
15

Vì vậy, tôi đang phát triển Sinatra cho cả windows và linux. Vấn đề là tôi đang sử dụng Thin thay vì Webrick và eventmachine cho các cửa sổ chỉ hoạt động với một phiên bản trước khi phát hành trong khi Linux sử dụng ổn định mới nhất. trong gemfile bạn tất nhiên không thể bao gồm các viên ngọc cùng với các phiên bản khác nhau như vậy:sử dụng trình bao để tải các phiên bản đá quý khác nhau cho các nền tảng khác nhau

gem "eventmachine", "~> 1.0.0.beta.4.1", :group => :development_win 
gem "eventmachine", group => :development_linux 
gem "thin 

tôi đã tự hỏi nếu có một cách để làm việc xung quanh này, có thể sử dụng một gemfile cho các cửa sổ và một gemfile cho linux, những gì lệnh sẽ được tải một hay khác. Có một cách để có thể trong git quản lý chỉ gemfile cho hai nền tảng khác nhau, có lẽ thông qua một chi nhánh cho chỉ các tập tin (không biết nếu đó là có thể từ những gì tôi đã đọc của git chi nhánh).

Trả lời

20

Bạn có thể làm điều đó như thế:

# Windows 
gem "eventmachine", "~> 1.0.0.beta.4.1", :platform => [:mswin, :mingw] 

# C Ruby (MRI) or Rubinius, but NOT Windows 
gem "eventmachine", :platform => :ruby 

danh sách đầy đủ của các nền tảng có sẵn:

ruby  C Ruby (MRI) or Rubinius, but NOT Windows 
ruby_18 ruby AND version 1.8 
ruby_19 ruby AND version 1.9 
ruby_20 ruby AND version 2.0 
mri  Same as ruby, but not Rubinius 
mri_18 mri AND version 1.8 
mri_19 mri AND version 1.9 
mri_20 mri AND version 2.0 
rbx  Same as ruby, but only Rubinius (not MRI) 
jruby  JRuby 
mswin  Windows 
mingw  Windows 'mingw32' platform (aka RubyInstaller) 
mingw_18 mingw AND version 1.8 
mingw_19 mingw AND version 1.9 
mingw_20 mingw AND version 2.0 

Bạn có thể tìm thêm thông tin trong Gemfile(5) man page here (xem ' Phần nền tảng ').

phương pháp khác là sử dụng RUBY_PLATFORM liên tục:

if RUBY_PLATFORM =~ /win32/ 
    gem "eventmachine", "~> 1.0.0.beta.4.1" 
else 
    gem "eventmachine" 
end 

Tôi đã không nhìn thấy danh sách đầy đủ các giá trị có sẵn cho RUBY_PLATFORM nhưng bạn có thể chạy

ruby -e 'puts RUBY_PLATFORM' 

trên cả hai nền tảng của bạn và thấy sự khác biệt .

+3

hmm, giải pháp đầu tiên ném cùng một lỗi về việc có hai đá quý được chỉ định trong gemfile. Câu lệnh có điều kiện hoạt động tốt. – indigo0086

+6

Và cách tiếp cận thứ hai là không hợp lệ, vì nó lưu trữ một hoặc một phiên bản đá quý khác vào 'Gemfile.lock'. Nó không thể lưu trữ cả hai. Vì vậy, nếu bạn chuẩn bị 'Gemfile.lock' trên một máy tính Win32 dev sau đó triển khai nó vào Linux, bạn sẽ nhận được cùng một phiên bản sai. Vì vậy, tôi vẫn đang tìm một giải pháp hợp lệ. –

+1

Cách tiếp cận nền tảng hoạt động tốt chỉ có các đá quý khác nhau được đặt tên cho các nền tảng khác nhau, thậm chí có thể cam kết Gemfile.lock và giữ cho nó ổn định (không giống như cách tiếp cận nếu khác) – prusswan

3

Bạn có thể sử dụng tùy chọn --gemfile để sử dụng các gemfiles khác nhau cho các nền tảng khác nhau. Xem tài liệu ở đây http://gembundler.com/man/bundle-config.1.html

+0

tôi giả: 1. bởi 'gemfiles khác nhau' bạn có ý nghĩa 'khác nhau' Gemfile's '(không phải' các tệp gem khác nhau '); và 2.bởi '--gemfile', bạn có nghĩa là thiết lập cấu hình' gemfile' trong biến môi trường 'BUNDLE_GEMFILE' hoặc trong tệp' .bundle/config' (trong thư mục chính của nhà phát triển). Do đó, Bundler có thể tạo ra một cách an toàn ví dụ: 'Gemfile-linux.lock' và' Gemfile-windows.lock'. – MarkDBlackwell

0

Bạn cần nhiều phiên bản (tất cả đều có cùng tên) của một viên ngọc. Do đó, hiện tại với Bundler, bạn cần nhiều tệp đồng thời phụ thuộc Bundler 'lock'. Điều này là có thể, nếu các nhà phát triển của bạn sử dụng cài đặt cấu hình gemfile của Bundler. Họ có thể thực hiện điều này:

  1. Bằng cách sử dụng biến môi trường BUNDLE_GEMFILE (trên dòng lệnh hoặc .bash_profile); hoặc
  2. (Có thể ít quan trọng hơn) trong số .bundle/config (trên toàn cầu, trong thư mục nhà của họ).

Như vậy, một cách an toàn, Bundler có thể tạo (và có lẽ tự động sử dụng sau này, với cùng cài đặt cấu hình), ví dụ: Gemfile-linux.lockGemfile-windows.lock.

Mặc dù phương pháp tiếp cận cơ bản này có vẻ khả thi, nhưng nó không phải là rất khô. Tuy nhiên, điều này cải thiện nếu, ví dụ, cả hai Gemfile-linuxGemfile-windows tự động kết hợp bất cứ báo cáo Gemfile họ chia sẻ điểm chung: ví dụ, nếu chúng bao gồm các tuyên bố:

::Kernel.eval(File.open('Gemfile-common','r'){|f| f.read},::Kernel.binding)

+0

Cảm ơn câu trả lời nhưng tôi đã không sử dụng Ruby trong nhiều năm, nhưng tôi chắc chắn câu trả lời trong năm 2012 là thỏa đáng. – indigo0086

Các vấn đề liên quan