2012-09-02 8 views
71

Sto creando un'interfaccia della riga di comando del nodo. È installato a livello globale e utilizza un file bin da eseguire.Determinare la directory di lavoro della riga di comando quando si esegue lo script del nodo bin

Ho intenzione di avere una finestra di comando aperta nella directory principale dei file su cui sto lavorando e quindi eseguo il comando ma non sono stato in grado di determinare la directory di lavoro corrente come process.cwd() restituisce la directory del pacchetto del nodo . Inizialmente pensavo che dal momento che il codice viene eseguito utilizzando un file batch come wrapper (ovvero come i file bin possono essere eseguiti senza nodo all'inizio), è impossibile, ma coffee-script riesce a farlo. Ho dato un'occhiata alla fonte del caffè-script ma non ho potuto seguirlo (non abbastanza esperto).

di provarlo per voi stessi creare 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 test-pacchetto 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 fare luce su questo.

e quindi provare e ottenere la directory della riga di comando in lib/test.

risposta

131
  • process.cwd() rendimenti directory in cui è stato eseguito il comando (non directory del pacchetto nodo) se è non è stato cambiato da 'process.chdir' all'interno dell'applicazione.
  • __filename restituisce il percorso assoluto al file in cui è posizionato.
  • __dirname restituisce il percorso assoluto alla directory di __filename.

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

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

invece di

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

require(lib + '/test'); 

E 'sempre relativa al file in cui si chiama da e non dipendono directory di lavoro corrente.

+2

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

+0

@reergymerej Probabilmente vorrai memorizzare cwd prima di eseguire chdir() (ad esempio, 'var originalCwd = process.cwd();' quindi esegui il tuo 'process.chdir()', e potrai tornare all'originale in seguito). – Swivel

+0

è '../ lib/test' portatile? – Sebastian

2

In alternativa, se si desidera ottenere esclusivamente la directory corrente dello script NodeJS corrente, è possibile provare qualcosa di semplice come questo. Si noti che questo non funzionerà nella CLI del nodo stesso:

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