web-dev-qa-db-fra.com

Déterminer le répertoire de travail en ligne de commande lors de l'exécution du script bin du noeud

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.

93
Daniel Chatfield
  • 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.

163
Vadim Baryshev

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().

Chemin du module de noeud

Vous pouvez obtenir le chemin du module actuel avec:

  • __filename
  • __dirname

Répertoire d'origine (où la commande a été lancée)

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

Répertoire original, lors de l'utilisation de scripts NPM

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"
}
21
superluminary

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);
4

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é. 

0
sziraqui