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?
davy.ai
Solución
Las advertencias repetitivas que obtienes al ejecutar un script
ruby
en unacrontab
, así como manualmente en la terminal, ocurren debido a que se vuelven a cargar las gemascore
, 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.También es posible que la discrepancia de versión entre el
shebang
y la versión solicitada deruby
sea el problema. Para solucionarlo, puedes actualizar elshebang
para que apunte directamente a la versión deruby
que estás utilizando:Alternativamente, puedes intentar agregar esta línea al principio de tu script para cargar las variables de entorno de
rbenv
:Para evitar que se recarguen las gemas
core
, puedes utilizarGem.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:Esto asegurará que las gemas
core
no se recarguen innecesariamente. Si requieres otras gemas en tu script, estas se cargarán como de costumbre.