ruby - mixin - ¿Se requiere File.expand_path(...,__FILE__) la mejor práctica?
ruby import class from another file (4)
¿Se require File.expand_path(..., __FILE__)
la mejor manera de requerir otros archivos dentro de un proyecto?
A menos que modifique $LOAD_PATH
, lo cual sería una buena idea si continúa cargando desde la misma estructura de directorios, está trabado haciéndolo de esa manera.
La forma en que me he tomado el hacerlo, para asegurar que las cosas sean lo más diferentes posibles, es esta:
require File.expand_path(File.join(*%w[ ... ]), File.dirname(__FILE__))
Es un poco detallado, pero da como resultado el camino más corto posible y la menor cantidad de sintaxis en la mayoría de los casos.
Un ejemplo más específico sería:
require File.expand_path(File.join(*%w[ .. lib example ]), File.dirname(__FILE__))
Puede combinar esto con una modificación de $LOAD_PATH
para simplificar las cosas si está cargando muchos archivos y hacer esto:
$LOAD_PATH << File.expand_path(File.join(*%w[ .. lib ]), File.dirname(__FILE__))
require ''example''
En Ruby 1.8.x, donde no tiene require_relative
en el núcleo, File.expand_path(...,__FILE__)
no funcionará.
Supongamos que __FILE__ == "/home/yourname/foo.rb"
. File.expand_path("bar.rb",__FILE__)
da "/home/yourname/foo.rb/bar.rb
.
Lo que quiere es File.expand_path("bar.rb",File.dirname(__FILE__))
que devuelve "/home/yourname/bar.rb"
También puede obtener require_relative
de la gema backports .
En Ruby 1.9.2 + require_relative
es probablemente la forma más correcta de hacerlo.
require
fue cambiado para no incluir tu ''.''
directorio por razones de seguridad. require_relative
fue agregado para proporcionar una solución de archivo local para módulos relativos a la ruta del script de llamada .
Puede buscar aquí en , particularmente en " ¿Qué es require_relative in Ruby? ", Y en las redes, y encontrar trucos de uso y los mensajes de por qué explican cómo surgió.
En Ruby 2.x puedes usar Kernel#__dir__