Je crée une interface de ligne de commande de noeud. Il est installé globalement et utilise un fichier bin pour s'exécuter.
Je prévois d'ouvrir une fenêtre de commande dans le répertoire racine des fichiers sur lesquels je travaille, puis d'exécuter la commande, mais je n'ai pas pu déterminer le répertoire de travail actuel, car process.cwd()
renvoie le répertoire du package de nœud. J'ai d'abord supposé que puisque le code est exécuté en utilisant un fichier de commandes comme wrapper (c'est ainsi que les fichiers bin peuvent s'exécuter sans noeud au début), il est alors impossible, alors coffee-script parvient à le faire. J'ai jeté un coup d'oeil à la source de café-script mais ne pouvais pas le suivre (pas assez expérimenté).
Pour le tester vous-même, créez un package avec ce fichier package.json:
{
"name": "test-package",
"version": "1.0.0",
"bin": {
"test-package": "./bin/test-package"
},
"main": "/lib/test"
}
ce fichier de test dans bin:
#!/usr/bin/env node
var path = require('path');
var fs = require('fs');
var lib = path.join(path.dirname(fs.realpathSync(__filename)), '../lib');
require(lib + '/test');
Quelqu'un pourrait-il nous éclairer?.
puis essayez d’obtenir le répertoire de ligne de commande dans lib/test.
process.cwd()
renvoie le répertoire dans lequel la commande a été exécutée (et non le package du noeud) si elle n'a pas été modifiée par 'process.chdir' dans l'application.__filename
renvoie le chemin absolu du fichier où il est placé.__dirname
renvoie le chemin absolu vers le répertoire de __filename
.Si vous devez charger des fichiers depuis votre répertoire de module, vous devez utiliser des chemins relatifs.
require('../lib/test');
au lieu de
var lib = path.join(path.dirname(fs.realpathSync(__filename)), '../lib');
require(lib + '/test');
Il est toujours relatif au fichier d'où il a appelé et ne dépend pas du répertoire de travail actuel.
Pour obtenir le répertoire de travail actuel, vous pouvez utiliser:
process.cwd()
Cependant, sachez que certains scripts, notamment gulp, modifieront le répertoire de travail actuel avec process.chdir()
.
Vous pouvez obtenir le chemin du module actuel avec:
__filename
__dirname
Si vous exécutez un script à partir de la ligne de commande et que vous voulez le répertoire d'origine à partir duquel le script a été exécuté, quel que soit le répertoire dans lequel il est actuellement utilisé, vous pouvez utiliser:
process.env.INIT_CWD
Il est parfois souhaitable d'exécuter un script NPM dans le répertoire en cours plutôt qu'à la racine du projet.
Cette variable est disponible dans les scripts de package npm en tant que:
$INIT_CWD.
Vous devez exécuter une version récente de NPM. Si cette variable n'est pas disponible, assurez-vous que NPM est à jour.
Cela vous permettra d’accéder au chemin actuel dans votre package.json, par exemple:
scripts: {
"customScript": "gulp customScript --path $INIT_CWD"
}
Si vous souhaitez uniquement obtenir le répertoire actuel du script NodeJS actuel, vous pouvez essayer quelque chose de simple comme celui-ci. Notez que cela ne fonctionnera pas dans la CLI du nœud lui-même:
var fs = require('fs'),
path = require('path');
var dirString = path.dirname(fs.realpathSync(__filename));
// output example: "/Users/jb/workspace/abtest"
console.log('directory to start walking...', dirString);
path.resolve('.')
est également une option fiable et propre, car nous avons presque toujours require('path')
. Il vous donnera le chemin absolu du répertoire à partir duquel il est appelé.