Ruby gemをC#プロジェクトに埋め込み、埋め込まれたIronRubyスクリプトから必要とする方法は?

StackOverflow https://stackoverflow.com/questions/9333732

質問

私はIronRubyプログラムを組み込んだC#プロジェクトを持っています。プロジェクト(私のrubyスクリプトを含む)はにコンパイルされています。配布用のVisual Studio2010のexeファイル。IronRubyスクリプトをブートストラップするために、これに似たパターンを使用しています: http://pastebin.com/NKes1cyc (そして、ジミー Schementiはここでより詳細に入ります: http://blog.jimmy.schementi.com/2009/12/ironruby-rubyconf-2009-part-35.html).

私の問題:C#アセンブリにgem(json_pure)を埋め込み、rubyスクリプトから呼び出したいと思います。

私が見つけたいくつかのリソース:

  1. JRubyでは、gemをjarファイルに簡単にパッケージ化し、実行時にjarファイルを必要とすることができます - http://blog.nicksieger.com/articles/2009/01/10/jruby-1-1-6-gems-in-a-jar

  2. Irpackツール( http://github.com/kumaryu/irpack)にRubyをコンパイルすることができます。ruby標準ライブラリを埋め込んでいる間、exe(c#プロジェクトを動的に作成してコンパイルすると思います)。しかし、それは事前に構築されたIronRubyを埋め込むだけのようです。dll、rubyではありません。rbファイル。このツールが使用するアプローチは、Rubyのソースファイルをaにコンパイルする方法を理解できればうまくいくでしょう。dll。

IronRuby gemをC#アセンブリに埋め込むにはどうすればよいですか(またはIronRuby gemをa.dll)?

編集:

472ページ アクションでIronRuby ("外部ライブラリの使用")では、組み込みrubyファイル内から標準rubyライブラリを必要とする方法について説明します。これには、次のようにフォルダーをランタイム検索パスコレクションに追加することが含まれます(簡潔さと明確さのために編集されています)。:

ScriptEngine engine = IronRuby.Ruby.CreateEngine();
var searchPaths = engine.GetSearchPaths().Concat(new[] 
{
    "C:\\Program Files (x86)\\IronRuby 1.1\\Lib\\ruby\\1.9.1",
    "C:\\Program Files (x86)\\IronRuby 1.1\\Lib\\ironruby"
});
engine.SetSearchPaths(searchPaths)

このアプローチは、ホストマシンにIronRubyがインストールされていることを前提としていますが、ironrubyがプリインストールされていなくても実行できるように、(gemから)rubyファイルをアセンブリに埋め込みたいと思います。

編集2(さらなる研究):

上記のirpackツールのソースコードを読むと、Kumaryuがsystem.IO.Packaging.Packageクラスを介して最終アセンブリにリソースを埋め込み、パッケージをmsbuildの呼び出しに渡していることに気づ https://github.com/kumaryu/irpack/blob/master/lib/irpack/packager.rb).おそらく、ファイルを実行可能ファイルにパッケージ化するためのさらなる研究が解決策につながるでしょう。私が見ている問題は、rubyファイルが宝石の中にあることです require その他のrubyファイル。..rubyファイルをアセンブリパッケージに入れることはできますか require 同じパッケージ内の他のrubyファイル?

編集3:

私はまだ答えを得ていませんが、それが単なるリンクやどこを見るべきかについての提案であっても、誰かのフィードバックを聞くことに興味があ私はmsbuildを初めて使用しており、ドキュメントはかなり多額です。「Msbuild embed zip package」の最初のweb検索では、関連するものは何も明らかにされていませんでした。

役に立ちましたか?

解決

Requireはメソッドです他のRubyメソッドと同じようにオーバーライドされます。これが元のrubygemsパッケージの仕組みだと思います。gemは単にrequireをオーバーライドします。

何らかの方法でgemを.exeにパッケージ化できる場合は、requireをオーバーライドしてアセンブリからロードできます。

他のヒント

https://stackoverflow.com/users/2086/mcintyre321 を使用して、ライブラリをまとめています。パッケージコードを使用してC#/ IronRubyに挿入します( https://github.com/rifraf/IronRubyAppPackager#readme )。

ベンダー化のステップで必要な修正がいくつかあり、RubyGemsがロードされるのではなく埋め込まれているRubyの新しいバージョンに関連していますが、進歩が見られます。

彼のコードには「json」が必要です。C-linkage.soファイルではなくRuby実装を使用するように強制するトリックがあります。これは、IronRubyで問題なく動作することを意味するはずです。報告するか、実行したいソースを私に連絡してください。

これを試してみてください https://github.com/rifraf/IronRubyAppPackager#readme (または、埋め込もうとしているライブラリで動作するかどうかを報告するのを待ちます)

レポートバック:

私が行ったプロセスは次のとおりです。..

  1. すべてのプロジェクト(IronRubyEmbeddedApps、IronRubyAppPackager、Serfs、Vendorize)をフォークしてサブモジュール化します https://github.com/rifraf, 、それらをすべてVSソリューションに追加しました。私はすべてのプロジェクトを.NET4に更新し、含まれている.net2アセンブリではなく、お互いを参照させました

  2. すべての依存関係/宝石をリッピングするためにVendorizeを実行しました D:\projects\SomeLibrary\lib_vendor_ 走ることによって:

    D:\projects\SomeLibrary\lib>ruby -I..\..\Vendorize\lib -rvendorize some_lib.rb

  3. でc#プロジェクトを生成しました D:\projects\SomeLibrary\lib\_IRPackager_\some_lib.csproj 走ることによって:

    D:\projects\SomeLibrary\lib>ruby -I..\..\IronRubyAppPackager\lib\IRPackager.rb some_lib.rb

  4. Some_libを追加しました。私の解決策にcsproj、それを.net4にアップグレードし、参照を修正しました

  5. この時点で、次のコマンドを実行して、.NET、スタンドアロンでプロジェクトを実行できます
var Ruby = new EmbeddedRuby();
Ruby.Decoder = new Program.GZipDecoder();
Ruby.Mount("App");
Ruby.Run("gocardless.rb");

そしてそれは成功しました!素晴らしいと思いました!

実際には、この時点で、必要なすべてのライブラリをベンダライズするためにステップ2で失敗したことがわかりました。を利用して作品を制作していますが、 require を呼び出してから、呼び出されたrbファイルを保存します。 _Vendor_ -もし require 実行されません(したがって、すべてのテストを実行し、テストカバレッジが100%であることを願っています)。

何らかの理由で、requireがあったにもかかわらず、必要なファイルの1つをピックアップしていませんでした。最後に、私は手動でコンテンツを作成しました 仕入先 私のライブラリをコピーしてディレクトリを使用して、 bundle install --deployment コマンド。ステップ3と4を繰り返すと完了です。..そうだろ?

いいえ、私はいくつかのエラーを取得します no such file to load -- json/pure 生成されたプロジェクトを実行するとき-これは、ネイティブjson実装を持たないironrubyと、手動のベンダライズを行っているironrubyと、今日のいくつかの点で

結論として-この方法は非常に非常にほぼ機能し、ライブラリとその依存関係がironrubyで適切に動作し、vendorizeを適切に動作させることができれば機能します。

私はあきらめて、ライブラリをc#に昔ながらの方法で移植しています。

編集:以下に述べるように、rifrafは私を助け、私が使用していたツールの更新を検討しています。t(彼の)スペースを見てください!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top