2009-06-25 10 views
11

Algunos librararies Rubí estoy usando utilización require declaraciones como esta:"requiere File.dirname (__ FILE__)" - ¿cómo deshacer de manera segura la dependencia del sistema de archivos?

require File.dirname(__FILE__) + '/specification_helper.rb' 

lib_dir = File.expand_path(File.join(File.dirname(__FILE__), "lib")) 

require File.join(File.dirname(__FILE__), 'lib/tools', 'version') 

require File.expand_path(File.join(File.dirname(__FILE__), 'datautils', 'conn')) 

¿No este formato que el código sea dependiente innecesariamente en la estructura del sistema de archivos?

¿Por qué el autor lo hizo de esta manera?

¿Sería posible (de forma segura) alterar este código para eliminar esta dependencia en el sistema de archivos?

+0

ver también codemeta.source_pdir http://en.wikibooks.org/wiki/AnyLang_Programming_Language_Comparison/Anylang_Common_Concepts – dreftymac

Respuesta

10

De hecho, use este esquema en el código de producción.

archivos que requieren en relación con la ubicación de origen actual tiene varias ventajas:

  • el árbol de fuentes se puede mover alrededor como un todo y sigue siendo utilizable ya que requieren fuentes de relativamente entre sí.
  • puesto que utilizamos rutas completas, que evitan colisiones accidentales (la carga de una fuente con el mismo nombre en otra biblioteca, o volver a cargar la misma fuente dos veces)
  • el código se puede utilizar sin tener que modificar la ruta de búsqueda de rubí

Si prefiere utilizar una ruta de búsqueda de rubí modificado, puede hacerlo de varias maneras:

  1. añadiendo opciones -I en la línea de comandos rubí
  2. modificando la variable $ LOAD_PATH dentro de las fuentes de
  3. jugando con el medio ambiente RUBYLIB variables

Solución 1 implica el control de cómo se invoca rubí. Usted necesitará un script para iniciar el programa, tales como:

@echo off 
REM my_script.cmd 
set srcdir=%~dp0\..\path\to\source 
ruby -I %srcdir% %srcdir%\my_script.rb 

O:

#!/bin/sh 
srcdir=$(cd $(dirname $0)/../path/to/source && pwd) 
exec ruby -I $srcdir $srcdir/my_script.rb 

Solución 2 es viable, pero no evita las colisiones. Por lo general, va a hacer algo como:

$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__))) 

Solución 3 es desaconsejable, menos dependencias que tendrá hacia las variables de entorno, mejor será.

Cuestiones relacionadas