故宮文檔這樣說:訪問一個Node.js的全球模塊
- 如果你安裝你想要在你的程序中使用的東西,使用 需要(「不管」),然後安裝它在本地,在您的項目的根源。
- 如果您正在安裝某些要在shell中使用的東西,請在命令行或 上進行全局安裝,以使其二進制文件最終位於PATH環境變量中。
我目前正在寫---或者,至少,嘗試寫---從外殼使用節點真正的命令行程序的預期。因此,根據以上所述,我的依賴應該被安裝爲全局模塊。
我怎麼實際上使用一個全局模塊安裝npm在節點?當然,調用require()
不起作用,因爲默認情況下npm全局模塊目錄(/usr/local/lib/node_modules
)不在路徑上。我可以通過將它明確地添加到程序頂部的路徑來使其工作,但這是一個非常糟糕的解決方案,因爲它不是可移植的 - 它需要了解npm的全局模塊目錄在任何給定系統上的位置。
只是爲了讓生活更加惡化,我通過dpkg安裝了一些全局模塊。這些已被放入/usr/lib/nodejs
,他們只是工作。這使我感到困惑,因爲如果全局模塊不應該用於普通應用程序,那麼我預計不會在路上;否則我會期望他們都走在路上,並要求全球模塊到處工作。有一個而不是另一個似乎很奇怪。這裏發生了什麼?
更新:我應該指出,這個程序只是一個腳本,頂部是#!/usr/bin/env nodejs
;它不是一個正式的節點模塊,對於一些相當微不足道的東西來說這太過於誇張了。由於所有Debian模塊都需要這樣的腳本,因此我認爲npm的全局模塊應該也是必需的,但我有一種感覺,那就是Debianism ...
是的,但這隻適用於重量級項目,這不是:這實際上是一個shell腳本,頂部帶有'#!/ usr/bin/env nodejs'的源文件。它將被卡在'/ usr/local/bin'中以供機器上的其他用戶使用。強制用戶創建一個本地項目目錄,以便它們可以運行這是不合理的。考慮到腳本已經可以通過'require()'獲得Debian全局模塊,爲什麼我不能使用npm? –
你讓開發者感到困惑。對於用戶,您將模塊發佈到npm註冊表,並且用戶只需鍵入'npm install -g yourproject'並完成。如果你在你的package.json中將shell腳本封裝器標記爲二進制文件(請參閱'npm help json'),npm將把它放在正確的位置,以便用戶可以運行它。 –
但我沒有一個模塊,這是我的觀點。沒有package.json,也沒有shell腳本包裝器。我知道我不需要有一個模塊來做到這一點,因爲如果我試圖訪問Debian安裝的所有節點模塊都可以。這只是npm的不起作用。我開始懷疑npm不支持這個用例,並且Debian已經擺弄他們的節點設置來明確地完成這個工作。這看起來似乎合理嗎? –