Как встроить ruby gem в проект C # и запросить его из встроенного скрипта IronRuby?

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

Вопрос

У меня есть проект на C #, в который я встроил программу IronRuby.Проект (включая мой ruby-скрипт) скомпилирован в exe-файл в Visual Studio 2010 для распространения.Я использую шаблон, подобный этому, для начальной загрузки скрипта IronRuby: http://pastebin.com/NKes1cyc (и Джимми Шементи более подробно останавливается здесь: http://blog.jimmy.schementi.com/2009/12/ironruby-rubyconf-2009-part-35.html).

Моя проблема:Я хотел бы встроить gem (json_pure) в мою сборку C # и вызвать его из скрипта 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 в .exe (я думаю, что он динамически создает и компилирует проект C #) при встраивании стандартной библиотеки ruby.Но похоже, что это только встраивание готовых IronRuby .dll, а не ruby .rb файлов.Подход, используемый этим инструментом, сработал бы, если бы я мог понять, как скомпилировать исходные файлы Ruby в .dll.

Как мне встроить драгоценный камень IronRuby в сборку C # (или скомпилировать драгоценный камень IronRuby в .dll)?

Редактировать:

Страница 472 из Железная Рубка В Действии ("Использование внешних библиотек") объясняет, как запросить стандартные библиотеки 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, но я хочу встроить файлы ruby (из gem) в сборку, чтобы ее можно было запускать без предустановленного IronRuby.

ПРАВКА 2 (дальнейшие исследования):

Читая исходный код инструмента irpack, упомянутого выше, я замечаю, что Kumaryu встраивает ресурсы в окончательную сборку через System.IO.Packaging.Класс Package, а затем передает пакет в вызов msbuild (см. https://github.com/kumaryu/irpack/blob/master/lib/irpack/packager.rb).Возможно, некоторые дальнейшие исследования по упаковке файлов в исполняемый файл приведут к решению.Проблема, которую я вижу, заключается в том, что ruby хранит файлы в gem require другие файлы ruby...может ли файл ruby находиться в пакете assembly require другие файлы ruby в том же пакете?

ПРАВКА 3:

Я пока не продвинулся дальше ответа, но мне было бы интересно услышать чьи-либо отзывы, даже если это просто ссылка или предложение о том, где искать.Я новичок в msbuild, и документация довольно увесистая.Первоначальный поиск в Интернете по запросу "msbuild embedded zip package" не выявил ничего релевантного.

Это было полезно?

Решение

Требовать - это метод это может быть переопределено, как и любой другой метод ruby.Я думаю, что именно так работал оригинальный пакет ruby gems, gems просто переопределяли бы require.

Если вы можете каким-то образом упаковать gem в свой файл .exe, вы можете переопределить require для загрузки из сборки.

Другие советы

Я работаю с https://stackoverflow.com/users/2086/mcintyre321 чтобы перенести его библиотеку в C # / IronRuby, используя мой упаковочный код ( https://github.com/rifraf/IronRubyAppPackager#readme ).

На этапе вендоризации необходимы некоторые исправления, связанные с тем, что в более поздних версиях Ruby RubyGems встроены, а не загружены, но прогресс достигнут.

Его код требует 'json', и у меня есть хитрость, чтобы заставить его использовать реализацию Ruby, а не файлы C-linkage .so.Это должно означать, что он будет работать с 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 не удалось внедрить все необходимые библиотеки.Vendorize работает путем перехвата require вызовы, а затем сохранение вызванных файлов rb в _Vendor_ - если require не выполняется (поэтому запустите все тесты и надейтесь, что охват тестами будет 100%), он не будет обнаружен.

По какой-то причине он не получал ни один из требуемых файлов, хотя запрос был.В конце концов, я вручную создал контент для поставщик каталог, скопировав в него мою библиотеку и используя bundle install --deployment команда.Повторите шаги 3 и 4, и я закончу...верно?

Нет, я получаю какую-то ошибку о no such file to load -- json/pure когда я запускаю сгенерированный проект - я думаю, это то, что нужно сделать из-за сочетания того, что у ironruby нет собственной реализации json, я выполняю ручную вендоризацию и мне приходится переделывать вещи в нескольких точках сегодня.

В заключение - этот метод очень, очень почти работает, будет работать, если ваша библиотека и ее зависимости правильно работают с ironruby, и вы можете заставить vendorize работать должным образом.

Я сдаюсь и переношу библиотеку на c # по старинке.

Редактировать:как упоминалось ниже, rifraf помогает мне и занимается обновлением инструментов, которые я использовал.следите за (его) пространством!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top