5

C拡張を含む宝石を書いています。通常、gem を作成するときは、TDD のプロセスに従います。このプロセスでは、失敗した仕様を作成し、合格するまでコードに取り組みます。

「ext/mygem/mygem.c」に C 拡張機能があり、有効な extconf.rb が gemspec の「拡張機能」に構成されている場合、C 拡張機能をロードしたままスペックを実行するにはどうすればよいですか? C コードを変更した場合、コードを再コンパイルするにはどのような手順を実行する必要がありますか?

これはおそらくばかげた質問ですが、gem の開発ソース ツリー内から 'bundle install' と入力しても、ネイティブ エクステンションはビルドされません。手動で実行するruby ext/mygem/extconf.rbと (プロジェクト全体のルートに) Makefile が取得され、次に実行するとmake(プロジェクト全体のルートに) 共有オブジェクトが取得されます。.so は lib/. 開発中に手作業でそれを行うことになっている場合を除きますか?

4

2 に答える 2

4

私が最終的に行った解決策は、githubでrake-compilerを使用することでした。

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

rakeタスクを追加してコンパイルを実行し(READMEに記載されています)、「spec」タスクをそのビルドフェーズに依存させます。

于 2012-05-05T04:42:06.057 に答える
4

それが「正しい」方法かどうかはわかりませんが、私が過去にこれを行った方法は

追加

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

私のスペックヘルパーへ

そして、次のようなrakefileがあります

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

そのrake specため、ビルドされたライブラリがext /に存在するように、毎回cコードをビルドします。ロード パスを変更すると、このコピーが確実にロードされます。このgithub リポジトリはこれを示しています。

于 2012-03-30T14:24:36.887 に答える