¿Es require File.expand_path(..., __FILE__)
la mejor manera de requerir otros archivos dentro de un proyecto?¿Se requiere File.expand_path (..., __FILE__) la mejor práctica?
Respuesta
En Ruby 1.9.2 + require_relative
es probablemente la forma más correcta de hacerlo.
require
se ha cambiado para no incluir el directorio '.'
por razones de seguridad. Se agregó require_relative
para proporcionar una solución de archivo local para los módulos relativos a la ruta del script de llamada.
Puede search here on StackOverflow, particularmente en "What is require_relative in Ruby?", y en los internets y encontrar trucos de uso y why-for messages explicando cómo se produjo.
Además, "[Ruby: require vs require_relative: la mejor práctica para ejecutar una solución en Ruby <1.9.2 and > = 1.9.2] (http://stackoverflow.com/questions/4333286/ruby-require-vs-require-relative-best-practice-to-workaround-running-in -ambos) "es un gran hilo que explica esto. –
A menos que modifique $LOAD_PATH
, lo que sería una buena idea si continúa cargando desde la misma estructura de directorios, está trabada haciéndolo de esa manera.
La forma en que he tomado a hacerlo, para asegurar que las cosas son tan multiplataforma como sea posible, es la siguiente:
require File.expand_path(File.join(*%w[ ... ]), File.dirname(__FILE__))
Es un poco prolijo, pero el resultado es el camino y el más corto posible menos 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__))
Esto se puede combinar con una modificación a $LOAD_PATH
para simplificar las cosas si va a cargar una gran cantidad de 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á.
Suponer __FILE__ == "/home/yourname/foo.rb"
. File.expand_path("bar.rb",__FILE__)
da "/home/yourname/foo.rb/bar.rb
.
Lo que queremos es que devuelve File.expand_path("bar.rb",File.dirname(__FILE__))
"/home/yourname/bar.rb"
Además, puede pedir require_relative
del backports gem.
siempre puede hacer 'require File.expand_path (" ../ baz.rb ", __FILE __)' para incluir baz.rb desde foo.rb en el mismo directorio. –
Siguiendo con el comentario de Matt, veo que 'File.expand_path (" ../../ lib/mygem.rb ", __FILE __)' es un ejemplo real dado en los documentos 2.1.0 para 'expand_path'.¡Pero eso implica pretender que un no-directorio es un directorio y luego pasar a su supuesto padre! Estoy desconcertado de que los documentos oficiales recomendarían un enfoque tan desviado, y me pregunto si solo funciona a través de algún efecto secundario frágil de la implementación que podría cambiar el comportamiento en futuras versiones. Creo que el enfoque 'dirname' es mucho más limpio. –
en Ruby 2.0 se puede utilizar Kernel#__dir__
- 1. ¿Se está usando Action.Invoke como mejor práctica?
- 2. Mejor práctica del comparador
- 3. Release Management: mejor práctica
- 4. Mejor práctica de clase
- 5. cmake mejor práctica
- 6. para la mejor práctica de bucle
- 7. Métodos anidados, mejor práctica
- 8. ¿La mejor práctica para el patrón DAO?
- 9. ¿qué significa la variable __file__?
- 10. "requiere File.dirname (__ FILE__)" - ¿cómo deshacer de manera segura la dependencia del sistema de archivos?
- 11. ¿La mejor práctica para dependencias en #defines?
- 12. Mejor práctica para la funcionalidad 'me gusta'
- 13. C encabezados ++ - La mejor práctica al incluir
- 14. mejor práctica de la agrupación django + PyMongo?
- 15. la mejor práctica cuando no implementar IValueConvert.ConvertBack
- 16. JavaScript y Eventos - Mejor Práctica
- 17. WSDL - sin entrada - mejor práctica
- 18. Mejor práctica: Organizar pruebas unitarias
- 19. Java JSON serialization: mejor práctica
- 20. Mejor práctica de dependencia circular
- 21. ABSPATH o __FILE__?
- 22. equivalente sh de __FILE__
- 23. VS Solution, proyectos frente a la mejor práctica de dlls
- 24. referencia o devolución: mejor práctica
- 25. ¿Qué significa __FILE__?
- 26. Diseño de SVN: mejor práctica
- 27. Mejor práctica para NSUserDefaults sincronizar
- 28. kwargs mejor práctica de análisis
- 29. Mejor práctica: prueba vs rescate
- 30. Compruebe si se define un objeto, mejor práctica.
me había 100 esto si pudiera. Es algo de lo que me gustaría prescindir. –
Posible duplicado de http://stackoverflow.com/questions/224379/what-does-file-mean-in-ruby –
posible duplicado de [Ruby: require vs require \ _relative - práctica recomendada para la solución en Ruby <1.9.2 and > = 1.9.2] (http://stackoverflow.com/questions/4333286/ruby-require-vs-require-relative-best-practice-to-workaround-running-in-both) –