Comment puis-je obtenir le chemin d'accès au script dans Node.js?
Je sais qu'il y en a process.cwd
, mais cela ne fait référence qu'au répertoire où le script a été appelé, pas au script lui-même. Par exemple, disons que je suis dedans /home/kyle/
et que j'exécute la commande suivante:
node /home/kyle/some/dir/file.js
Si j'appelle process.cwd()
, je reçois /home/kyle/
, non /home/kyle/some/dir/
. Existe-t-il un moyen d'obtenir ce répertoire?
Réponses:
Je l'ai trouvé après avoir parcouru à nouveau la documentation. Ce que je cherchais, c'était les variables de niveau module
__filename
et__dirname
.__filename
est le nom de fichier du module actuel. Il s'agit du chemin absolu résolu du fichier de module actuel. (ex:/home/kyle/some/dir/file.js
)__dirname
est le nom du répertoire du module actuel. (ex:/home/kyle/some/dir
)la source
__dirname.split(path.sep).pop()
require('path').basename(__dirname);
Donc, fondamentalement, vous pouvez le faire:
Utilisez resolver () au lieu de concaténer avec '/' ou '\' sinon vous rencontrerez des problèmes multiplates-formes.
Remarque: __dirname est le chemin local du module ou du script inclus. Si vous écrivez un plugin qui a besoin de connaître le chemin du script principal c'est:
ou, pour obtenir simplement le nom du dossier:
la source
var settings = require('./settings.json')
. Bien sûr, il s'agit d'E / S fs synchrones, alors ne le faites pas au moment de l'exécution, mais au moment du démarrage, tout va bien, et une fois qu'il sera chargé, il sera mis en cache.Cette commande renvoie le répertoire courant:
Par exemple, pour utiliser le chemin d'accès pour lire le fichier:
la source
cd /foo; node bar/test.js
, le répertoire courant le serait/foo
, mais le script se trouve dans/foo/bar/test.js
.text.txt
et que cela fonctionnerait, vous n'avez pas besoin de construire le chemin absoluUtilisez __dirname !!
Le nom du répertoire du module actuel. C'est la même chose que le path.dirname () du
__filename
.Exemple: exécution de node example.js à partir de / Users / mjr
https://nodejs.org/api/modules.html#modules_dirname
Pour les ESModules, vous souhaitez utiliser:
import.meta.url
la source
En ce qui concerne le script principal, c'est aussi simple que:
Dans la documentation Node.js :
Si vous avez besoin de connaître le chemin d'un fichier de module, utilisez __filename .
la source
process.argv[1]
s'applique uniquement au script principal alors qu'il__filename
pointe vers le fichier de module en cours d'exécution. Je mets à jour ma réponse pour souligner la différence. Pourtant, je ne vois rien de mal à utiliserprocess.argv[1]
. Dépend de ses besoins.Node.js 10 prend en charge les modules ECMAScript , où
__dirname
et__filename
ne sont plus disponibles .Ensuite, pour obtenir le chemin vers le module ES actuel, il faut utiliser:
Et pour le répertoire contenant le module courant:
la source
--experimental-modules
indicateur.la source
__dirname
ne fonctionne plus avec les modules ES .Chaque programme Node.js a des variables globales dans son environnement, qui représentent des informations sur votre processus et l'une d'elles
__dirname
.la source
__dirname
ne fonctionne plus avec les modules ES .Je sais que c'est assez vieux, et la question d'origine à laquelle je répondais est marquée comme dupliquée et dirigée ici, mais j'ai rencontré un problème en essayant de faire travailler les reporters de jasmin et je n'aimais pas l'idée que je devais rétrograder dans pour qu'il fonctionne. J'ai découvert que jasmine-reporters ne résolvait pas correctement le savePath et mettait en fait la sortie du dossier de rapports dans le répertoire jasmine-reporters au lieu du répertoire racine de l'endroit où j'ai exécuté gulp. Pour que cela fonctionne correctement, j'ai fini par utiliser process.env.INIT_CWD pour obtenir le répertoire de travail actuel initial qui devrait être le répertoire où vous avez exécuté gulp. J'espère que cela aide quelqu'un.
la source
Vous pouvez utiliser process.env.PWD pour obtenir le chemin du dossier d'application actuel.
la source
Si vous utilisez
pkg
pour empaqueter votre application, vous trouverez cette expression utile:process.pkg
indique si l'application a été mise en package parpkg
.process.execPath
contient le chemin complet de l'exécutable, qui est/usr/bin/node
ou similaire pour les appels directs de scripts (node test.js
), ou de l'application empaquetée.require.main.filename
contient le chemin complet du script principal, mais il est vide lorsque Node s'exécute en mode interactif.__dirname
contient le chemin complet du script actuel , donc je ne l'utilise pas (bien que ce soit peut-être ce que demande OP; alors mieux vautappDirectory = process.pkg ? require('path').dirname(process.execPath) : (__dirname || require('path').dirname(process.argv[0]));
noter qu'en mode interactif__dirname
est vide.Pour le mode interactif, utilisez soit
process.argv[0]
pour obtenir le chemin d'accès à l'exécutable Node, soitprocess.cwd()
pour obtenir le répertoire courant.la source
Utilisez la
basename
méthode dupath
module:Voici la documentation dont l'exemple ci-dessus est tiré.
Comme Dan l'a souligné, Node travaille sur des modules ECMAScript avec l'indicateur "--experimental-modules". Le noeud 12 prend
__dirname
__filename
toujours en charge et comme ci-dessus.Si vous utilisez le
--experimental-modules
drapeau, il existe une approche alternative .L'alternative est d'obtenir le chemin vers le module ES actuel :
Et pour le répertoire contenant le module courant:
la source
Si vous voulez quelque chose de plus comme $ 0 dans un script shell, essayez ceci:
la source
__dirname
et ne__filename
sont plus disponibles avec les modules ES .