2012-09-02 59 views
71

我正在創建一個節點命令行界面。它在全局安裝並使用bin文件執行。確定運行節點bin腳本時的命令行工作目錄

我打算在我正在使用的文件的根目錄下打開一個命令窗口,然後只是運行該命令,但是我一直無法確定當前工作目錄爲process.cwd()正在返回節點包的目錄。我最初認爲,由於代碼是使用批處理文件作爲包裝來執行的(這就是bin文件如何在沒有節點的情況下執行),那麼這是不可能的,但是咖啡腳本可以做到這一點。我看了一下咖啡腳本的源代碼,但無法遵循它(沒有足夠的經驗)。

爲了測試它爲自己創建一個包,這個文件的package.json:

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

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

任何人都可以提供一些線索到此。

然後嘗試獲取lib/test中的命令行目錄。

回答

131
  • process.cwd()返回執行命令的目錄(不是節點包的目錄),如果它沒有被應用程序內部的'process.chdir'所改變。
  • __filename返回文件放置位置的絕對路徑。
  • __dirname返回到目錄__filename的絕對路徑。

如果您需要從模塊目錄加載文件,則需要使用相對路徑。

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

代替

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

require(lib + '/test'); 

它總是相對於文件中,這樣的調用,不依賴於當前的工作目錄。

+2

'process.chdir()'之後,有什麼辦法可以獲得原始的? – reergymerej

+0

@reergymerej你可能想在執行chdir()之前先存儲cwd(例如'var originalCwd = process.cwd();'然後執行你的'process.chdir()',然後你可以返回原始的)。 – Swivel

+0

是'../ lib/test'便攜式嗎? – Sebastian

2

或者,如果你想單獨獲取當前NodeJS腳本的當前目錄,你可以嘗試一些簡單的事情。請注意,這不會在節點CLI本身中工作:

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