2012-03-30 10 views
5

Tôi đang viết một viên ngọc, bao gồm phần mở rộng C. Thông thường khi tôi viết một viên ngọc, tôi làm theo một quá trình TDD, nơi tôi sẽ viết một thông số thất bại và sau đó làm việc trên mã cho đến khi nó đi qua, v.v ...Khi phát triển một rubygem với phần mở rộng C, làm thế nào để bạn kiểm tra tại địa phương với Rspec?

Với phần mở rộng C của tôi trong "ext/mygem /mygem.c "và một extconf.rb hợp lệ được cấu hình trong" phần mở rộng "của gemspec, làm thế nào để chạy thông số kỹ thuật của tôi và vẫn có phần mở rộng C của tôi được nạp? Khi tôi thực hiện thay đổi đối với mã C, tôi cần thực hiện các bước nào để biên dịch lại mã?

Đây có lẽ là một câu hỏi ngu ngốc, nhưng gõ 'bundle install' từ bên trong cây nguồn phát triển của gem của tôi không xây dựng bất kỳ phần mở rộng gốc nào. Khi tôi chạy thủ công ruby ext/mygem/extconf.rb Tôi nhận được một Makefile (trong thư mục gốc của toàn bộ dự án) và khi tôi chạy make, tôi nhận được một đối tượng được chia sẻ (một lần nữa, trong thư mục gốc của toàn bộ dự án). Tôi phải tuân theo quy trình làm việc sai, vì tôi hiểu rằng .so được cho là được đặt dưới lib /. Trừ khi tôi chỉ phải làm điều đó bằng tay trong quá trình phát triển?

Trả lời

4

Các giải pháp tôi đã đi với cuối cùng là sử dụng cào-biên dịch, trên github:

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

Bạn chỉ cần thêm một nhiệm vụ cào để làm biên dịch (tài liệu trong README), sau đó làm nhiệm vụ 'spec' phụ thuộc vào giai đoạn xây dựng đó.

4

Không biết cho dù đó là cách 'đúng' nhưng cách tôi đã làm điều này trong quá khứ là

Thêm

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

Để helper spec của tôi

Và sau đó có một rakefile trông giống như

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 

Vì vậy, rake spec tạo mã c cho tôi mỗi thời gian, với thư viện được xây dựng hiện có trong ext /. Thay đổi cho đường dẫn tải đảm bảo rằng bản sao này được tải. Điều này github repo minh họa điều này.

+1

Cảm ơn :) Tôi vừa quay lại đây để đăng bài mà tôi đã tìm thấy "rake-biên dịch" trên github. Bạn về cơ bản thêm nó như là một phụ thuộc phát triển, sau đó trong Rakefile của bạn, bạn có thể cho nó biết những gì phần mở rộng để xây dựng. Nó sẽ chạy extconf.rb, tạo, sau đó sao chép lib và dọn dẹp. https://github.com/luislavena/rake-compiler – d11wtq

+0

+1 tất cả đều giống nhau;) – d11wtq