¿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
__filenamey__dirnamelas variables de nivel de módulo.__filenamees 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:)__dirnamees 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.txty 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.urlfuente
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__filenameseñ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
__dirnamey__filenameya 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-modulesbandera.fuente
__dirnameya 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
__dirnameya 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
pkgpara empaquetar su aplicación, encontrará útil esta expresión:process.pkgindica si la aplicación ha sido empaquetada porpkg.process.execPathcontiene la ruta completa del ejecutable, que es/usr/bin/nodeo similar para las invocaciones directas de scripts (node test.js), o la aplicación empaquetada.require.main.filenamecontiene la ruta completa del script principal, pero está vacía cuando Node se ejecuta en modo interactivo.__dirnamemantiene 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__dirnameestá 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
basenamemétodo delpathmó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
__dirnamey__filenamecomo el anterior.Si está utilizando la
--experimental-modulesbandera, 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
__dirnamey__filenameya no están disponibles con módulos ES .