web-dev-qa-db-fra.com

Comment obtenir le chemin du script actuel avec Node.js?

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?

894
Kyle Slattery

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_)
1279
Kyle Slattery

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)
226
Marc

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());
});
90
Masoud Siahkali

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

73
Azarus

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 .

44
Lukasz Wiktor
var settings = 
    JSON.parse(
        require('fs').readFileSync(
            require('path').resolve(
                __dirname, 
                'settings.json'),
            'utf8'));
26
foobar

Chaque programme Node.js a des variables globales dans son environnement, qui représentent des informations sur votre processus, dont l'une est __dirname.

23

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));
20
GOTO 0

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
});
9
Dana Harris

Vous pouvez utiliser process.env.PWD pour obtenir le chemin d'accès au dossier actuel de l'application.

8
AbiSivam

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.

6
dmcontador

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);
1
Michael Cole