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

158

Mam kilka plików klejnotów, które instaluję przez gem install xx.gem. Czy mogę powiedzieć Bundlerowi, aby ich używał? Czy muszę określić ścieżkę źródłową?

ddayan
źródło
Związane z: stackoverflow.com/questions/4487948/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

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 .)

pje
źródło
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.

Martin Thiede
źródło
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'
edap
źródło
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.

JHurrah
źródło
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”)

Henry Collingridge
źródło
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.

Victor Moroz
źródło
0

Wydaje mi się, że najłatwiej jest uruchomić własny serwer gemów przy użyciu geminabox

Zobacz te proste instrukcje .

Dave Sag
źródło