2013-04-30 18 views
5

我有一個模塊。在裏面,我想從我的父應用程序的package.json文件中訪問數據。最佳做法是什麼?在Node.js中,模塊如何從應用程序的package.json中獲取數據?

我已經漲2個級別和需要的文件(或使用nconf配置加載器)完成這件事的janky方式。

var appdir = path.resolve(__dirname, '../../'); 
nconf.file('app', path.join(appdir, 'package.json')); 

但是,這似乎可以輕鬆破壞。

另外我聽說pkginfo,它會自動從我自己的模塊的package.json中獲取信息,但我期望從父應用程序中獲取數據。

感謝您的幫助!

編輯:我想要求的是另一種方式,我怎麼能得到應用程序的路徑(而不是模塊路徑)?

+0

聽起來像是不應該需要的奇怪耦合的聲音發生,你究竟想要完成什麼?難道你不能只將應用程序的包信息傳遞給模塊? – 2013-04-30 13:59:43

+0

使用nconf,我可以指定一個默認配置,然後用其他JSON文件覆蓋它。所以我在模塊文件夾中創建了一個默認的config.json,然後(可選)在package.json中正確命名的塊可以覆蓋它。基本上只是試圖將配置數據保存在應用邏輯之外。 – dylanized 2013-04-30 14:01:14

回答

1

正如Determine project root from a running node.js application提到的,最簡單的方法之一去使用process.cwd()您的應用程序的路徑,只要你有紀律,始終啓動你的主要的js程序來自同一個目錄。即node app/main.js和​​會給出不同的結果。

另一種方式可能是遞歸地跟隨對module.parent的引用,然後在module.parent未定義時讀出module.filename。這也預設了一些關於你的應用程序的知識。如果主腳本相對於package.json的位置可能有所不同,它將不起作用。即你必須知道,如果主腳本是在應用程序的根目錄下,或者也許在某種「本」,「應用」,或「LIB」目錄中。但是,一旦你找到的頂層模塊,你可以嘗試使用定位使用的pkginfo找到當前文件的package.json相同的算法最接近的package.json。

+2

您可以使用'require.main'來獲取頂層模塊,而不是循環通過父項。 – 2013-10-19 21:35:53

+0

@TadeuszŁazurski是的,除非你的代碼是由外部啓動器運行 – mucaho 2015-12-19 10:33:48

2

添加到pcru的做法,這應該工作:

function loadMainPackageJSON(attempts) { 
    attempts = attempts || 1; 
    if (attempts > 5) { 
    throw new Error('Can\'t resolve main package.json file'); 
    } 
    var mainPath = attempts === 1 ? './' : Array(attempts).join("../"); 
    try { 
    return require.main.require(mainPath + 'package.json'); 
    } catch (e) { 
    return loadMainPackageJSON(attempts + 1); 
    } 
} 

var packageJSON = loadMainPackageJSON(); 

請記住,這將讓你的主模塊,其中一些你認爲是你想要的,但如果你正在構建一個命令行像我這樣的工具,你真正想要的是,如果你的工具被安裝在本地並用npm run-script

相關問題