2012-02-21 39 views
12

Tôi có một tập lệnh Ruby nhỏ mà tôi đang viết để tự động hóa việc chuẩn bị môi trường phát triển trên các máy cục bộ. Bởi vì tôi không thể chắc chắn rằng thư viện rubyzip2 có mặt trên tất cả các máy, tôi có kịch bản cài đặt nó khi cần thiết.Sau khi cài đặt một viên đá quý trong một kịch bản, làm cách nào để tải đá quý?

Hiện tại, kịch bản của tôi là làm như sau: thực hiện

begin 
    require 'zip/zip' 
rescue LoadError 
    system("gem install rubyzip2") 
end 

Một khi viên ngọc đã được cài đặt, kịch bản tiếp tục; tuy nhiên, đá quý chưa được tải nên tất cả mã yêu cầu rubyzip2 sẽ tạm dừng quá trình thực hiện.

Làm cách nào để tải đá quý vào bộ nhớ để tập lệnh có thể tiếp tục chạy sau khi cài đặt?

Trả lời

6

Với bundler phiên bản cao hơn 1.10 (cập nhật chỉ cần chạy gem install bundler), bạn có thể sử dụng nó mới tính năng 'inline' như mô tả here.

require 'bundler/inline' 

gemfile(true) do 
    source 'https://rubygems.org' 
    gem 'catpix' 
end 

puts Catpix::VERSION 

Phương thức đầu tiên của phương pháp gemfile là liệu đá quý chưa được cài đặt trên hệ thống của người dùng phải được cài đặt.

1

Sử dụng Bundler bằng đơn đăng ký/thư viện của bạn. Điều này sẽ cho phép người dùng chạy bundle và tất cả các đá quý sẽ được tìm nạp và sẵn sàng để bạn sử dụng.

16

Thay vì thực hiện require 'thegem' và khắc phục lỗi, bạn nên kiểm tra tính khả dụng của đá quý trước đó, và sau đó, nếu cần, hãy cài đặt. Sau đó, bạn có thể yêu cầu nó.

Hãy xem this post for the gem availability

Hoặc this post

EDIT

Sau khi cài đặt, bạn cần phải xóa con đường đá quý nếu bạn không muốn tải lại kịch bản của bạn. Bạn có thể đạt được điều này với phương pháp này:

Gem.clear_paths 

Có đã trả lời câu hỏi here

Vì vậy, mã của bạn nên trông như thế này (ví dụ):

begin 
    gem "rubyzip2" 
rescue LoadError 
    system("gem install rubyzip2") 
    Gem.clear_paths 
end 

require 'zip/zip' 
1

Ok, do đó bạn có thể muốn để sử dụng Bundler và thiết lập Gemfile, sau đó có bundler thực hiện cài đặt gói, bundler sẽ tìm nạp tất cả các đá quý và cài đặt chúng nếu chưa được cài đặt và sau đó bạn có thể yêu cầu tất cả các đá quý trong đá quý tập tin. Đọc tài liệu trong liên kết để biết thêm thông tin.

Nhưng những gì bạn đang tìm kiếm để làm cụ thể trong câu hỏi của bạn là sử dụng từ khóa thử lại. Từ khóa này sẽ thử lại vòng lặp sau khi giải cứu được gọi.

Vì vậy, nếu bạn yêu cầu đá quý và nó không thành công và ngoại lệ lỗi tải được gọi. Khối Begin sẽ cứu, cuộc gọi hệ thống sẽ cài đặt gem, sau đó nó sẽ thử lại và yêu cầu gem. Chỉ cần thận trọng vì điều này có thể dẫn đến một vòng lặp vô hạn trừ khi bạn muốn thiết lập một điều kiện để có thể thử lại nó chỉ một lần.

begin 
    require 'zip/zip' 
rescue LoadError 
    system("gem install rubyzip2") 
    retry 
end 
+0

Điều này không hiệu quả vì lý do được đề cập bởi louiscoquio. – Yoni

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