¿Cómo incrustar una gema Ruby en un proyecto C# y solicitarla desde un script IronRuby integrado?

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

Pregunta

Tengo un proyecto de C# en el que incrusté un programa IronRuby.El proyecto (incluido mi script Ruby) se compila en un archivo .exe en Visual Studio 2010 para su distribución.Estoy usando un patrón similar a este para iniciar el script IronRuby: http://pastebin.com/NKes1cyc (y Jimmy Schementi entra en más detalles aquí: http://blog.jimmy.schementi.com/2009/12/ironruby-rubyconf-2009-part-35.html).

Mi problema:Me gustaría incrustar una gema (json_pure) en mi ensamblado de C# y llamarla desde el script Ruby.

Algunos recursos que he encontrado:

  1. En JRuby, puedes empaquetar fácilmente una gema en un archivo jar y luego simplemente solicitar el archivo jar en tiempo de ejecución. http://blog.nicksieger.com/articles/2009/01/10/jruby-1-1-6-gems-in-a-jar

  2. La herramienta irpack (en http://github.com/kumaryu/irpack) es capaz de compilar Ruby en un .exe (creo que crea y compila dinámicamente un proyecto C#) mientras incorpora la biblioteca estándar de Ruby.Pero parece que solo está incrustando los archivos .dll de IronRuby prediseñados, no los archivos .rb de Ruby.El enfoque que utiliza esta herramienta funcionaría si pudiera descubrir cómo compilar archivos fuente de Ruby en un archivo .dll.

¿Cómo incrusto una gema IronRuby en un ensamblado de C# (o compilo una gema IronRuby en un archivo .dll)?

EDITAR:

Página 472 de IronRuby en acción ("Uso de bibliotecas externas") explica cómo requerir bibliotecas Ruby estándar desde un archivo Ruby incrustado.Implica agregar las carpetas a la colección de rutas de búsqueda en tiempo de ejecución, de la siguiente manera (editado para mayor brevedad y claridad):

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)

Este enfoque supone que la máquina host tiene IronRuby instalado, pero quiero incrustar archivos Ruby (de una gema) en el ensamblaje para que pueda ejecutarse sin IronRuby preinstalado.

EDITAR 2 (investigación adicional):

Al leer el código fuente de la herramienta irpack a la que se hace referencia anteriormente, noto que Kumaryu está incorporando recursos en el ensamblaje final a través de la clase System.IO.Packaging.Package y luego pasando el paquete a la llamada a msbuild (consulte https://github.com/kumaryu/irpack/blob/master/lib/irpack/packager.rb).Quizás una mayor investigación sobre cómo empaquetar archivos en un ejecutable conduzca a una solución.El problema que veo es que Ruby se archiva en una gema. require otros archivos de rubí...¿Puede un archivo Ruby en un paquete ensamblador? require ¿Otros archivos Ruby en el mismo paquete?

EDITAR 3:

Aún no he obtenido una respuesta, pero me interesaría escuchar los comentarios de cualquiera, incluso si es solo un enlace o una sugerencia sobre dónde buscar.Soy nuevo en msbuild y la documentación es bastante extensa.Una búsqueda inicial en la web de "paquete zip integrado msbuild" no reveló nada relevante.

¿Fue útil?

Solución

Requerir es un método eso puede anularse como cualquier otro método de Ruby.Creo que así es como funcionaba el paquete Ruby Gems original, las gemas simplemente anularían require.

Si puedes empaquetar la gema en tu .exe de alguna manera, puedes anularla require para cargar desde el conjunto.

Otros consejos

estoy trabajando con https://stackoverflow.com/users/2086/mcintyre321 para incluir su biblioteca en C#/IronRuby usando mi código de empaquetado ( https://github.com/rifraf/IronRubyAppPackager#readme ).

Se necesitan algunas correcciones en el paso de venta que están relacionadas con las versiones posteriores de Ruby que tienen RubyGems incrustados en lugar de cargados, pero se están logrando avances.

Su código requiere 'json' y tengo un truco para obligarlo a usar la implementación de Ruby en lugar de los archivos .so de C-linkage.Esto debería significar que funcionará bien con IronRuby.Me informará o no dude en ponerse en contacto conmigo con la fuente que desea ejecutar.

prueba esto https://github.com/rifraf/IronRubyAppPackager#readme (o espere a que le informe si funciona con la biblioteca que estoy intentando insertar)

Informando de vuelta:

El proceso al que he ido es...

  1. bifurca y submódulo todos los proyectos (IronRubyEmbeddedApps, IronRubyAppPackager, Serfs y Vendorize) de https://github.com/rifraf, y los agregué todos a una solución VS.Actualicé todos los proyectos a .NET4 y los hice hacer referencia entre sí, en lugar de los ensamblados .net2 incluidos.

  2. Ejecuté Vendorize para extraer todas las dependencias/gemas. D:\projects\SomeLibrary\lib_vendor_ mediante la ejecución:

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

  3. Generé un proyecto de C# en D:\projects\SomeLibrary\lib\_IRPackager_\some_lib.csproj mediante la ejecución:

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

  4. Agregué some_lib.csproj a mi solución, lo actualicé a .net4 y corrigí las referencias.

  5. En este punto, puede ejecutar el proyecto en .NET, de forma independiente, ejecutando
var Ruby = new EmbeddedRuby();
Ruby.Decoder = new Program.GZipDecoder();
Ruby.Mount("App");
Ruby.Run("gocardless.rb");

¡Y lo logró!¡Brillante, pensé!

En realidad, en este punto descubrí que en el paso 2 no se había podido vender cada biblioteca requerida.Vender obras interceptando require llamadas y luego guardar los archivos rb llamados en el _Vendor_ - si require no se ejecuta (así que ejecute todas las pruebas y espere que la cobertura de la prueba sea del 100%), no se recogerá.

Por alguna razón, no estaba seleccionando uno de los archivos requeridos, a pesar de que existía un requisito.Al final, creé manualmente el contenido para el proveedor directorio copiando mi biblioteca y usando bundle install --deployment dominio.Repite los pasos 3 y 4 y listo...¿bien?

No, recibo algún error sobre no such file to load -- json/pure cuando ejecuto el proyecto generado, creo que esto es algo que se debe a una combinación de que ironruby no tiene una implementación json nativa, yo hago la venta manual y tengo que hacer cosas complicadas en varios puntos hoy.

Para concluir, este método casi funciona, funcionará si su biblioteca y sus dependencias funcionan correctamente con ironruby y puede hacer que sellerize funcione correctamente.

Me rendiré y trasladaré la biblioteca a C# a la antigua usanza.

editar:Como se menciona a continuación, rifraf me está ayudando y está buscando actualizar las herramientas que estaba usando.¡mira este espacio!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top