2013-10-04 45 views
1

我正在構建一個基本上是node.js模塊的工具。此工具可以全局安裝(使用-g選項)模塊中有幾個靜態文件用於生成報告。如果模塊在本地調用,我可以參考相對路徑爲./node_modules/<module>/static/filename的靜態文件。但是當該工具作爲命令調用時,我如何引用靜態文件?我怎樣才能確定工具是作爲本地模塊還是作爲命令調用?確定節點模塊在運行時的位置

回答

2

當你的工具被全球的裝機量,通常有在Unix系統上的兩個條目:

  • /usr/local/lib/node_modules/<module>/ - >包含所有模塊的源文件
  • /usr/local/bin/<script.js>目錄 - >符號鏈接到您的模塊可執行腳本

因爲節點使用真實路徑(即畢竟符號鏈接已解決)解決相對於當前模塊的路徑,您不必擔心全局安裝和本地安裝之間的差異。

你需要處理的是當前正在運行節點進程的工作目錄。解決方案是根據模塊所在的絕對路徑解析靜態文件的相對路徑,而不是像在示例中那樣假定節點進程將在特定目錄中運行。

有針對兩種方式:

  1. 使用__dirnameAPI docs),其中包含當前源文件的目錄名(路徑):

    var path = require('path'); 
    // assuming this script is in package root directory 
    var staticFile = path.resolve(__dirname, 'static', 'filename'); 
    // if the script is in lib/ subdirectory, then you want to call 
    var staticFile = path.resolve(__dirname, '..', 'static', 'filename'); 
    
  2. 使用require.resolve(),其中返回與致電require()所使用的文件名完全相同的文件名:

    // assuming this script is in package root directory 
    var staticFile = require.resolve('./static/filename'); 
    // if the script is in lib/ subdirectory, then you want to call 
    var staticFile = require.resolve('../static/filename');