Ist es möglich, eine git-Verzweigungsabhängigkeit in mygem.gemspec zu haben?
Ich denke etwas Ähnliches wie das Folgende:
gem.add_runtime_dependency 'oauth2', :git => 'git@github.com:lgs/oauth2.git'
... aber es funktioniert nicht.
Ist es möglich, eine git-Verzweigungsabhängigkeit in mygem.gemspec zu haben?
Ich denke etwas Ähnliches wie das Folgende:
gem.add_runtime_dependency 'oauth2', :git => 'git@github.com:lgs/oauth2.git'
... aber es funktioniert nicht.
Antworten:
Dies ist nicht möglich und wird es wahrscheinlich auch nie sein, da es für RubyGems ziemlich schwierig wäre, Gem-Entwicklern die Möglichkeit zu geben, von Benutzern die Installation eines bestimmten Versionskontrollsystems für den Zugriff auf ein Gem zu verlangen. Edelsteine sollten in sich geschlossen sein und eine minimale Anzahl von Abhängigkeiten aufweisen, damit die Benutzer sie in einem möglichst breiten Anwendungsbereich verwenden können.
Wenn Sie dies für Ihre eigenen internen Projekte tun möchten, würde ich vorschlagen, Bundler zu verwenden, der dies recht gut unterstützt.
BEARBEITEN
Laut einem Kommentator ist dies nicht mehr wahr. Vorherige Informationen für den historischen Kontext aufbewahrt.
Das Duplizieren des Verweises auf einen Edelstein in Gemfile und .gemspec scheint nun eine Warnmeldung in Bundler auszulösen, sodass diese Antwort nicht mehr wahr zu sein scheint.
Veraltete Informationen
Dieser Artikel von Yehuda Katz hat ähnliche Verwirrung für mich beseitigt. Es heißt, dass es für die Verwendung nur in der Entwicklung am besten ist, das Git-Zeug in die Gem-Datei einzufügen, aber dieser Bundler verwendet weiterhin die Abhängigkeits- / Versionsinformationen aus der Gem-Spezifikation (scheint mir magisch, aber ich vertraue Yehuda).
gemspec
dort eingeben, es auch aus der Gemspec liest. Wenn Sie also ausführen bundle install
, gehe ich davon aus (aber noch nicht getestet), dass Bundler das in der Gemfile angegebene Gem installiert. Da Bundler es bereits installiert hat, steht dieser Edelstein für den Edelstein zur Verfügung require
, unabhängig davon, dass er nicht aus einem Edelstein-Repository stammt. Keine Magie, nur Bundler arbeitet wie gewohnt.
Ich habe nur versucht, dieses Problem auch herauszufinden. Und ich habe gerade die folgende Lösung gefunden (bei der ich nicht sicher bin, ob Sie Ihren Edelstein veröffentlichen oder das Recht haben, diesen Edelstein oauth2 weiterzugeben).
Führen Sie dies in Ihrem Edelstein aus, für den ein oauth2-Edelstein erforderlich ist.
git submodule add git@github.com:lgs/oauth2.git lib/oauth2
Wenn Sie einen anderen Zweig als den Standardzweig benötigen
cd lib/oauth2 && git checkout <branchname_or_ref>
cd .. && git add lib/oauth2
git commit -m "adding outh2 submodule"
Fügen Sie dies in Ihrer Gemspec über Ihrer gewünschten Versionszeile hinzu
$:.push File.expand_path('../lib/oauth2/lib', __FILE__)
Außerdem müssen Sie alle Laufzeitabhängigkeiten des oauth2-Edelsteins zu Ihrer gemspec hinzufügen. Ich habe noch keinen Weg gefunden, dies zu umgehen.
Dies ist, was ich getan habe, und es funktioniert für uns, weil unser Edelstein über Git benötigt wird, daher bin ich mir nicht sicher, ob dies für einen von Rubygems veröffentlichten Edelstein funktionieren würde.
gem 'my_gem', git: 'git@github.com:me/myrepo', submodules: true
Folgendes verwenden: in Ihrer Hostanwendung, wenn Sie von github installieren.
Ich fand eine Problemumgehung ziemlich einfach:
Angenommen, Sie befinden sich in einem Projekt P
und möchten das selbst erstellte Juwel verwenden, tools
das selbst ein Betriebssystem-Juwel verwendet oauth2
.
Wenn Sie einen Patch oauth2
in Ihrem Edelstein erstellt haben und diesen Patch in Ihrem Edelstein benötigen, tools
können Sie dieses Problem im Edelstein gemäß der akzeptierten Antwort nicht beheben .
Sie können jedoch die gewünschte Version in der Gemfile Ihres P
Projekts angeben. Dies ist die Version, die tools
zur Laufzeit verwendet wird:
gem 'oauth2', github: 'lgs/oauth2'