2016-08-06 10 views
1

Im Grunde versuche ich ein Juwel zu bauen, das irgendeine Art von Testfehlern durchführt, wenn bestimmte Abhängigkeiten veraltet sind. Im Testframework kann ich den Mist einfach aus Gem stopfen, so dass Gem.loaded_specs ("foo") die Spezifikation für das Gem foo zurückgibt. Nach was ich suche, ist eine Möglichkeit, eine Fix-Gemfile bereitzustellen und dann die Sperrdatei zu analysieren.Parsing eines Gemfile.lock mit Bundler

Wenn ich Gem.loaded_specs verwende, weiß es auf magische Weise, welches Gemfile verwendet werden soll, wie füttere ich es mit einer anderen gemfile (zB: mein Fixture)?

Ich weiß, dass jemand erwähnt „verwenden Bündler“ und das macht Sinn, aber in meinem Code für das Juwel Ich tue dies:

gem_here = Gem.loaded_specs[gem_name] 
gem_here.nil? ? :not_in_bundle : gem_here.version.to_s 

Ich brauche diese Arbeit mit meiner Befestigung Gemfile zu machen und nicht die aktuellen Projekte gemfile .

Macht das Sinn? Entschuldigung, wenn das vage ist.

Hinweis: Ich versuche dies nicht über die CLI. Ich würde gerne programmatische (dh: ruby ​​api) Methoden verwenden, wenn ich kann.

Edit:

ich mit dieser Art von Quelle werde jetzt:

gem_here = Bundler.load.specs.detect do |specs| 
    specs.name == gem_name 
end 
gem_here.nil? ? :not_in_bundle : gem_here.version.to_s 
+0

keine direkte Antwort, aber Sie finden können, was Sie brauchen in der Quelle von https://github.com/appfolio/gemsurance –

+0

@PhilipHallstrom danke! Das hat mir sehr geholfen. Ich werde die Antwort posten, wenn ich dazu komme aber bisher hat Bundler.load mich zu Bundler :: SharedHelpers.default_gemfile – apanzerj

+0

immer noch hingefahren. Ich muss vielleicht einfach die Datei mit Hilfe von Regexen analysieren und parsen. Keine großartige Lösung, aber der schnellste/direkteste Weg zum Parsen. :-( – apanzerj

Antwort

2

Es ist YAML, sondern versucht, die Bündler APIs zu verwenden, um die schweren Hebe (Auflösung von Abhängigkeiten) zu tun.

Bundler::LockfileParser.new(Bundler.read_file(Bundler.default_lockfile))

Dann Verwendung gemspecs und die Lock-Datei besuchen alle Laufzeit und/oder Entwicklung Abhängigkeiten. Runtime/Entwicklung deps für bestimmte Edelsteine ​​sind über eine zur Verfügung (derzeit nicht dokumentiert, muss contrib) RubyGems JSON API https://api.rubygems.org/api/v2/rubygems/rails/versions/5.0.0.1.json

Hinweis: Bündler 2.0 Gemfile.lock ->gems.locked

+0

Vielen Dank! Dies ist im Grunde, was ich gesucht habe, damit ich Tests gegen eine Gemfile von bestimmten Typ (nicht die für meinen eigenen Code) ausführen konnte – apanzerj

Verwandte Themen