Jak określić lokalne pliki .gem w moim pliku Gemfile?


Odpowiedzi:


281

To nie jest wyłącznie odpowiedź na Twoje pytanie dotyczące instalowania .gempakietów, ale możesz określić wszystkie rodzaje lokalizacji na podstawie klejnotów, edytując plik Gemfile .

Określenie :pathatrybutu spowoduje zainstalowanie klejnotu z tej ścieżki na komputerze lokalnym.

gem "foreman", path: "/Users/pje/my_foreman_fork"

Alternatywnie, określenie :gitatrybutu spowoduje zainstalowanie klejnotu ze zdalnego repozytorium git.

gem "foreman", git: "git://github.com/pje/foreman.git"

# ...or at a specific SHA-1 ref
gem "foreman", git: "git://github.com/pje/foreman.git", ref: "bf648a070c"

# ...or branch
gem "foreman", git: "git://github.com/pje/foreman.git", branch: "jruby"

# ...or tag
gem "foreman", git: "git://github.com/pje/foreman.git", tag: "v0.45.0"

(Jak @JHurrah wspomniał w swoim komentarzu .)


Również w przypadku niektórych zapór firewall problem może stanowić protokół git. W takim przypadku spróbujgem "foreman", :git => "https://github.com/pje/foreman.git"
— kode

61

Wydaje się, że pakiet nie może używać plików .gem po wyjęciu z pudełka. Wskazanie: path do katalogu zawierającego pliki .gem nie działa. Niektórzy sugerowali, aby w tym celu skonfigurować lokalny serwer gem (geminabox, stickler).

Jednak okazało się, że znacznie prostsze jest użycie lokalnego „serwera” gemów z systemu plików: po prostu umieść swoje pliki .gem w lokalnym katalogu, a następnie użyj „gem generation_index”, aby uczynić go repozytorium Gem

mkdir repo
mkdir repo/gems
cp *.gem repo/gems
cd repo
gem generate_index

Na koniec wskaż pakiet do tej lokalizacji, dodając następujący wiersz do pliku Gemfile

source "file://path/to/repo"

Jeśli zaktualizujesz klejnoty w repozytorium, pamiętaj, aby ponownie wygenerować indeks.


6
Dzięki! Potrzebowałem też trzeciego ukośnika, aby wykonać „file: /// Absolute / Path / to / repo”
— Anna,

5
Czy nie byłoby łatwiej uruchomić "gem server" w wierszu poleceń i dodać źródło " localhost: 8808 " do swojego pliku Gemfile
— Anna

To naprawdę fajny Martin! Dzięki za udostępnienie, właśnie tego szukałem, ponieważ nie chciałem polegać na prowadzeniu gem serverani nie chciałem hostować całego projektu, tylko plik .gem.
— Leo Gallucci

6
Dodatkowa wskazówka: możesz obejść bezwzględny wymóg ścieżki, używając File.expand_path w ten sposóbsource "file://#{File.expand_path('.')}/chef-11.10.0.dev.2"
— Leo Gallucci,

Nie działa na mnie. Mac OS X. Bundler v1.11.2:Could not fetch specs from file://Users/nakilon/....../
— Nakilon

44

Rozpakowałbym twój klejnot w folderze dostawcy aplikacji

gem unpack your.gem --target /path_to_app/vendor/gems/

Następnie dodaj ścieżkę do Gemfile, aby połączyć rozpakowany klejnot.

gem 'your', '2.0.1', :path => 'vendor/gems/your'

29

Domyślnie Bundler najpierw sprawdzi twój system i jeśli nie może znaleźć klejnotu, użyje źródeł określonych w twoim Gemfile.


Prawdziwe. ale co, jeśli nie zainstalowałem go wcześniej? (podczas wdrażania na serwerze) Nie można znaleźć Imlib2-Ruby-0.5.2 w żadnym z poleceń
— source

184
możesz wskazać lokalny katalog z gemem "gemname",: path => "~ / some / local / path"
— JHurrah

5
Myślę, że: ścieżka wymaga folderu gem z plikiem gemspec. Mam tylko pliki .gem, które chcę zainstalować.
— ddayan

1
OK, więc wdrożenie limitu minęło, ale klejnot nie został zainstalowany. "Nie ma takiego pliku do załadowania - vips": /
— ddayan Kwietnia

4
To zdecydowanie nieprawda, przynajmniej już dłużej. Program Bundler nie sprawdza klejnotów systemowych i kieruje się tylko tym, co znajduje się w Gemfile. To jeden z powodów, dla których to takie straszne.
— bioneuralnet

6

Możesz zmusić pakera do korzystania z wdrażanych klejnotów za pomocą opcji „pakiet” i „instalacja pakietowa - lokalna”

Na komputerze deweloperskim:

bundle install

(Instaluje wymagane klejnoty i tworzy Gemfile.lock)

bundle package

(Przechowuje klejnoty u sprzedawcy / pamięci podręcznej)

Na serwerze:

bundle install --local

(--lokalne oznacza „użyj klejnotów od sprzedawcy / pamięci podręcznej”)


A jeśli nie mogę niczego zainstalować na serwerze? W tym przypadku muszę budować z rake, ale serwer nie ma klejnotu, którego używam do budowania; ale nie mam problemu ze sprawdzeniem zależności.
— Henrik

„Instalacja pakietowa” nie działała, jeśli klejnot nie był uwzględniony w moim istniejącym źródle Gemfile ”
— Anna

Po prostu usuń plik klejnotu tymczasowo z pliku klejnotu, zanim to zrobisz. bundle installNastępnie skopiuj plik klejnotu do sprzedawcy / pamięci podręcznej , dodaj klejnot z powrotem do pliku klejnotu i wykonaj bundle install --local
— bert bruynooghe

1
bundle packageto świetna sugestia, nawet teraz, trzy lata później. Jeśli twoja wersja Bundlera jest starsza niż 2.0 (jeszcze nie została wydana w chwili pisania tego tekstu), będziesz musiał użyć, bundle package --alljeśli chcesz dołączyć klejnoty z zależnościami pathlub git. Jeśli jednak wykryje takie zależności, wyświetli pomocne przypomnienie.
— L2G

1
Do Twojej wiadomości: to może nie działać tak dobrze, jak byś miał nadzieję, jeśli programujesz na innej platformie niż na której wdrażasz (np. Programowanie w systemie macOS, wdrażanie w systemie Linux). Zgodnie z --localdokumentacją: „Zauważ, że jeśli na rubygems.org istnieje odpowiedni klejnot specyficzny dla platformy, nie zostanie on znaleziony”.
— Liam Dawson

1

Dodawanie .gemdo vendor/cachewydaje się działać. Żadne opcje nie są wymagane w Gemfile.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.