[英]Which file does npm look into when node.js global packages are being upgraded?
[英]Node.js require() does not look in parent directory when using “npm link”
我正在為node.js開發模塊。 為了進行開發,我使用“ npm link”,它基本上在驅動器(我正在運行Ubuntu)上創建到此模塊的開發位置的符號鏈接。
當我使用require加載父應用程序在其node_modules文件夾中具有的模塊時,它不會被加載。 我取而代之的是“找不到模塊x”。 我將環境變量NODE_DEBUG設置為module,發現它只是從驅動器上的物理位置(而不是從項目內部)“向上”查找。
有人對我如何解決這個問題有建議嗎? 我當前的解決方案是現在不幸地將模塊代碼作為啟動腳本的一部分物理地復制到我的測試項目中,這不是很酷!
我個人認為這可能是一個錯誤,但是我不確定它的行為是否符合預期,而我只是做錯了。
這就是parent-require模塊試圖解決的問題。 雖然如果核心要求自己處理會更好。
自您發表文章以來已經有一段時間了,但是也許您或其他人仍然對解決該問題感興趣,而我也已經面對了很長時間。
附帶說明一下,實際上在節點v 6.x中實現了正確的行為,但是由於副作用,它目前位於--preserve-symlinks標志后面。 因此,即使使用此標志也可能會導致這些副作用,這是為什么將其從默認行為中刪除的原因。
在從node.js端解決此問題之前,您仍然可以使用以下工作環境:
將NODE_PATH
設置為./node_modules
這樣做,例如,在構建腳本中使用browserify:
"scripts": {
"build:debug": "NODE_PATH=./node_modules browserify src/index.js > dist/build.js"
}
../node_modules是根應用程序目錄中的node_modules文件夾,如果模塊在其他位置未找到,則導致節點在該文件夾中搜索。
對於Windows用戶,我建議安裝cross-env模塊以正確設置環境變量。 生成腳本如下所示:
"scripts": {
"build:debug": "cross-env NODE_PATH=./node_modules browserify src/index.js > dist/build.js"
}
這個工作環境最終解決了我以前在鏈接模塊中找不到的同級依賴問題
我可以理解您如何認為它“在上下文中存在模塊”,但是不幸的是npm link <module>
只是在node_modules
下創建了一個普通的符號鏈接。 從鏈接模塊的上下文來看,它不知道(也無法合理地知道)它是與其他目錄符號鏈接的。
require行為很復雜,但是從本質上來說,它是通過node_modules目錄的父目錄進行查找的,這是正確的行為。 您遇到的問題是對等方依賴性的一般問題,有一些解決方案可以解決。 您可以將所有項目放在node_modules
目錄中,而不是鏈接到Module Project
Node Project
可以僅從Module Project
,同樣, Module Project
可以從Node Project
。 如果它們彼此需求,那么循環依賴可能會有很大的問題,因此請當心。
如果您確切解釋所鏈接的Module Project
正在尋找什么,可能會有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.