8

Python用のC拡張モジュールがあり、Rubyistsが利用できるようにしたいと思います。

ソースには多数のCモジュールがあり、Pythonに依存しているのは1つだけです。残りは、相互に、そして標準ライブラリにのみ依存します。python setup.py build私は通常の方法でそれを構築することができます。

私はを使用してRubyサポートを追加することを試みてきましたが、を使用しnewgemて拡張機能のバージョンを構築できrake gemます。ただし、結合されたソースには醜いディレクトリレイアウト(GemスタイルとSetuptoolsスタイルの構造が混在)があり、ビルドプロセスは厄介です。

mkmfPythonに依存するモジュールを自動的に取得してビルドしようとするため、すべてのソースを同じディレクトリに保持することはできません。ユーザーは、使用されないモジュールをコンパイルするためにPythonをインストールする必要はありません。私の現在のハックはextconf.rb、Pythonに依存しないソースファイルをRubyに依存する拡張モジュールと同じディレクトリにコピーすることです。

コードを両方の言語で利用できるようにするための賢明な方法はありますか?Pythonに依存しないコードを別のGemに複製する必要がありますか?autotoolsで構築された別のlibとして独立したコードをリリースする必要がありますか?mkmf不要なモジュールをスキップできるバージョンはありますか?

4

2 に答える 2

5

これを解決する 1 つの方法は、3 つの異なるプロジェクトを作成することです。

  • Python と Ruby に依存しないライブラリ自体
  • Python バインディング
  • Ruby バインディング

これはおそらく最もクリーンな解決策ですが、リリースを行う際にはもう少し作業が必要になりますが、新しいライブラリ/python バインディング バージョンを出荷することなく、Ruby バインディングの新しいバージョンをリリースできるという利点があります。

于 2009-02-04T15:35:56.697 に答える
0

Johan が言ったことを補足するために、swig のおかげで Python でいくつかの c/c++ サポート ライブラリを使用しました。コードを c/c++ で記述してから、サポートする各言語の中間テンプレートを作成します。Python の場合はかなり簡単ですが、Ruby の場合はいくつかの考慮事項が必要です...つまり、pthread のサポートが ruby​​ に満足しているとは思いません。

http://www.swig.org/ 学習曲線がやや急なので、ターゲット言語でラッパーを使用する方法を示すサンプル プロジェクトを見つけるのが最善かもしれません。

これは、複数の言語 (PHP、Python、Ruby、および c# だと思います) への強力なバインディングを提供しながら、コードをよりクリーンにするため、間違いなく便利なツールです。

于 2009-02-05T03:54:55.190 に答える