2012-03-30 14 views
5

Ich schreibe ein Juwel, das eine C-Erweiterung enthält. Normalerweise, wenn ich einen Edelstein schreibe, befolge ich einen Prozess von TDD, wo ich eine fehlgeschlagene Spezifikation schreibe und dann an dem Code arbeite, bis er geht, etc etc ...Wie können Sie bei der Entwicklung eines Rubygems mit C-Erweiterungen lokal mit Rspec testen?

Mit meiner C-Erweiterung in "ext/mygem /mygem.c "und eine gültige extconf.rb, die in den" extensions "der gemspec konfiguriert ist, wie leite ich meine Spezifikationen und lasse meine C-Erweiterung immer noch laden? Welche Schritte muss ich ausführen, um den Code neu zu kompilieren, wenn ich den C-Code ändere?

Das ist wahrscheinlich eine blöde Frage, aber das Eingeben von 'bundle install' aus dem Development-Source-Tree meines Edelsteins erzeugt keine nativen Erweiterungen. Wenn ich manuell ruby ext/mygem/extconf.rb starte ich bekomme ein Makefile (im Stamm des gesamten Projekts) und wenn ich dann make ausführen, bekomme ich ein gemeinsames Objekt (wieder im Stamm des gesamten Projekts). Ich muss den falschen Workflow verfolgen, da ich verstehe, dass die .so unter lib/platziert werden soll. Es sei denn, ich sollte das nur während der Entwicklung manuell machen.

Antwort

4

Die Lösung, die ich mit am Ende ging, war Rake-Compiler, auf Github zu verwenden:

https://github.com/luislavena/rake-compiler

Sie fügen Sie einfach eine Rake Aufgabe, die Kompilierung (dokumentiert in der Readme), dann zu tun, machen Die 'Spezifikationsaufgabe (n) hängen von dieser Aufbauphase ab.

4

Sie wissen nicht, ob es der ‚richtige‘ Weg, aber die Art, wie ich dies in der Vergangenheit getan habe, ist

hinzufügen

$: << File.dirname(__FILE__) + '/../ext' 

Zu meinen spec Helfern

Und dann haben ein Rakefile, die für mich wie

baut So
require 'rspec/core/rake_task' 

RSpec::Core::RakeTask.new('spec') 
task :build do 
    Dir.chdir('ext') do 
    output = `ruby extconf.rb` 
    raise output unless $? == 0 
    output = `make` 
    raise output unless $? == 0 
    end 
end 

task :spec => :build 

sieht rake spec den c-Code jedes Zeit, mit der eingebauten Bibliothek ext /. Die Änderung des Ladepfads stellt sicher, dass diese Kopie geladen wird. Dies veranschaulicht dies github repo.

+1

Danke :) Ich kam gerade zurück, um zu posten, dass ich "rake-compile" auf github gefunden habe. Sie fügen es im Grunde als Entwicklungsabhängigkeit hinzu, und in Ihrem Rakefile können Sie ihm sagen, welche Erweiterungen zu erstellen sind. Es wird extconf.rb, make ausführen, dann kopieren Sie die lib und bereinigen. https://github.com/luislavena/rake-compiler – d11wtq

+0

+1 alle gleich, obwohl;) – d11wtq