2009-07-10 12 views
3

Ich schreibe eine Nicht-Rails-Ruby-Anwendung (Keuchen!) Und möchte in der Lage sein, alle Gem Abhängigkeiten, die die Anwendung in einem Anbieter-Unterverzeichnis benötigt. Dies wäre vergleichbar mit der Funktionsweise von http://gemsonrails.rubyforge.org/ für Rails-Apps.Entpacken/Einfrieren Edelsteine ​​in eine Nicht-Rails-Ruby-App

Das Ziel hier ist, die Situation zu vermeiden, die mein Team derzeit erlebt, wenn eine neue Abhängigkeit hinzugefügt wird. Jeder Entwickler in meinem Team muss den Edelstein manuell installieren, und dann muss jeder die Test- und Staging- und Produktionsmaschine manuell aktualisieren. Wenn wir die Abhängigkeiten in die verteilte Anwendung selbst einfrieren können, dann wäre ein einfaches svn update (oder git pull für die Hipster in der Menge) alles was benötigt wird.

Antwort

4

UPDATE (New Solution):

Try Yehuda Katz neuen bundler gem. gem install bundler dann erstellen Sie eine Gemfile mit all Ihren Abhängigkeiten. Weitere Informationen finden Sie in der Dokumentation.

Alte Empfehlung:

Eine einfache Möglichkeit ist, einfach manuell die Edelsteine ​​in Ihrem vendor Verzeichnis entpacken und den lib Pfad der entpackten Edelsteine, um die Vorderseite des $ LOAD_PATH hinzuzufügen.

ein Juwel entpacken:

$ cd vendor/gems 
$ gem unpack active_support 
Unpacked gem: '/path/to/myproject/vendor/gems/activesupport-2.3.2' 

So stellen Sie sicher, dass Sie alle notwendigen Edelsteine ​​und deren Abhängigkeiten entpacken (die richtigen Versionen verwenden).

Um alle Edelsteine ​​unter Verkäufer/Edelsteine, um Ihre $ LOAD_PATH hinzufügen, versuchen Sie so etwas wie dies das Hinzufügen der Initialisierung Ihrer Anwendung:

Dir.glob(File.join("vendor", "gems", "*", "lib")).each do |lib| 
    $LOAD_PATH.unshift(File.expand_path(lib)) 
end 

Update: Sarah (in den Kommentaren) mich überzeugt, dass es auch sein könnte notwendig, um den GEM_PATH zu überschreiben. Hier ist eine Möglichkeit, das zu tun:

require 'rubygems' 
gem_paths = [File.expand_path(File.join("vendor", "gems")), Gem.default_dir] 
Gem.clear_paths 
Gem.send :set_paths, gem_paths.join(":") 

Eine weitere Option ist suchen in Rip (Rubys Intelligente Verpackungen) für Ihre Abhängigkeiten zu verwalten. Rip sieht wirklich süß aus, aber es ist immer noch neu.

+0

Müssen Sie nicht auch GEM_PATH verwalten? Andernfalls werden Edelsteinabhängigkeiten zur Laufzeit nicht korrekt aufgelöst. –

+0

Sarah, nicht wenn du annimmst, dass alle Edelstein-Abhängigkeiten bereits in Vendor/Gems sind. Grundsätzlich umgeht diese Taktik RubyGems insgesamt. Mit anderen Worten, es gibt keine Notwendigkeit, "Rubygems" zu verlangen. Ich gebe zu, dass es bei diesem Ansatz einige Löcher gibt (besonders bei binären Edelsteinen), aber es sollte einen langen Weg zurücklegen und die Dinge trotzdem einfach halten. –

+1

Ah, ok, also muss 'some_gem' funktionieren, weil some_gem/lib im $ LOAD_PATH steht. Das ist ein interessanter Ansatz. –

Verwandte Themen