Как встроить ruby gem в проект C # и запросить его из встроенного скрипта IronRuby?
-
27-10-2019 - |
Вопрос
У меня есть проект на 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.
Некоторые ресурсы, которые я нашел:
В JRuby вы можете легко упаковать gem в файл jar, а затем просто запросить файл jar во время выполнения - http://blog.nicksieger.com/articles/2009/01/10/jruby-1-1-6-gems-in-a-jar
Инструмент 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 (или подождите, пока я сообщу, работает ли это с библиотекой, которую я пытаюсь внедрить)
Отчитываюсь о результатах:
Процесс, к которому я приступил, таков...
разветвляйте и подмодулируйте все проекты (IronRubyEmbeddedApps, IronRubyAppPackager, Serfs и Vendorize) из https://github.com/rifraf, и добавил их все в решение VS.Я обновил все проекты до .NET4 и заставил их ссылаться друг на друга, а не на включенные сборки .net2
выполнен Vendorize для удаления всех зависимостей / драгоценных камней
D:\projects\SomeLibrary\lib_vendor_
запустив:D:\projects\SomeLibrary\lib>ruby -I..\..\Vendorize\lib -rvendorize some_lib.rb
Сгенерировал проект на c # в
D:\projects\SomeLibrary\lib\_IRPackager_\some_lib.csproj
запустив:D:\projects\SomeLibrary\lib>ruby -I..\..\IronRubyAppPackager\lib\IRPackager.rb some_lib.rb
Добавил файл some_lib.csproj в мое решение, обновил его до .net4 и исправил ссылки
- На этом этапе вы можете запустить проект в .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 помогает мне и занимается обновлением инструментов, которые я использовал.следите за (его) пространством!