it-swarm.com.de

Bestimmen Sie das Befehlszeilen-Arbeitsverzeichnis, wenn Sie das Knoten-Bin-Skript ausführen

Ich erstelle eine Knoten-Befehlszeilenschnittstelle. Es ist global installiert und verwendet eine bin-Datei zur Ausführung.

Ich habe vor, ein Befehlsfenster im Stammverzeichnis der Dateien zu öffnen, an denen ich gerade arbeite, und dann einfach den Befehl auszuführen. Allerdings konnte ich das aktuelle Arbeitsverzeichnis nicht ermitteln, da process.cwd() das Verzeichnis des Knotenpakets zurückgibt. Ich ging zunächst davon aus, dass, da der Code unter Verwendung einer Batchdatei als Wrapper ausgeführt wird (das ist, wie Bin-Dateien ohne Knoten am Anfang ausgeführt werden können), dies unmöglich ist, aber coffee-script es schafft. Ich habe mir die Quelle für das Kaffeeskript angesehen, konnte es aber nicht verfolgen (nicht genug erfahren).

Um es für sich selbst zu testen, erstellen Sie ein Paket mit dieser package.json-Datei:

{
  "name": "test-package",
  "version": "1.0.0",
  "bin": {
    "test-package":  "./bin/test-package"
  },
  "main": "/lib/test"
}

diese Testpaket-Datei in 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');

Könnte jemand etwas Licht in dieses Licht werfen?.

und versuchen Sie dann, das Befehlszeilenverzeichnis in lib/test aufzurufen.

93
  • process.cwd() gibt das Verzeichnis zurück, in dem der Befehl ausgeführt wurde (nicht das Verzeichnis des Knotenpakets), wenn es von 'process.chdir' in der Anwendung nicht geändert wurde.
  • __filename gibt den absoluten Pfad zur Datei zurück, in der sie abgelegt wurde.
  • __dirname gibt den absoluten Pfad zum Verzeichnis von __filename zurück.

Wenn Sie Dateien aus Ihrem Modulverzeichnis laden müssen, müssen Sie relative Pfade verwenden.

require('../lib/test');

anstatt 

var lib  = path.join(path.dirname(fs.realpathSync(__filename)), '../lib');

require(lib + '/test');

Es ist immer relativ zur Datei, von der es aufgerufen wurde, und ist nicht vom aktuellen Arbeitsverzeichnis abhängig.

163
Vadim Baryshev

Aktuelles Arbeitsverzeichnis

Um das aktuelle Arbeitsverzeichnis abzurufen, können Sie Folgendes verwenden:

process.cwd()

Beachten Sie jedoch, dass einige Skripte, insbesondere "gulp", das aktuelle Arbeitsverzeichnis mit process.chdir() ändern.

Knotenmodulpfad

Den Pfad des aktuellen Moduls erhalten Sie mit:

  • __filename
  • __dirname

Ursprüngliches Verzeichnis (wo der Befehl eingeleitet wurde)

Wenn Sie ein Skript über die Befehlszeile ausführen und das ursprüngliche Verzeichnis, in dem das Skript ausgeführt wurde, möchten, unabhängig davon, in welchem ​​Verzeichnis das Skript derzeit ausgeführt wird, können Sie Folgendes verwenden:

process.env.INIT_CWD

Originalverzeichnis, wenn mit NPM-Skripts gearbeitet wird

Manchmal ist es wünschenswert, ein NPM-Skript im aktuellen Verzeichnis und nicht im Stammverzeichnis des Projekts auszuführen.

Diese Variable ist in npm-Paketskripten verfügbar als:

$INIT_CWD.

Sie müssen eine aktuelle Version von NPM ausführen. Wenn diese Variable nicht verfügbar ist, stellen Sie sicher, dass NPM auf dem neuesten Stand ist.

So können Sie auf den aktuellen Pfad in package.json zugreifen, z. B .:

scripts: {
  "customScript": "gulp customScript --path $INIT_CWD"
}
21
superluminary

Wenn Sie alternativ nur das aktuelle Verzeichnis des aktuellen NodeJS-Skripts abrufen möchten, können Sie Folgendes versuchen. Beachten Sie, dass dies in der Node-CLI selbst nicht funktioniert:

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('.') ist auch eine zuverlässige und saubere Option, weil wir fast immer require('path'). Es gibt Ihnen den absoluten Pfad des Verzeichnisses, von dem es aufgerufen wird. 

0
sziraqui