Wie kann ich ein lokales Juwel in meiner Gemfile angeben?

359

Ich möchte, dass Bundler ein lokales Juwel lädt. Gibt es dafür eine Option? Oder muss ich den Gem-Ordner in das .bundle-Verzeichnis verschieben?

Picardo
quelle

Antworten:

541

Ich glaube, Sie können dies tun:

gem "foo", path: "/path/to/foo"
Jimmy Cuadra
quelle
10
Ein fest codierter Pfad ist für eine schnelle Hack-Sitzung in Ordnung, aber die lokale Edelsteinlösung von bloudermilk ist für Projekte unter Versionskontrolle effektiver. Sie können weiterhin beide Projekte einchecken - Edelstein und Projekt mit dem Edelstein -, sodass andere nicht die Edelsteinquelle auschecken oder dieselben Pfade verwenden müssen.
Mahemoff
4
Sie können dies etwas übersichtlicher gestalten, indem Sie einen .gitignored-Symlink zu Ihrem lokalen Juwel in Ihrem Projektverzeichnis verwenden. Auf diese Weise können Sie die Quellcodeverwaltung für beide Projekte separat verwenden, und andere können dasselbe tun, ohne eine identische Verzeichnisstruktur zu haben.
Dan
7
Etwas, auf das Sie achten sollten, könnte der Frühling sein. Wenn Sie einen lokalen Pfad für Ihren Edelstein verwenden, können Sie zwischengespeicherte Versionen Ihres lokalen Edelsteins feststellen, wie ich es in der Rails-Konsole getan habe. Wenn es nicht so aussieht, als würden Ihre lokalen Edelsteinänderungen aufgegriffen, versuchen Sie spring stopzu prüfen, ob dies tatsächlich das Problem ist.
Jason R
1
Das Hinzufügen des lokalen Gem-Pfads zu config / spring.rb scheint dabei zu helfen, Ihre lokalen Gem-Änderungen nach dem Neustart der Rails-Konsole / des Rails-Servers zu übernehmen.
Jason R
5
Viel
Cyzanfar
230

Zusätzlich zur Angabe des Pfads (wie von Jimmy erwähnt) können Sie Bundler auch zwingen, ein lokales Juwel für Ihre Umgebung zu verwenden, indem Sie nur die folgende Konfigurationsoption verwenden:

$ bundle config local.GEM_NAME /path/to/local/git/repository

Dies ist äußerst hilfreich, wenn Sie zwei Edelsteine ​​oder eine Edelstein- und eine Schienen-App nebeneinander entwickeln.

Beachten Sie jedoch, dass dies nur funktioniert, wenn Sie git bereits für Ihre Abhängigkeit verwenden, zum Beispiel:

# In Gemfile
gem 'rack', :github => 'rack/rack', :branch => 'master'

# In your terminal
$ bundle config local.rack ~/Work/git/rack

Wie in den Dokumenten zu sehen .

Blutmilch
quelle
Ich habe Probleme damit, weil ich BUNDLE_PATH(ein Paket für die Verteilung erstellen) verwende. Wenn Sie das tun, was Sie vorgeschlagen haben, oder Jimmys Antwort, wird nur a ausgeführt usingund nicht tatsächlich in meinem BUNDLE_PATHOrdner installiert . Ich konnte das nicht herausfinden, irgendeine Hilfe?
Automatico
2
Hinweis : Dies wird nicht mit einer Arbeit gemspec , pro Diskussion hier .
Davetapley
31
So deaktivieren Sie die lokale Überschreibung:bundle config --delete local.GEM_NAME
Alxndr
Ich musste die Versionsanweisung aus der Gem-Zeile entfernen, damit dies funktioniert.
Epigene
4
Wenn Sie in der Entwicklung einen anderen Zweig als die Produktion verwenden bundle config disable_local_branch_check truemöchten , müssen Sie auch festlegen, oder Bundler beschwert sich über den Zweig. Seien Sie jedoch vorsichtig, da die Überprüfungen verhindern sollen, dass falsche Commits eingehen Gemfile.lock. Docs hier: bundler.io/v1.12/git.html
Leo
33

Sie können auch mit git auf ein lokales Juwel verweisen, wenn Sie gerade daran arbeiten.

gem 'foo',
  :git => '/Path/to/local/git/repo',
  :branch => 'my-feature-branch'

Wenn es sich dann ändert, renne ich

bundle exec gem uninstall foo
bundle update foo

Ich bin mir jedoch nicht sicher, ob jeder diese beiden Schritte ausführen muss.

Rimian
quelle
5
Das ist großartig, aber nicht so praktisch, wenn Sie das Juwel aktiv entwickeln ... weil Sie jede Änderung vornehmen müssen, & bundle uninstall <gem> && bundle install für jede Änderung, die Sie in Ihrer App widerspiegeln möchten
Ramses
18

Führen Sie die folgenden Schritte aus, um das lokale Gem-Repository in einem Rails-Projekt zu verwenden:

  1. Überprüfen Sie, ob Ihr Gem-Ordner ein Git-Repository ist (der Befehl wird im Gem-Ordner ausgeführt).

    git rev-parse --is-inside-work-tree
  2. Repository-Pfad abrufen (der Befehl wird im Gem-Ordner ausgeführt)

    git rev-parse --show-toplevel
  3. Einrichten einer lokalen Überschreibung für die Schienenanwendung

    bundle config local.GEM_NAME /path/to/local/git/repository

    Wo GEM_NAMEist der Name Ihres Edelsteins und /path/to/local/git/repositoryist die Ausgabe des Befehls in Punkt2

  4. Fügen Sie in Ihrer Anwendung Gemfiledie folgende Zeile hinzu:

    gem 'GEM_NAME', :github => 'GEM_NAME/GEM_NAME', :branch => 'master'
  5. Laufen bundle installsollte ungefähr so ​​etwas geben:

    Using GEM_NAME (0.0.1) from git://github.com/GEM_NAME/GEM_NAME.git (at /path/to/local/git/repository) 

    Wo GEM_NAMEist der Name Ihres Edelsteins und /path/to/local/git/repositoryvon Punkt2

  6. Schließlich laufen bundle list, nicht gem listund Sie sollten so etwas sehen:

    GEM_NAME (0.0.1 5a68b88)

    Wo GEM_NAMEist der Name Ihres Edelsteins?


Einige wichtige Fälle, die ich beobachte, sind:

Rails 4.0.2  
ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-linux] 
Ubuntu 13.10  
RubyMine 6.0.3
  • Es scheint, RubyMinedass lokale Edelsteine ​​nicht als externe Bibliothek angezeigt werden. Weitere Informationen zum Fehler finden Sie hier und hier
  • Wenn ich etwas im lokalen Juwel ändere, sollte ich stop/startden Rails-Server verwenden, um in die Rails-Anwendung geladen zu werden
  • Wenn ich versiondas Juwel stopping/startingändere, gibt mir der Rails-Server einen Fehler. Um das Problem zu beheben, spezifiziere ich die Gem-Version in der Rails-Anwendung Gemfilewie folgt:

    gem 'GEM_NAME', '0.0.2', :github => 'GEM_NAME/GEM_NAME', :branch => 'master'
gotqn
quelle
0

Sie können Edelsteine ​​mit source: source: 'https://source.com', git repository (:github => 'git/url')und mit lokalem Pfad referenzieren :path => '.../path/gem_name'. In diesem Artikel
erfahren Sie mehr über Gemfiles und deren Verwendung .

Nesha Zoric
quelle
-4

Wenn Sie den Zweig auch wollen:

gem 'foo', path: "point/to/your/path", branch: "branch-name"
C Johnson
quelle
Dies funktioniert nicht, erzeugt einen Fehler: Only gems with a git source can specify a branch.
KenB