¿Hay una mejor manera que process.cwd()
determinar el directorio raíz de un proceso node.js en ejecución? Algo así como el equivalente de Rails.root
, pero para Node.js. Estoy buscando algo que sea lo más predecible y confiable posible.
315
process.env.PWD
... vea mi respuesta a continuación.Respuestas:
Hay varias formas de abordar esto, cada una con sus propios pros y contras:
require.main.filename
De http://nodejs.org/api/modules.html :
Entonces, si desea el directorio base para su aplicación, puede hacer lo siguiente:
Pros contras
Esto funcionará muy bien la mayor parte del tiempo, pero si está ejecutando su aplicación con un iniciador como pm2 o ejecutando pruebas de mocha , este método fallará.
global.X
El nodo tiene un objeto de espacio de nombres global llamado
global
: todo lo que adjunte a este objeto estará disponible en todas partes en su aplicación. Entonces, en suindex.js
(oapp.js
como se llame el archivo principal de su aplicación), puede definir una variable global:Pros contras
Funciona de manera consistente, pero debe confiar en una variable global, lo que significa que no puede reutilizar fácilmente los componentes, etc.
process.cwd ()
Esto devuelve el directorio de trabajo actual. No es fiable en absoluto, ya que es totalmente dependiente de qué directorio el proceso se puso en marcha a partir de :
app-root-path
Para solucionar este problema, he creado un módulo de nodo llamado app-root-path . El uso es simple:
El módulo app-root-path utiliza varias técnicas diferentes para determinar la ruta raíz de la aplicación, teniendo en cuenta los módulos instalados globalmente (por ejemplo, si su aplicación se está ejecutando
/var/www/
pero el módulo está instalado~/.nvm/v0.x.x/lib/node/
). No funcionará el 100% del tiempo, pero funcionará en los escenarios más comunes.Pros contras
Funciona sin configuración en la mayoría de las circunstancias. También proporciona algunos buenos métodos de conveniencia adicionales (ver página del proyecto) La mayor desventaja es que no funcionará si:
node_modules
directorio de su aplicación (por ejemplo, si lo instaló globalmente)Puede solucionar esto configurando una
APP_ROOT_PATH
variable ambiental o llamando.setPath()
al módulo, pero en ese caso, probablemente sea mejor usar elglobal
método.NODE_PATH variable ambiental
Si está buscando una manera de determinar la ruta raíz de la aplicación actual, es probable que una de las soluciones anteriores funcione mejor para usted. Si, por otro lado, está tratando de resolver el problema de cargar módulos de aplicaciones de manera confiable, le recomiendo que analice la
NODE_PATH
variable ambiental.El sistema de módulos de nodo busca módulos en una variedad de ubicaciones. Una de estas ubicaciones es donde
process.env.NODE_PATH
apunta . Si configura esta variable de entorno, puederequire
modificar los módulos con el cargador de módulos estándar sin ningún otro cambio.Por ejemplo, si establece
NODE_PATH
en/var/www/lib
, lo siguiente funcionaría bien:Una excelente manera de hacer esto es usar
npm
:Ahora puedes iniciar tu aplicación con
npm start
y eres dorado. Combino esto con mi módulo enforce-node-path , que evita cargar accidentalmente la aplicación sinNODE_PATH
configurarla. Para obtener aún más control sobre la aplicación de variables ambientales, consulte checkenv .One gotcha:
NODE_PATH
must establecerse fuera de la aplicación del nodo. No puede hacer algo asíprocess.env.NODE_PATH = path.resolve(__dirname)
porque el cargador de módulos almacena en caché la lista de directorios que buscará antes de que se ejecute su aplicación.[añadido 4/6/16] Otro módulo realmente prometedor que intenta resolver este problema es ondulado .
fuente
require.main.filename
funcionará la mayor parte del tiempo, pero no todo el tiempo.require.main.filename
parece funcionar con pm2. No sé sobre moca.path.parse(process.mainModule.filename).dir
__dirname
no es global; es local para el módulo actual, por lo que cada archivo tiene su propio valor local y diferente.Si desea el directorio raíz del proceso en ejecución, probablemente quiera usarlo
process.cwd()
.Si desea previsibilidad y confiabilidad, entonces probablemente deba exigir a su aplicación que se establezca una determinada variable de entorno. Su aplicación busca
MY_APP_HOME
(o lo que sea) y si está allí, y la aplicación existe en ese directorio, entonces todo está bien. Si no está definido o el directorio no contiene su aplicación, debería salir con un error que le indicará al usuario que cree la variable. Se puede configurar como parte de un proceso de instalación.Puede leer las variables de entorno en el nodo con algo como
process.env.MY_ENV_VARIABLE
.fuente
bin/server.js
frentecd bin && server.js
. (suponiendo que estos archivos js estén marcados como ejecutables)process.cwd()
ha funcionado de maravilla, incluso cuando realizo pruebas de mocha. ¡Gracias!1- crea un archivo en la raíz del proyecto llámalo settings.js
2- dentro de este archivo agrega este código
3- dentro de node_modules crea un nuevo módulo llamado "configuración" y dentro del módulo index.js escribe este código:
4- y cuando quieras tu directorio de proyectos solo usa
de esta manera tendrá todos los directorios de proyectos relacionados con este archivo;)
fuente
node_modules
menudo se excluye del control de versiones. Entonces, si trabaja con un equipo o alguna vez necesita clonar su repositorio, tendrá que encontrar otra solución para mantener ese archivo de configuración sincronizado.la forma más fácil de obtener la raíz global ( suponiendo que use NPM para ejecutar su aplicación node.js 'npm start', etc. )
Si desea verificar de forma cruzada lo anterior
Supongamos que desea realizar una verificación cruzada
process.env.PWD
con la configuración de su aplicación node.js. si desea que algunas pruebas de tiempo de ejecución verifiquen la validezprocess.env.PWD
, puede verificarlo con este código (que escribí, que parece funcionar bien). Puede verificar el nombre de la última carpeta en appRoot con npm_package_name en su archivo package.json, por ejemplo:También puede usar este módulo NPM:
require('app-root-path')
que funciona muy bien para este propósitofuente
PWD
no está definido y esto falla.process.cwd()
process.cwd()
siempre sería lo mismo que la raíz del proyecto?He descubierto que esto funciona de manera consistente para mí, incluso cuando la aplicación se invoca desde una subcarpeta, como puede ser con algunos marcos de prueba, como Mocha:
Por qué funciona
En el tiempo de ejecución, el nodo crea un registro de las rutas completas de todos los archivos cargados. Los módulos se cargan primero y, por lo tanto, en la parte superior de este registro. Al seleccionar el primer elemento del registro y devolver la ruta antes del directorio 'node_modules', podemos determinar la raíz de la aplicación.
Es solo una línea de código, pero en aras de la simplicidad (mi bien), lo coloqué en una caja negra en un módulo NPM:
https://www.npmjs.com/package/node-root.pddivine
¡Disfrutar!
fuente
process.mainModule
obsoleto desde: v14.0.0 - userequire.main.paths[0].split('node_modules')[0].slice(0, -1);
en su lugar.Todos estos "directorios raíz" en su mayoría necesitan resolver alguna ruta virtual a una ruta de pila real, por lo que puede ser que debería mirar
path.resolve
?fuente
Tan simple como agregar esta línea a su módulo en la raíz, generalmente es app.js
Entonces _basedir será accesible a todos sus módulos.
fuente
Tal vez pueda intentar recorrer hacia arriba
__filename
hasta encontrar unpackage.json
y decidir que es el directorio principal al que pertenece su archivo actual.fuente
En realidad, encuentro la solución quizás trivial también para los más robustos: simplemente coloque el siguiente archivo en el directorio raíz de su proyecto: root-path.js que tiene el siguiente código:
fuente
Una técnica que he encontrado útil cuando uso express es agregar lo siguiente a app.js antes de configurar cualquiera de sus otras rutas
No es necesario usar globales y tiene la ruta del directorio raíz como una propiedad del objeto de solicitud.
Esto funciona si su app.js está en la raíz de su proyecto que, por defecto, lo está.
fuente
Agregue esto en algún lugar hacia el inicio de su archivo de aplicación principal (por ejemplo, app.js):
Esto establece una variable global que siempre será equivalente al directorio base de su aplicación. Úselo como cualquier otra variable:
Sencillo...
fuente
Sé que este ya es demasiado tarde. Pero podemos obtener la URL raíz por dos métodos
1er método
2do método
Enlace de referencia: - https://gist.github.com/geekiam/e2e3e0325abd9023d3a3
fuente
Hay una
INIT_CWD
propiedad enprocess.env
. Esto es con lo que estoy trabajando actualmente en mi proyecto.Buena suerte...
fuente
INIT_CWD
resuelve adirectory
partir del cualnpm-script
se ejecutó el.si desea determinar la raíz del proyecto a partir de una aplicación node.js en ejecución, simplemente puede hacerlo también.
fuente
En la parte superior del archivo principal, agregue:
Luego, úselo en cualquier archivo que necesite:
mainDir
se define globalmente, si lo necesita solo en el archivo actual, use__dirname
en su lugar.main.js
,index.js
,gulpfile.js
.fuente
Yo uso esto.
Para mi módulo llamado
mymodule
var BASE_DIR = __dirname.replace(/^(.*\/mymodule)(.*)$/, '$1')
fuente
Hazlo sexy 💃🏻.
Tres pasos simples para resolver el problema del camino feo.
npm install sexy-require --save
Incluya
require('sexy-require')
una vez en la parte superior de su archivo de aplicación principal.Paso opcional La configuración de ruta se puede definir en el
.paths
archivo en el directorio raíz de su proyecto.fuente
Esto reducirá el árbol de directorios hasta que contenga un
node_modules
directorio, que generalmente indica la raíz del proyecto:También se asegura de que no haya ninguna
node_modules
en la ruta devuelta, ya que eso significa que está contenida en una instalación de paquete anidado.fuente
Obtenga todas las rutas en los módulos principales y filtre aquellas con "node_modules", luego obtenga la primera de la lista de rutas restante. El comportamiento inesperado no arrojará un error, solo un
undefined
.Funciona bien para mí, incluso cuando llama, es decir
$ mocha
.fuente
Crea una función en app.js
/*Function to get the app root folder*/
fuente
Simplemente puede agregar la ruta del directorio raíz en la variable de la aplicación express y obtener esta ruta de la aplicación. Para esto, agregue
app.set('rootDirectory', __dirname);
su archivo index.js o app.js. Y úseloreq.app.get('rootDirectory')
para obtener la ruta del directorio raíz en su código.fuente
Antigua pregunta, lo sé, sin embargo, no hay ninguna mención para usar
progress.argv
. La matriz argv incluye una ruta completa y un nombre de archivo (con o sin extensión .js) que se utilizó como parámetro para ser ejecutado por el nodo. Como esto también puede contener banderas, debe filtrar esto.Este no es un ejemplo que puede usar directamente (debido a que uso mi propio marco) pero creo que le da una idea de cómo hacerlo. También utilizo un método de caché para evitar que llamar a esta función estrese demasiado el sistema, especialmente cuando no se especifica ninguna extensión (y se requiere una verificación de la existencia del archivo), por ejemplo:
o
Esa es la razón por la que lo guardo en caché, vea también el código a continuación.
fuente
Encontrar la ruta raíz de una aplicación electrónica podría ser complicado. Debido a que la ruta raíz es diferente para el proceso principal y el procesador en diferentes condiciones, como la producción, el desarrollo y las condiciones empaquetadas.
He escrito un paquete npm electron-root-path para capturar la ruta raíz de una aplicación de electrones.
fuente
Esto lo hara:
fuente
Funciona para mi
fuente
Preámbulo
Esta es una pregunta muy antigua, pero parece que todavía se tocó el nervio en 2020 como en 2012. Revisé todas las otras respuestas y no pude encontrar una técnica (tenga en cuenta que esto tiene sus limitaciones, pero todas las demás no son aplicable en todas las situaciones también).
Proceso hijo GIT +
Si está utilizando GIT como su sistema de control de versiones, el problema de determinar la raíz del proyecto se puede reducir a (que consideraría la raíz correcta del proyecto; después de todo, desearía que su VCS tenga el alcance de visibilidad más completo posible) :
Como debe ejecutar un comando CLI para hacerlo, necesitaremos generar un proceso secundario. Además, como es muy poco probable que la raíz del proyecto cambie a mitad del tiempo de ejecución, podemos usar la versión síncrona de las
child_process
API del módulo al inicio.Me pareció
spawnSync()
el más adecuado para el trabajo. En cuanto al comando real para ejecutar,git worktree
(con una--porcelain
opción para facilitar el análisis) es todo lo que necesitamos para recuperar la ruta raíz absoluta.En la muestra, opté por devolver una matriz de rutas porque podría haber más de un árbol de trabajo (aunque es probable que tengan rutas comunes) solo para estar seguro. Tenga en cuenta que, como utilizamos un comando CLI, la
shell
opción debe establecersetrue
(la seguridad no debería ser un problema ya que no hay entradas no confiables).Enfoque de comparación y retrocesos
Comprendiendo que en una situación en la que VCS puede ser inaccesible, he incluido un par de retrocesos después de analizar documentos y otras respuestas. En resumen, las soluciones propuestas se reducen a (excluyendo módulos de terceros y paquetes específicos):
De la tabla de comparación anterior, los más universales son dos enfoques:
require.main.filename
como una manera fácil de obtener root sirequire.main === module
se cumplenode_modules
caminata de árbol propuesta recientemente utiliza otra suposición:Para la aplicación principal obtendrá la raíz de la aplicación y para el módulo, la raíz del proyecto.
Fallback 1. Caminata por el árbol
Mi implementación utiliza un enfoque más laxo al detenerse una vez que se encuentra un directorio de destino, ya que para un módulo dado su raíz es la raíz del proyecto. Uno puede encadenar las llamadas o extenderlo para configurar la profundidad de búsqueda:
Fallback 2. Módulo principal
La segunda implementación es trivial
Implementación
Sugeriría usar el andador de árboles como respaldo porque es más versátil:
Desventajas
Lo más obvio es tener GIT instalado e inicializado, lo que puede ser indeseable / inverosímil (nota al margen: tener GIT instalado en servidores de producción no es infrecuente, ni es inseguro ). Puede estar mediado por retrocesos como se describe anteriormente.
Notas
export
la función para convertirlo en un móduloReferencias
git worktree
referenciaspawnSync
referenciarequire.main
referenciapath.dirname()
referenciafuente
Sencillo:
require('path').resolve('./')
fuente
Tratar
path._makeLong('some_filename_on_root.js');
ejemplo:
Eso devolverá la ruta completa desde la raíz de su aplicación de nodo (misma posición de package.json)
fuente
Solo usa:
fuente
fuente