Determina la directory di lavoro della riga di comando durante l'esecuzione dello script bin del nodo


120

Sto creando un'interfaccia a riga di comando del nodo. Viene installato globalmente e utilizza un file bin per l'esecuzione.

Ho in programma di aprire una finestra di comando nella directory principale dei file su cui sto lavorando e quindi eseguire il comando, tuttavia non sono stato in grado di determinare la directory di lavoro corrente poiché process.cwd()restituisce la directory del pacchetto del nodo. Inizialmente ho pensato che, poiché il codice viene eseguito utilizzando un file batch come wrapper (è così che i file bin possono essere eseguiti senza nodo all'inizio), allora è impossibile ma coffee-script riesce a farlo. Ho dato un'occhiata alla fonte della sceneggiatura del caffè ma non sono riuscita a seguirla (non abbastanza esperto).

Per testarlo tu stesso, crea un pacchetto con questo file package.json:

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

questo file del pacchetto di test 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');

Qualcuno potrebbe far luce su questo.

e quindi provare a ottenere la directory della riga di comando all'interno di lib / test.

Risposte:


196
  • process.cwd() restituisce la directory in cui è stato eseguito il comando (non la directory del pacchetto del nodo) se non è stata modificata da 'process.chdir' all'interno dell'applicazione.
  • __filename restituisce il percorso assoluto del file in cui è posizionato.
  • __dirnamerestituisce il percorso assoluto alla directory di __filename.

Se è necessario caricare file dalla directory del modulo è necessario utilizzare i percorsi relativi.

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

invece di

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

require(lib + '/test');

È sempre relativo al file da cui è stato chiamato e non dipende dalla directory di lavoro corrente.


2
Dopo process.chdir(), c'è un modo per ottenere l'originale?
reergymerej

@reergymerej Probabilmente vorrai memorizzare cwd prima di eseguire chdir () (ad esempio, var originalCwd = process.cwd();quindi eseguire your process.chdir(), e puoi tornare all'originale in seguito).
Girevole

è ../lib/testportatile?
Sebastian

No. Non è una soluzione portatile perché Windows utilizza i backslash. Quindi se provi a eseguirlo in Windows non funzionerà.
Zachdyer

1
In realtà per NodeJS questo è lo stesso. Anche su Windows puoi comodamente richiedere percorsi relativi in ​​modo Unix. Quindi ../lib/testè portatile, mentre la controparte di Windows ..\lib\testnon è ...
Christian Ulbrich,

48

Directory di lavoro corrente

Per ottenere la directory di lavoro corrente, puoi usare:

process.cwd()

Tuttavia, tieni presente che alcuni script, in particolare gulp, cambieranno la directory di lavoro corrente con process.chdir().

Percorso modulo nodo

Puoi ottenere il percorso del modulo corrente con:

  • __filename
  • __dirname

Directory originale (dove è stato avviato il comando)

Se si esegue uno script dalla riga di comando e si desidera la directory originale da cui è stato eseguito lo script, indipendentemente dalla directory in cui lo script è attualmente in esecuzione, è possibile utilizzare:

process.env.INIT_CWD

Directory originale, quando si lavora con gli script NPM

A volte è preferibile eseguire uno script NPM nella directory corrente, piuttosto che nella radice del progetto.

Questa variabile è disponibile negli script del pacchetto npm come:

$INIT_CWD.

È necessario eseguire una versione recente di NPM. Se questa variabile non è disponibile, assicurati che NPM sia aggiornato.

Ciò ti consentirà di accedere al percorso corrente nel tuo package.json, ad esempio:

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

process.env.INIT_CWDrestituisce la dir dipackage.json
vaughan

2
Attenzione, $ INIT_CWD funziona solo su Linux. Per Windows, dovrai usare% INIT_CWD%. Penso che questo problema possa essere superato utilizzando npmjs.com/package/cross-env , ma non l'ho provato io stesso
Stephanie

3

In alternativa, se desideri ottenere esclusivamente la directory corrente dello script NodeJS corrente, potresti provare qualcosa di semplice come questo. Tieni presente che questo non funzionerà nella stessa CLI del nodo:

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

3

path.resolve('.')è anche un'opzione affidabile e pulita, perché quasi sempre require('path'). Ti darà il percorso assoluto della directory da cui viene chiamato.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.