2012-09-25 203 views
6

故宮文檔這樣說:訪問一個Node.js的全球模塊

  • 如果你安裝你想要在你的程序中使用的東西,使用 需要(「不管」),然後安裝它在本地,在您的項目的根源。
  • 如果您正在安裝某些要在shell中使用的東西,請在命令行或 上進行全局安裝,以使其二進制文件最終位於PATH環境變量中。

我目前正在寫---或者,至少,嘗試寫---從外殼使用節點真正的命令行程序的預期。因此,根據以上所述,我的依賴應該被安裝爲全局模塊。

我怎麼實際上使用一個全局模塊安裝npm在節點?當然,調用require()不起作用,因爲默認情況下npm全局模塊目錄(/usr/local/lib/node_modules)不在路徑上。我可以通過將它明確地添加到程序頂部的路徑來使其工作,但這是一個非常糟糕的解決方案,因爲它不是可移植的 - 它需要了解npm的全局模塊目錄在任何給定系統上的位置。

只是爲了讓生活更加惡化,我通過dpkg安裝了一些全局模塊。這些已被放入/usr/lib/nodejs,他們只是工作。這使我感到困惑,因爲如果全局模塊不應該用於普通應用程序,那麼我預計不會在路上;否則我會期望他們都走在路上,並要求全球模塊到處工作。有一個而不是另一個似乎很奇怪。這裏發生了什麼?

更新:我應該指出,這個程序只是一個腳本,頂部是#!/usr/bin/env nodejs;它不是一個正式的節點模塊,對於一些相當微不足道的東西來說這太過於誇張了。由於所有Debian模塊都需要這樣的腳本,因此我認爲npm的全局模塊應該也是必需的,但我有一種感覺,那就是Debianism ...

回答

1

因此,您所使用的指令npm模塊,但你正在做本地開發。這裏有一些指導原則。

在你的源代碼方面,你只需要2種require聲明

var dep = require('somedep') 

使用此對任何核心模塊(如fs)和第三方模塊庫中的需求,你是包括通過NPM(將它們作爲依賴項列在你的package.json中)。這裏指定一個非限定的包名,節點根據其搜索算法找到該模塊。

var mymod = require('./lib/mymod') 

用於通過相對於當前JavaScript文件的路徑來要求項目本身中的其他模塊。

這就是你要做的所有事情來處理你的JavaScript依賴關係。

好吧,現在你如何安裝你的依賴關係?

對於本地發展(項目源代碼樹中),只是cd到項目目錄並運行npm install,它會讀取你的package.json文件,並安裝你在node_modules子目錄需要的模塊和一切都會好的地方發展。

如果您實際上將其作爲npm模塊發佈,其他用戶(您既可以是開發人員也可以是其他用戶),如果他們想要訪問項目的二進制實用程序,可以使用npm -g進行安裝在他們的PATH上需要包含/usr/lib/nodejs/lib/node_modules,但在這種情況下,npm -g將一次處理您的代碼和項目的依賴關係。

以下是您感到困惑的地方。

因此,根據以上所述,我的依賴關係應該被安裝爲全局模塊。

您不需要顯式安裝依賴項作爲全局變量,只需要您感興趣的頂級模塊,在本例中就是您的項目本身。 npm將自動處理依賴關係,這是它生命中的主要目的。您的項目依賴性不會全局安裝,而是在項目的node_modules子目錄中進行安裝,這將在全局安裝。

這裏的目錄和什麼生活在那裏:

  • ~/yourproject:地方發展的源代碼
  • ~/yourproject/node_modules:在開發過程中使用的項目NPM模塊。 NPM模塊(這可能最終包括yourproject如果你把它發佈到NPM註冊表),其在全球範圍內安裝
  • /usr/lib/nodejs/lib/node_modules/yourproject/node_modules:在~/yourproject
  • /usr/lib/nodejs/lib/node_modules運行npm install創建/填充你的項目的依賴將在這裏得到,當你做npm install -g yourproject安裝

您可能還會發現my blog post on managing interpreters and the PATH有關。

+0

是的,但這隻適用於重量級項目,這不是:這實際上是一個shell腳本,頂部帶有'#!/ usr/bin/env nodejs'的源文件。它將被卡在'/ usr/local/bin'中以供機器上的其他用戶使用。強制用戶創建一個本地項目目錄,以便它們可以運行這是不合理的。考慮到腳本已經可以通過'require()'獲得Debian全局模塊,爲什麼我不能使用npm? –

+0

你讓開發者感到困惑。對於用戶,您將模塊發佈到npm註冊表,並且用戶只需鍵入'npm install -g yourproject'並完成。如果你在你的package.json中將shell腳本封裝器標記爲二進制文件(請參閱'npm help json'),npm將把它放在正確的位置,以便用戶可以運行它。 –

+0

但我沒有一個模塊,這是我的觀點。沒有package.json,也沒有shell腳本包裝器。我知道我不需要有一個模塊來做到這一點,因爲如果我試圖訪問Debian安裝的所有節點模塊都可以。這只是npm的不起作用。我開始懷疑npm不支持這個用例,並且Debian已經擺弄他們的節點設置來明確地完成這個工作。這看起來似乎合理嗎? –

4

因此,根據以上所述,我的依賴關係應該被安裝爲全局模塊。

不完全。

這意味着,你的模塊可以安裝作爲一個全球性的,從而其binaries將可從外殼:

npm install -g your-module 
your-module-binary --option etc. 

它的依賴,另一方面,應按照第1點安裝,位於您項目的node_modules目錄中(通常在package.json中指定,因此npm可以管理它們)。

但是,全局模塊通常不適用於require。它們不遵循Loading from node_modules folders,對於本地模塊,npm遵循的NODE_PATH變量。