es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Ruby 2.7.4 Advertencias de Constante de Red

Estoy recibiendo advertencias repetitivas al ejecutar un script de ruby en un crontab, así como manualmente en la terminal.

/Users/rich/.rbenv/versions/2.7.4/lib/ruby/2.7.0/net/protocol.rb:66: advertencia: constante Net::ProtocRetryError ya inicializada
/Users/rich/.rbenv/versions/2.7.4/lib/ruby/gems/2.7.0/gems/net-protocol-0.1.2/lib/net/protocol.rb:68: advertencia: definición previa de ProtocRetryError estaba aquí
/Users/rich/.rbenv/versions/2.7.4/lib/ruby/2.7.0/net/protocol.rb:206: advertencia: constante Net::BufferedIO::BUFSIZE ya inicializada
/Users/rich/.rbenv/versions/2.7.4/lib/ruby/gems/2.7.0/gems/net-protocol-0.1.2/lib/net/protocol.rb:208: advertencia: definición previa de BUFSIZE estaba aquí
/Users/rich/.rbenv/versions/2.7.4/lib/ruby/2.7.0/net/protocol.rb:503: advertencia: constante Net::NetPrivate::Socket ya inicializada
/Users/rich/.rbenv/versions/2.7.4/lib/ruby/gems/2.7.0/gems/net-protocol-0.1.2/lib/net/protocol.rb:504: advertencia: definición previa de Socket estaba aquí

He cambiado el script para usar net/http o Faraday, el último asumo que requiere el primero. Viendo este comportamiento anteriormente y mucho tiempo atrás, esto es una recarga de la gema net, que es parte del core si no me equivoco. Simplemente no estoy seguro de por qué se está recargando.

Estoy usando rbenv para manejar las versiones de ruby por varias razones, y eso no cambiará. Mi shebang es #!/Users/rich/.rbenv/shims/ruby, pero la versión de mi ruby es un poco diferente:

$ which ruby
==> /Users/rich/.rbenv/versions/2.7.4/bin/ruby

$ ruby -v
==> Versión de Ruby: ruby 2.7.4p191 (2021-07-07 revisión a21a3b7d23) [arm64-darwin21]

Esta pequeña diferencia entre el shebang y las versiones solicitadas de ruby puede ser el problema. Tengo muchos scripts que dependen de ese shebang, que apunta a la versión actual de rbenv, que es lo que quiero. Cambio de versiones de vez en cuando y no quiero codificar esa instrucción.

¿Hay alguna forma de ver por qué está sucediendo esto? ¿Cómo puedo hacer que estas advertencias desaparezcan? ¿Cómo puedo evitar la recarga de gemas del core que ya están cargadas?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Solución

    Las advertencias repetitivas que obtienes al ejecutar un script ruby en una crontab, así como manualmente en la terminal, ocurren debido a que se vuelven a cargar las gemas core, lo cual es innecesario.

    Para ver por qué está sucediendo esto, podrías agregar una declaración puts en tu script para imprimir la variable $LOAD_PATH. Esto mostrará la lista de directorios donde Ruby busca las bibliotecas y gemas.

    puts $LOAD_PATH
    

    También es posible que la discrepancia de versión entre el shebang y la versión solicitada de ruby sea el problema. Para solucionarlo, puedes actualizar el shebang para que apunte directamente a la versión de ruby que estás utilizando:

    #!/Users/rich/.rbenv/versions/2.7.4/bin/ruby
    

    Alternativamente, puedes intentar agregar esta línea al principio de tu script para cargar las variables de entorno de rbenv:

    require 'rbenv'
    Rbenv.setup!
    

    Para evitar que se recarguen las gemas core, puedes utilizar Gem.clear_paths para eliminar todos los directorios de la ruta de búsqueda, excepto los directorios del sistema. Puedes agregar esta línea al principio de tu script, antes de requerir cualquier gema:

    Gem.clear_paths
    

    Esto asegurará que las gemas core no se recarguen innecesariamente. Si requieres otras gemas en tu script, estas se cargarán como de costumbre.

Comments are closed.