¿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 porpkg
.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 mejorappDirectory = 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 oprocess.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
var settings =
JSON.parse(
require(''fs'').readFileSync(
require(''path'').resolve(
__dirname,
''settings.json''),
''utf8''));