2012-02-21 3 views
12

Mam mały skrypt w języku Ruby, który piszę, aby zautomatyzować przygotowanie środowiska programistycznego na lokalnych komputerach. Ponieważ nie mogę być pewien, że biblioteka rubyzip2 jest obecna na wszystkich komputerach, instaluję ją w razie potrzeby.Po zainstalowaniu klejnotu w skrypcie, w jaki sposób mogę załadować klejnot?

Obecnie mój skrypt jest w następujący sposób:

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

Po zainstalowaniu gem, skrypt kontynuuje wykonywanie; jednak klej nie został załadowany, więc cały kod wymagający rubyzip2 zatrzymuje wykonanie.

Jak załadować klejnot do pamięci, aby skrypt mógł nadal działać po instalacji?

Odpowiedz

6

Z bundler wersja wyższa niż 1,10 (do aktualizacji wystarczy uruchomić gem install bundler) można wykorzystać nową funkcję „inline”, jak to opisano here.

require 'bundler/inline' 

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

puts Catpix::VERSION 

Pierwszy parametr gemfile metody jest to, czy kamienie szlachetne, które nie są już zainstalowane w systemie użytkownika powinien być zainstalowany.

1

Użyj aplikacji Bundler w swojej aplikacji/bibliotece. Umożliwi to użytkownikom uruchamianie bundle, a wszystkie klejnoty zostaną pobrane i będą gotowe do użycia.

16

Zamiast robić require 'thegem' i usuwać błędy, należy wcześniej sprawdzić dostępność klejnotów, a następnie, jeśli to konieczne, zainstalować. Po tym możesz go wymagać.

Spójrz na this post for the gem availability

Albo this post

EDIT

Po instalacji, trzeba usunąć ścieżki perełka Jeśli nie chcesz, aby przeładować skrypt. Można to osiągnąć za pomocą tej metody:

Gem.clear_paths 

Istnieją już odpowiedziało na pytania here

więc kod powinien wyglądać tak (na przykład):

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

require 'zip/zip' 
1

Ok, więc może warto Aby użyć Bundler i skonfigurować Gemfile, a następnie mają bundler zrobić instalację pakietu, bundler pobierze wszystkie klejnoty i zainstalować je, jeśli nie jest jeszcze zainstalowany, a następnie można wymagać wszystkich klejnotów w klejnocie plik. Przeczytaj dokumentację w linku, aby uzyskać więcej informacji.

Ale to, czego szukasz w konkretnym pytaniu, to użyć słowa kluczowego "spróbuj ponownie". To słowo kluczowe będzie ponawiać próbę wykonania pętli po wywołaniu akcji ratunkowej.

Więc jeśli potrzebujesz klejnotu, który zawodzi, a Wyjątek błędu ładowania jest wywoływany. Blok Begin zostanie uratowany, wywołanie systemowe zainstaluje klejnot, następnie spróbuje ponownie i wymaga klejnotu. Po prostu ostrożnie, ponieważ może to prowadzić do nieskończonej pętli, chyba że chcesz skonfigurować warunek, aby mógł spróbować ponownie tylko raz.

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

To nie działa, ponieważ powód wymieniany przez louiscoquio. – Yoni