1109 votes

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

Comment puis-je obtenir le chemin vers le 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 je lance la commande suivante :

node /home/kyle/some/dir/file.js

Si j'appelle process.cwd() j'obtiens /home/kyle/ pas /home/kyle/some/dir/ . Y a-t-il un moyen d'obtenir ce répertoire ?

6 votes

nodejs.org/docs/latest/api/globals.html le lien de documentation de la réponse acceptée.

8voto

dmcontador Points 28

Si vous utilisez pkg pour emballer votre application, vous trouverez utile cette expression :

appDirectory = require('path').dirname(process.pkg ? process.execPath : (require.main ? require.main.filename : process.argv[0]));
  • process.pkg indique si l'application a été emballé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 packagée.

  • require.main.filename contient le chemin complet du script principal, mais il est vide lorsque Node fonctionne en mode interactif.

  • __dirname contient le chemin complet du actuel script, donc je ne l'utilise pas (bien que ce soit peut-être ce que le PO demande ; alors mieux vaut utiliser appDirectory = process.pkg ? require('path').dirname(process.execPath) : (__dirname || require('path').dirname(process.argv[0])); notant qu'en mode interactif __dirname est vide.

  • Pour le mode interactif, utilisez soit process.argv[0] pour obtenir le chemin vers l'exécutable Node ou process.cwd() pour obtenir le répertoire courant.

7voto

Michael Cole Points 351

Utilisez le basename de la méthode path module :

var path = require('path');
var filename = path.basename(__filename);
console.log(filename);

Ici est la documentation dont l'exemple ci-dessus est tiré.

Comme Dan l'a souligné, Node travaille sur Modules ECMAScript avec l'option "--experimental-modules". Le nœud 12 est toujours soutient __dirname y __filename comme ci-dessus.


Si vous utilisez le --experimental-modules il existe un approche alternative .

L'alternative est d'obtenir le chemin vers le module ES actuel :

const __filename = new URL(import.meta.url).pathname;

Et pour le répertoire contenant le module courant :

import path from 'path';

const __dirname = path.dirname(new URL(import.meta.url).pathname);

1voto

Andy Lorenz Points 63

Index.js dans tout dossier contenant des modules à exporter

const entries = {};
for (const aFile of require('fs').readdirSync(__dirname, { withFileTypes: true }).filter(ent => ent.isFile() && ent.name !== 'index.js')) {
  const [ name, suffix ] = aFile.name.split('.');
  entries[name] = require(`./${aFile.name}`);
}

module.exports = entries;

Cela trouvera tous les fichiers dans la racine du répertoire actuel, exigera et exportera chaque fichier présent avec le même nom d'exportation que la racine du nom de fichier.

0voto

Idan_Krupnik Points 123

NodeJS expose une variable globale appelée __dirname .

__dirname renvoie le chemin complet du dossier où réside le fichier JavaScript.

Ainsi, à titre d'exemple, pour Windows, si nous créons un fichier script avec la ligne suivante :

console.log(__dirname);

Et exécuter ce script en utilisant :

node ./innerFolder1/innerFolder2/innerFolder3/index.js

La sortie sera : C:\Users... <répertoire du projet> \innerFolder1\innerFolder2\innerFolder3

-3voto

dmayo3 Points 75

Si vous voulez quelque chose qui ressemble plus à $0 dans un shell script, essayez ceci :

var path = require('path');

var command = getCurrentScriptPath();

console.log(`Usage: ${command} <foo> <bar>`);

function getCurrentScriptPath () {
    // Relative path from current working directory to the location of this script
    var pathToScript = path.relative(process.cwd(), __filename);

    // Check if current working dir is the same as the script
    if (process.cwd() === __dirname) {
        // E.g. "./foobar.js"
        return '.' + path.sep + pathToScript;
    } else {
        // E.g. "foo/bar/baz.js"
        return pathToScript;
    }
}

0 votes

__dirname y __filename son n'est plus disponible avec les modules ES .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X