Comment pourrais-je obtenir le chemin du script dans Node.js?
Je sais qu'il y 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 dans /home/kyle/
et que je lance la commande suivante:
node /home/kyle/some/dir/file.js
Si j'appelle process.cwd()
, j'obtiens /home/kyle/
et non /home/kyle/some/dir/
. Y a-t-il un moyen d'obtenir ce répertoire?
Je l'ai trouvé après avoir parcouru à nouveau la documentation. Ce que je cherchais, ce sont les __filename
et __dirname
variables au niveau du module.
__filename
_ est le nom de fichier du module actuel. C'est le 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
_)Donc, fondamentalement, vous pouvez faire ceci:
fs.readFile(path.resolve(__dirname, 'settings.json'), 'UTF-8', callback);
Utilisez resol () au lieu de concaténer avec '/' ou '\', sinon vous rencontrerez des problèmes multi-plateformes.
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, il est:
require.main.filename
ou, juste pour obtenir le nom du dossier:
require('path').dirname(require.main.filename)
Cette commande renvoie le répertoire en cours:
var currentPath = process.cwd();
Par exemple, pour utiliser le chemin d'accès pour lire le fichier:
var fs = require('fs');
fs.readFile(process.cwd() + "\\text.txt", function(err, data)
{
if(err)
console.log(err)
else
console.log(data.toString());
});
Utilisez __dirname !!
__dirname
Le nom du répertoire du module actuel. Identique à path.dirname () de __filename
.
Exemple: exécutez le noeud example.js à partir de/Users/mjr
console.log(__dirname);
// Prints: /Users/mjr
console.log(path.dirname(__filename));
// Prints: /Users/mjr
https://nodejs.org/api/modules.html#modules_dirname
Pour les ESModules, vous voudriez utiliser: import.meta.url
En ce qui concerne le script principal, c'est aussi simple que:
process.argv[1]
De la documentation Node.js :
process.argv
Un tableau contenant les arguments de la ligne de commande. Le premier élément sera "noeud", , le deuxième élément sera le chemin d'accès au fichier JavaScript . Les éléments suivants seront tous les arguments de ligne de commande supplémentaires.
Si vous avez besoin de connaître le chemin d’un fichier de module, utilisez __ filename .
var settings =
JSON.parse(
require('fs').readFileSync(
require('path').resolve(
__dirname,
'settings.json'),
'utf8'));
Chaque programme Node.js a des variables globales dans son environnement, qui représentent des informations sur votre processus, dont l'une est __dirname
.
Node.js 10 prend en charge modules ECMAScript , où __dirname
et __filename
ne sont plus disponibles .
Ensuite, pour obtenir le chemin du module ES actuel il faut utiliser:
import { fileURLToPath } from 'url';
const __filename = fileURLToPath(import.meta.url);
Et pour le répertoire contenant le module actuel:
import { dirname } from 'path';
import { fileURLToPath } from 'url';
const __dirname = dirname(fileURLToPath(import.meta.url));
Je sais que c'est assez vieux et que la question initiale à laquelle je répondais est marquée comme étant en double et posée ici, mais j'ai rencontré un problème qui tentait de faire travailler les reporters de jasmin et je n'aimais pas l'idée que je devais rétrograder ordre pour que cela fonctionne. J'ai découvert que jasmine-reporters ne résolvait pas correctement savePath et mettait en fait la sortie du dossier de rapports dans le répertoire jasmine-reporters au lieu du répertoire racine où j'ai exécuté gulp. Afin 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 dans lequel vous avez exécuté gulp. J'espère que ça aide quelqu'un.
var reporters = require('jasmine-reporters');
var junitReporter = new reporters.JUnitXmlReporter({
savePath: process.env.INIT_CWD + '/report/e2e/',
consolidateAll: true,
captureStdout: true
});
Vous pouvez utiliser process.env.PWD pour obtenir le chemin d'accès au dossier actuel de l'application.
Si vous utilisez pkg
pour emballer votre application, vous trouverez cette expression utile:
appDirectory = require('path').dirname(process.pkg ? process.execPath : (require.main ? require.main.filename : process.argv[0]));
process.pkg
indique si l'application a été empaquetée par pkg
.
process.execPath
contient le chemin complet de l'exécutable, qui est /usr/bin/node
ou similaire pour les invocations directes de scripts (node test.js
), ou l'application fournie.
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 cela puisse être ce que demande OP; puis, mieux vaut utiliser appDirectory = process.pkg ? require('path').dirname(process.execPath) : (__dirname || require('path').dirname(process.argv[0]));
, notant que le mode interactif __dirname
est vide.
Pour le mode interactif, utilisez process.argv[0]
pour obtenir le chemin de l'exécutable Node ou process.cwd()
pour obtenir le répertoire en cours.
Utilisez la méthode basename
du module path
:
var path = require('path');
var filename = path.basename(__filename);
console.log(filename);
Here est la documentation à partir de laquelle l'exemple ci-dessus est extrait.
Comme Dan l'a souligné, Node travaille modules ECMAScript avec l'indicateur "--experimental-modules". Node 12 encore prend en charge __dirname
et __filename
comme ci-dessus.
Si vous utilisez l'indicateur --experimental-modules
, il existe une approche alternative .
L'alternative consiste à obtenir le chemin d'accès au module ES actuel :
const __filename = new URL(import.meta.url).pathname;
Et pour le répertoire contenant le module actuel:
import path from 'path';
const __dirname = path.dirname(new URL(import.meta.url).pathname);