¿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ó al script, no al script en sí. Por ejemplo, digamos que estoy /home/kyle/
y ejecuto el siguiente comando:
node /home/kyle/some/dir/file.js
Si llamo process.cwd()
, recibo /home/kyle/
, no /home/kyle/some/dir/
. ¿Hay alguna manera de obtener ese directorio?
Respuestas:
Lo encontré después de revisar la documentación nuevamente. Lo que estaba buscando eran los
__filename
y__dirname
las variables de nivel de módulo.__filename
es el nombre del archivo del módulo actual. Esta es la ruta absoluta resuelta del archivo del módulo actual. (ej ./home/kyle/some/dir/file.js
:)__dirname
es el nombre del directorio del módulo actual. (ej ./home/kyle/some/dir
:)fuente
__dirname.split(path.sep).pop()
require('path').basename(__dirname);
Entonces básicamente puedes hacer esto:
Use resolve () en lugar de concatenar con '/' o '\', de lo contrario, se encontrará con problemas multiplataforma.
Nota: __dirname es la ruta local del módulo o script incluido. Si está escribiendo un complemento que necesita conocer la ruta del script principal, es:
o simplemente para obtener el nombre de la carpeta:
fuente
var settings = require('./settings.json')
. Por supuesto, es síncrono fs IO, así que no lo hagas en tiempo de ejecución, pero en el momento del inicio está bien, y una vez que esté cargado, se almacenará en caché.Este comando devuelve el directorio actual:
Por ejemplo, para usar la ruta para leer el archivo:
fuente
cd /foo; node bar/test.js
, el directorio actual sería/foo
, pero el script se encuentra en/foo/bar/test.js
.text.txt
y funcionaría, no necesita construir la ruta absolutaUse __dirname !!
El nombre del directorio del módulo actual. Esto es lo mismo que la ruta.dirname () del
__filename
.Ejemplo: ejecutar nodo example.js desde / Users / mjr
https://nodejs.org/api/modules.html#modules_dirname
Para ESModules, querrá usar:
import.meta.url
fuente
Cuando se trata del guión principal, es tan simple como:
De la documentación de Node.js :
Si necesita conocer la ruta de un archivo de módulo, use __filename .
fuente
process.argv[1]
aplica solo al script principal mientras__filename
señala el archivo del módulo que se está ejecutando. Actualizo mi respuesta para enfatizar la diferencia. Aún así, no veo nada malo en usarprocess.argv[1]
. Depende de los requisitos de uno.Node.js 10 admite módulos ECMAScript , donde
__dirname
y__filename
ya no están disponibles .Luego, para obtener la ruta al módulo ES actual, uno debe usar:
Y para el directorio que contiene el módulo actual:
fuente
--experimental-modules
bandera.fuente
__dirname
ya no funciona con módulos ES .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
.fuente
__dirname
ya no funciona con los módulos ES .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 tratando de hacer que los reporteros de jazmín trabajen y no me gustó la idea de que tuve que degradar Para que funcione. Descubrí que jasmine-reporters no estaba resolviendo el savePath correctamente y en realidad estaba poniendo la salida de 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.
fuente
Puede usar process.env.PWD para obtener la ruta actual de la carpeta de la aplicación.
fuente
Si está utilizando
pkg
para empaquetar su aplicación, encontrará útil esta expresión:process.pkg
indica 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
mantiene la ruta completa de la secuencia de comandos actual , por lo que no la estoy usando (aunque puede ser lo que OP pide; entonces mejor usarlo,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 Nodo ejecutable oprocess.cwd()
para obtener el directorio actual.fuente
Use el
basename
método delpath
módulo:Aquí está la documentación de la que se tomó el ejemplo anterior.
Como Dan señaló, Node está trabajando en módulos ECMAScript con el indicador "--experimental-modules". El nodo 12 todavía es compatible
__dirname
y__filename
como el anterior.Si está utilizando la
--experimental-modules
bandera, hay un enfoque alternativo .La alternativa es obtener la ruta al módulo ES actual :
Y para el directorio que contiene el módulo actual:
fuente
Si desea algo más como $ 0 en un script de shell, intente esto:
fuente
__dirname
y__filename
ya no están disponibles con módulos ES .