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

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

Sé que hay process.cwd , pero eso solo se refiere al directorio donde se llamó el 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 a process.cwd() , obtengo /home/kyle/ , not /home/kyle/some/dir/ . ¿Hay alguna forma de obtener ese directorio?

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

  • __filename es el nombre del archivo del módulo actual.
  • __dirname es el nombre del directorio del módulo actual.

Entonces, básicamente, puedes hacer esto:

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

Use resolve () en lugar de concatenar con ‘/’ o ‘\’ else, se encontrará con problemas multiplataforma.

Nota: __dirname es la ruta local del módulo o secuencia de comandos incluida. Si está escribiendo un complemento que necesita conocer la ruta del script principal, es:

 require.main.filename 

o, simplemente para obtener el nombre de la carpeta:

 require('path').dirname(require.main.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()); }); 

Use __dirname !!

 __dirname 

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

Ejemplo: ejecución del nodo 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

Cuando se trata del guión principal, es tan simple como:

 process.argv[1] 

De la documentación de Node.js :

process.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 cualquier argumento de línea de comando adicional.

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

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

Todos los progtwigs de Node.js tienen algunas variables globales en su entorno, lo que representa cierta información sobre su proceso y una de ellas es __dirname .

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

Sé que esto es bastante antiguo, y la pregunta original a la que respondía está marcada como duplicada y dirigida aquí, pero me encontré con un problema al tratar de hacer trabajar a los reporteros de jasmine y no me gustó la idea de tener que degradarme en para que funcione Descubrí que los reporteros de jasmine no estaban resolviendo savePath correctamente y en realidad estaba publicando la carpeta de informes en el directorio jasmine-reporters en lugar del directorio raíz de donde ejecuté gulp. Para 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 }); 

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

Luego, para obtener la ruta al módulo ES actual, debe 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); 

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 le informa 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 , por lo que no lo estoy usando (aunque puede ser lo que OP pide, entonces mejor use appDirectory = process.pkg ? require('path').dirname(process.execPath) : (__dirname || require('path').dirname(process.argv[0])); notando que en modo interactivo __dirname está vacío.

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

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

 var path = require('path'); var command = getCurrentScriptPath(); console.log(`Usage: ${command}  `); 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) { // Eg "./foobar.js" return '.' + path.sep + pathToScript; } else { // Eg "foo/bar/baz.js" return pathToScript; } } 

Otro enfoque, si está utilizando módulos y desea encontrar el nombre de archivo del módulo principal que llamó a dicho submódulo o cualquier módulo que esté ejecutando, es usar

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