2012-03-30 3 views
5

Sto scrivendo un gioiello, che include un'estensione C. Di solito quando scrivo una gemma, seguo un processo di TDD, dove scriverò una specifica fallita e poi lavoro sul codice finché non passa, ecc ecc ...Quando si sviluppa un rubygem con estensioni C, come si esegue il test locale con Rspec?

Con la mia estensione C in "ext/mygem /mygem.c "e un extconf.rb valido configurato nelle" estensioni "di gemspec, come posso eseguire le mie specifiche e avere ancora l'estensione C caricata? Quando apporto le modifiche al codice C, quali passi devo fare per ricompilare il codice?

Questa è probabilmente una domanda stupida, ma digitando 'bundle install' dall'interno dell'albero di sviluppo del mio gioiello non vengono create estensioni native. Quando eseguo manualmente ruby ext/mygem/extconf.rb ottengo un Makefile (nella radice dell'intero progetto) e quando eseguo quindi make, ottengo un oggetto condiviso (di nuovo, nella radice dell'intero progetto). Devo seguire il flusso di lavoro sbagliato, poiché capisco che il .so dovrebbe essere posto sotto lib /. A meno che non dovessi farlo a mano durante lo sviluppo?

risposta

4

La soluzione sono andato con, alla fine, è stato quello di utilizzare rake-compilatore, su github:

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

È sufficiente aggiungere un compito rastrello per fare la compilazione (documentata nel file README), poi fare i compiti "spec" dipendono da quella fase di costruzione.

4

Non so se è il modo 'giusto', ma il modo in cui ho fatto questo in passato è

Aggiungere

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

Con mia spec aiutante

e poi hanno un rakefile che assomiglia

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 

Così rake spec costruisce il codice C per me ogni tempo, con la libreria costruita esistente in ext /. La modifica al percorso di caricamento garantisce che questa copia sia caricata. Questo github repo illustra questo.

+1

Grazie :) Stavo tornando qui per postare che ho trovato "rake-compile" su github. Fondamentalmente lo aggiungi come dipendenza di sviluppo, quindi nel tuo Rakefile puoi dire quali estensioni creare. Eseguirà extconf.rb, make, quindi copierà lib e cleanup. https://github.com/luislavena/rake-compiler – d11wtq

+0

+1 lo stesso però;) – d11wtq