node.js

¿Cómo obtengo la ruta al script actual con Node.js?



(13)

¿Cómo obtendría la ruta al script en Node.js?

Sé que existe process.cwd , pero eso solo se refiere al directorio donde se llamó al script, no al script en sí. Por ejemplo, digamos que estoy en /home/kyle/ y ejecuto el siguiente comando:

node /home/kyle/some/dir/file.js

Si llamo process.cwd() , obtengo /home/kyle/ , no /home/kyle/some/dir/ . ¿Hay alguna manera de obtener ese directorio?


Así que básicamente puedes hacer esto:

fs.readFile(path.resolve(__dirname, ''settings.json''), ''UTF-8'', callback);

Use resolver () en lugar de concatenar con ''/'' o ''/', de lo contrario, se encontrará con problemas multiplataforma.

Nota: __dirname es la ruta local del módulo o el script incluido. Si está escribiendo un complemento que necesita conocer la ruta del script principal es:

require.main.filename

o, para obtener el nombre de la carpeta:

require(''path'').dirname(require.main.filename)


Cada programa Node.js tiene algunas variables globales en su entorno, lo que representa cierta información sobre su proceso y una de ellas es __dirname .


Cuando se trata del script principal es tan simple como:

process.argv[1]

De la documentación de Node.js :

proceso.argv

Una matriz que contiene los argumentos de la línea de comando. El primer elemento será ''nodo'', el segundo elemento será la ruta al archivo JavaScript . Los siguientes elementos serán los argumentos de línea de comando adicionales.

Si necesita conocer la ruta de un archivo de módulo, use __filename .


Este comando devuelve el directorio actual:

var currentPath = process.cwd();

Por ejemplo, para usar la ruta para leer el archivo:

var fs = require(''fs''); fs.readFile(process.cwd() + "//text.txt", function(err, data) { if(err) console.log(err) else console.log(data.toString()); });


Lo encontré después de revisar nuevamente la documentación. Lo que estaba buscando eran las variables de nivel de módulo __filename y __dirname .

  • __filename es el nombre de archivo del módulo actual. Esta es la ruta absoluta resuelta del archivo de módulo actual. (por ejemplo: /home/kyle/some/dir/file.js )
  • __dirname es el nombre de directorio del módulo actual. (Ej: /home/kyle/some/dir )

Node.js 10 admite módulos ECMAScript , donde __dirname y __filename no están disponibles de forma __filename .

Luego, para obtener la ruta al módulo ES actual, hay que usar:

const __filename = new URL(import.meta.url).pathname;

Y para el directorio que contiene el módulo actual:

import path from ''path''; const __dirname = path.dirname(new URL(import.meta.url).pathname);


Otro enfoque, si está usando módulos y le gustaría encontrar el nombre de archivo del módulo principal que se llama tal submódulo o cualquier módulo que esté ejecutando, es usar

var fnArr = (process.mainModule.filename).split(''/''); var filename = fnArr[fnArr.length -1];


Puede usar process.env.PWD para obtener la ruta de la carpeta de la aplicación actual.


Sé que esto es bastante antiguo, y la pregunta original a la que estaba respondiendo está marcada como duplicada y dirigida aquí, pero me encontré con un problema que trataba de hacer que los reporteros de jazmín funcionaran y no me gustó la idea de que tenía que bajar la calificación. Para que funcione. Descubrí que jasmine-reporter no resolvía correctamente el savePath y en realidad estaba colocando la salida de la carpeta de informes en el directorio jasmine-reporteros en lugar del directorio raíz donde ejecuté Gulp. Para hacer que esto funcione correctamente, terminé usando process.env.INIT_CWD para obtener el Directorio de trabajo actual inicial, que debería ser el directorio donde ejecutó gulp. Espero que esto ayude a alguien.

var reporters = require(''jasmine-reporters''); var junitReporter = new reporters.JUnitXmlReporter({ savePath: process.env.INIT_CWD + ''/report/e2e/'', consolidateAll: true, captureStdout: true });


Si está utilizando pkg para empaquetar su aplicación, encontrará útil esta expresión:

appDirectory = require(''path'').dirname(process.pkg ? process.execPath : (require.main ? require.main.filename : process.argv[0]));

  • process.pkg dice si la aplicación ha sido empaquetada por pkg .

  • process.execPath contiene la ruta completa del ejecutable, que es /usr/bin/node o similar para las invocaciones directas de scripts ( node test.js ), o la aplicación empaquetada.

  • require.main.filename contiene la ruta completa del script principal, pero está vacía cuando Node se ejecuta en modo interactivo.

  • __dirname contiene la ruta completa de la secuencia de comandos actual , así que no la estoy usando (aunque puede ser lo que solicite OP; a continuación, utilice mejor appDirectory = process.pkg ? require(''path'').dirname(process.execPath) : (__dirname || require(''path'').dirname(process.argv[0])); observando que en el modo interactivo __dirname está vacío.

  • Para el modo interactivo, use process.argv[0] para obtener la ruta al ejecutable de Node o process.cwd() para obtener el directorio actual.


Si quieres algo más como $ 0 en un script de shell, prueba esto:

var path = require(''path''); var command = getCurrentScriptPath(); console.log(`Usage: ${command} <foo> <bar>`); function getCurrentScriptPath () { // Relative path from current working directory to the location of this script var pathToScript = path.relative(process.cwd(), __filename); // Check if current working dir is the same as the script if (process.cwd() === __dirname) { // E.g. "./foobar.js" return ''.'' + path.sep + pathToScript; } else { // E.g. "foo/bar/baz.js" return pathToScript; } }


Utiliza __dirname !!

__dirname

El nombre del directorio del módulo actual. Esto es lo mismo que el path.dirname () del __filename .

Ejemplo: ejecutar node example.js desde / Users / mjr

console.log(__dirname); // Prints: /Users/mjr console.log(path.dirname(__filename)); // Prints: /Users/mjr

https://nodejs.org/api/modules.html#modules_dirname


var settings = JSON.parse( require(''fs'').readFileSync( require(''path'').resolve( __dirname, ''settings.json''), ''utf8''));