Wie gebe ich lokale .gem-Dateien in meiner Gemfile an?


Antworten:


282

Dies ist nicht unbedingt eine Antwort auf Ihre Frage zur Installation von .gemPaketen. Sie können jedoch alle Arten von Speicherorten einzeln festlegen, indem Sie Ihre Gem-Datei bearbeiten .

Wenn Sie ein :pathAttribut angeben , wird das Juwel von diesem Pfad auf Ihrem lokalen Computer installiert.

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

Wenn Sie alternativ ein :gitAttribut angeben, wird das Juwel aus einem Remote-Git-Repository installiert.

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"

(Wie @JHurrah in seinem Kommentar erwähnt hat .)


Auch für einige Firewalls kann das Git-Protokoll ein Problem sein. In diesem Fall versuchen Siegem "foreman", :git => "https://github.com/pje/foreman.git"
kode

63

Anscheinend kann der Bundler keine .gem-Dateien sofort verwenden. Das Zeigen des Pfads: auf ein Verzeichnis mit .gem-Dateien funktioniert nicht. Einige Leute schlugen vor, einen lokalen Gem-Server (geminabox, stickler) für diesen Zweck einzurichten.

Was ich jedoch als viel einfacher empfunden habe, ist die Verwendung eines lokalen Gem- "Servers" aus dem Dateisystem: Legen Sie Ihre .gem-Dateien einfach in einem lokalen Verzeichnis ab und verwenden Sie dann "gem generate_index", um daraus ein Gem-Repository zu machen

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

Zeigen Sie abschließend mit dem Bundler auf diesen Speicherort, indem Sie Ihrem Gemfile die folgende Zeile hinzufügen

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

Wenn Sie die Edelsteine ​​im Repository aktualisieren, müssen Sie den Index neu generieren.


6
Vielen Dank! Außerdem brauchte ich einen dritten Schrägstrich, um "file: /// Absolute / Path / to / repo"
Anna

5
Wäre es nicht einfacher, "gem server" in der Befehlszeile auszuführen und der Quelle " localhost: 8808 " zu Ihrer Gemfile hinzuzufügen
Anna

6
Bonus-Tipp: Sie können die absolute Pfadanforderung umgehen, indem Sie File.expand_path wie folgt verwendensource "file://#{File.expand_path('.')}/chef-11.10.0.dev.2"
Leo Gallucci

1
@Nakilon Ich hatte das gleiche Problem, stellte dann aber fest, dass ich meinen Edelstein nicht in den gemsOrdner des repoOrdners gelegt hatte, sondern nur in den repoOrdner. Haben Sie einen gemsOrdner erstellt?
Asier

1
Super Trick! Hier ist eine kleine Ergänzung dafür. So überprüfen Sie, ob Edelsteine ​​jetzt lokal verfügbar sind: Edelsteinliste -r --clear-sources -s Datei: / repo
9лексей Лещук

46

Ich würde Ihr Juwel im Ordner des Anwendungsherstellers auspacken

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

Fügen Sie dann den Pfad in der Gem-Datei hinzu, um den entpackten Gem zu verknüpfen.

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

29

Standardmäßig überprüft Bundler zuerst Ihr System und verwendet die in Ihrer Gem-Datei angegebenen Quellen, wenn es keinen Edelstein findet.


Wahr. aber was ist, wenn ich es noch nicht installiert habe? (bei der Bereitstellung auf einem Server) Ich konnte Imlib2-Ruby-0.5.2 in keinem der abgeschlossenen
Quellbefehle finden

184
Sie können auf ein lokales Verzeichnis mit dem Juwel "gemname" verweisen ,: path => "~ / some / local / path"
JHurrah

5
Ich denke, dass: Pfad erfordert den Gem-Ordner mit Gemspec-Datei. Ich habe nur .gem-Dateien, die ich installieren möchte.
ddayan

1
Ok, also Cap Deploy bestanden, aber das Juwel wurde nicht installiert. "Keine solche Datei zum Laden - Vips": /
ddayan

4
Das stimmt definitiv nicht mehr, zumindest nicht mehr. Bundler betrachtet Ihre Systemedelsteine nicht und geht nur nach dem vor, was in der Gemfile enthalten ist. Einer der Gründe, warum es so schrecklich ist.
Bioneuralnet

6

Sie können Bundler zwingen, die von Ihnen bereitgestellten Gems mit "Bundle Package" und "Bundle Install --local" zu verwenden.

Auf Ihrer Entwicklungsmaschine:

bundle install

(Installiert die erforderlichen Edelsteine ​​und macht Gemfile.lock)

bundle package

(Zwischenspeichert die Edelsteine ​​im Anbieter / Cache)

Auf dem Server:

bundle install --local

(--local bedeutet "benutze die Edelsteine ​​von Vendor / Cache")


Was ist, wenn ich nichts auf dem Server installieren kann? In diesem Fall muss ich mit Rake bauen, aber der Server hat kein Juwel, das ich zum Bauen verwende. Ich habe aber kein Problem damit, die Abhängigkeiten einzuchecken.
Henrik

"bundle install" hat bei mir nicht funktioniert, wenn der Edelstein nicht in meiner vorhandenen Gemfile-Quelle enthalten war.
Anna

Entfernen Sie einfach die Gem-Datei vorübergehend aus bundle installder Gem- Datei, bevor Sie dies tun . Kopieren Sie anschließend die Gem-Datei in den Hersteller / Cache , fügen Sie den Gem wieder in die Gem-Datei ein und führen Sie bundle install --local
bert bruynooghe

1
bundle packageist auch jetzt, drei Jahre später, ein großartiger Vorschlag. Wenn Ihre Version von Bundler älter als 2.0 ist (zum jetzigen Zeitpunkt noch nicht veröffentlicht), müssen Sie diese verwenden, bundle package --allwenn Sie Edelsteine ​​mit pathoder gitAbhängigkeiten einschließen möchten . Sie erhalten jedoch eine hilfreiche Erinnerung, wenn solche Abhängigkeiten erkannt werden.
L2G

1
Zu Ihrer Information: Dies funktioniert möglicherweise nicht so gut, wie Sie es sich erhoffen, wenn Sie auf einer anderen Plattform als der Bereitstellung entwickeln (z. B. unter MacOS entwickeln, unter Linux bereitstellen). In den --localDokumenten heißt es: "Beachten Sie, dass ein geeignetes plattformspezifisches Juwel auf rubygems.org nicht gefunden wird, wenn es vorhanden ist."
Liam Dawson

1

Hinzufügen .gemzu vendor/cachescheint zu funktionieren. Keine Optionen erforderlich in Gemfile.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.