2011-05-05 160 views
17

我找不出如何添加路徑到我的Node.js安裝(Mac OS X上的v.0.4.7)。我已經安裝了npm,它安裝到全球/usr/local/lib/node_modules。然而,當我安裝了npm時,它並沒有通知Node它選擇放置全局模塊的位置(應該有嗎?)。現在,當我在命令行模式下使用Node時,我不能簡單地使用全局安裝的模塊require()。所以,我想知道是否有某種節點配置文件或環境變量,我可以添加我的全局npm模塊安裝路徑?set node.js REPL模塊路徑

我知道我可以在Node的命令行中將它添加到require.paths數組中,但我希望一次性添加此全局模塊文件夾,以便Node始終在模塊中搜索該目錄我從他們的命令行中獲得了require()。預先感謝有關使npm和Node共存的任何幫助和指示!

+0

你使用的是什麼版本的npm?你如何在命令行上要求?你使用'require(「./ module」);'或'require(「module」);'? – Giacomo 2011-05-05 07:36:43

+0

我使用npm 1.0.5。我在Node命令行中使用了require('module')'。我用'-g'選項安裝了這些模塊,並且它們進入了全局模塊目錄,但由於某種原因,Node不知道這個目錄... – ampersand 2011-05-05 17:02:13

回答

16

好的,我明白了。結合http://nodejs.org/docs/v0.4.7/api/modules.html#file_Moduleshttps://github.com/isaacs/npm/blob/master/doc/faq.md#readme的信息很明顯,Node檢查模塊時會檢查NODE_PATH環境變量。要做到這一點,我做了以下事情:

echo 'export NODE_PATH="'$(npm root -g)'"' >> ~/.bashrc 

這將NODE_PATH設置爲npm的全局安裝文件夾。

+1

缺點是,這會給你舊的「一切都是全局的」行爲,這被視爲npm 1.0(當節點沒有在repl中啓動時,全局模塊被添加到路徑中)。另一種方法是將文件夾專用於節點repl會話,並在本地安裝所有需要的模塊。然後當我想使用repl時,我可以簡單地cd到該文件夾​​。 – Giacomo 2011-05-07 23:04:17

+0

它如何給「一切都是全球性的」行爲? – ampersand 2011-05-07 23:38:05

+1

由於您已將全局模塊路徑添加到.bashrc,因此所有'node'調用都將使用它。我寧願將全球行爲限制在交互式(repl)會話中。 – Giacomo 2011-05-10 13:54:23

4

該死的,我誤解了。對於那個很抱歉。

回到主題,你可以把這兩行set-repl-paths.js

require.paths.unshift('/usr/lib/node_modules'); 
require("repl").start(); 

然後執行node set-repl-paths.js你將不得不與已經設置好的路徑一個REPL。你可以寫一個簡單的bash腳本或者設置一個shell別名,這樣你只需鍵入node-repl或類似的東西。

對於npm 1.x,您應該使用本地安裝,併爲提供命令行工具的模塊進行全局安裝。

如果你真的想全局安裝模塊 foo,那麼在你的模塊文件夾中發出一個 npm link foo。現在您可以在模塊中使用 require("foo")

最佳做法是使用本地安裝。

請參閱nodejs博客上的 npm 1.0: Global vs Local installation

+0

我已經通過了npm文檔,並且知道全局vs本地安裝。這並沒有告訴我有關設置node.js路徑的任何信息。 – ampersand 2011-05-06 16:09:40

+0

哎呦。答案已更新。 – Giacomo 2011-05-06 20:07:45

+0

+1。謝謝,rjack,這是一個很好的解決方法。但是你不知道Node在哪裏存儲它用於搜索模塊的路徑? – ampersand 2011-05-07 20:05:49

2

要安裝包全局(通常所用的命令行)

npm install --global PACKAGE_NAME

在我的情況下,我想安裝jslint作爲命令行工具。於是我就

npm install --global jslint

這將安裝包

/usr/local/lib/node_modules/

那麼,爲什麼這一切?如果在項目中專門使用包,則不應該在全局安裝包。

欲瞭解更多信息,請訪問幫助頁面。

npm help install

npm help global

我還發現它在npmFAQ

0

在回答這個: https://stackoverflow.com/a/5923898/7381355

你可以到你的.bashrc添加此只設置NODE_PATH時運行repl因爲需要全局模塊是一種反模式。

node() { 
    if (($# == 0)); then 
    NODE_PATH=$(npm root -g) command node 
    else 
    command node "[email protected]" 
    fi 
} 

當沒有參數傳遞給節點時,它設置NODE_PATH。所以它不適用於node -i之類的東西。你將不得不添加更多的參數檢查來覆蓋所有運行repl的情況。

這會使repl始終設置NODE_PATH。如果您希望能夠選擇是否運行帶有全局模塊的repl或腳本,則可以將其添加到.bashrc中。

node_global() { 
    NODE_PATH=$(npm root -g) node "[email protected]" 
} 

然後運行node_global。我去了第二個選項。

+0

那麼你回答哪個問題,這個問題還是你鏈接的問題? – 2017-01-05 22:52:31

+0

我所關聯的問題與此相同。我沒有足夠的代表評論這個答案。我指的是Giacomo提到的關於在沒有repl時能夠需要全局模塊的問題。 http://stackoverflow.com/questions/5892997/set-node-js-repl-module-paths/5923898#comment6824095_5923898 我的答案類似於賈科莫的答案http://stackoverflow.com/a/5908994/7381355 但它不需要額外的文件。這有點像兩個答案的合併。 – dosentmatter 2017-01-10 20:19:16

+0

因此,您應該做的是提供與此特定問題相關的答案部分,然後提供與其他問題相關的部分答案。即使答案已經在那裏被接受,這並不意味着你不能再添加一個答案。 (另外,另一個問題的提問者還沒有收到關於這個新答案的通知,所以當它結束時,它無助於他們。) – 2017-01-10 22:02:45