2014-10-02 148 views
84

形勢節點NPM windows文件路徑太長,安裝軟件包

我想用杯和相關的前端工具鏈在Windows託管開發環境。我正在嘗試使用諸如Browser-Sync之類的gulp插件,因爲node_modules文件夾圖將扇區窗口文件路徑浪費太長以至於無法複製文件。我希望現在在Windows上處理這個問題的實用方法,無論Node社區將來可能提供或不提供的npm在Windows上的可用性。

2問題

  1. 是否有適用於Windows的新公共管理的工作流程,只是工作它的目的的方法是什麼? 「運行命令和文件安裝」(例如,可以與OSX上的npm,Linux上的npm,ruby gems或甚至nuget相媲美)每次我使用時,我都不想擺弄一大堆手動文件編輯,符號鏈接等Windows上的npm。

  2. 是否有一個記錄良好,穩定的Cygwin工作流程,用於npm和節點執行以解決Windows API文件路徑限制?下面列出

血淋淋的細節...

一般問題

  • 運行NPM從一個標準的Windows命令提示符下安裝失敗的深度嵌套node_modules層次。
  • Per Joyent的github repo線程this is an acknowledged issue對於Windows中心環境中的開發人員沒有適合的解決方法。 (真的嗎?
  • NT內核支持多達32,767個字符的文件路徑長度。
  • Windows API的MAXPATH限制爲260個字符。
  • 的Windows API處理文件操作對所有主要的Windows外殼和諸如此類的東西,包括:資源管理器中,CMD,PowerShell中,MYSgit慶典等(?MS真的有多久NTFS一直圍繞?)
  • Cygwin的支持長文件路徑,但由於crlf格式化,npm.cmd無法正常工作。我嘗試了npm上的DOS2Unix轉換來使它與Cygwin一起工作,但似乎還有其他問題。

我現在的黑客

  • 創建一個 「N」 文件夾作爲C的根目錄的臨時區域:\,因爲這 縮短我的文件夾路徑。
  • 在「n」文件夾內運行npm以安裝我需要的任何模塊。
  • 啓動Cygwin並使用cp將node_modules文件夾複製到目標項目中。
  • 當依賴關係發生變化或需要啓動新項目時,請清洗並重復。

其它不受歡迎的解決辦法

符號鏈接可用於縮短文件路徑,但這些缺憾黑客。隨着npm生態系統的發展,嵌套的依賴鏈將變得太長,並且這種解決方法變得無法使用。

將所有依賴添加到根文件夾的package.json文件在我遇到的一個線程中提到。雖然這種方法會使文件夾結構扁平化並防止重複模塊的加載,但此解決方法感覺不自然。它還會殺死npm的可用性,耐久性和生產力,因爲您必須手動或使用一些黑客腳本來手動安裝文件和文件夾。該方法也容易受到符號鏈接方法可能最終遭受的相同命運的影響。

+0

我幾乎以爲我這個解決。通過在以下兩個文件上運行dos2unix util,我得到了Cygwin與npm的協同工作:npm.cmd和npm – 2014-10-04 00:30:21

+0

Windows API路徑限制使得npm不可用,因爲一些npm模塊使用Visual Studio來構建文件。這是我在npm瀏覽器同步時收到的錯誤:C:\ Program Files(x86)\ MSBuild \ Microsoft.Cpp \ v4.0 \ V120 \ Microsoft.CppBuild.targets(301,5):錯誤MS B3491:可能不要將文件寫入文件「Release \ obj \ validation \ validation.tlog \ validation.lastbuilds tate」。指定的路徑,文件名或這兩者太長。完全限定的文件名必須少於260個字符,且目錄名稱必須少於248個字符。 – 2014-10-04 00:33:59

+0

我可能有一個「taffy-pulling」方法來獲取在Windows上加載npm的節點模塊。它涉及以下幾個步驟:npm install,npm dedupe,npm shrink和rm -r node_modules。重複這樣做似乎在某種程度上消除了長文件路徑,但這有點像拉太妃糖(例如,直到你完成了才完成)。任何人編寫這個或編寫一個自動化工具,使這個更多的交鑰匙? – 2014-10-04 03:04:46

回答

12

這是一個解決方案。

有一些節點模塊可以爲您平整您的依賴關係。
鏈接在此:

什麼這些模塊都做得可以手動完成爲好。這是目前唯一真正存在的解決方案,即將所有模塊集中在一個層次上,彼此相互需要,而不是所有模塊都擁有深層嵌套的依賴關係的私有副本。

+10

我發現[flatten-packages](https://www.npmjs.com/package/flatten-packages)具有良好的記錄並且易於使用。 – StriplingWarrior 2015-02-06 23:42:51

3

艾倫 -

從您鏈接GitHub的問題,

故宮將增加重複數據刪除,在安裝時默認情況下。這比Node的模塊系統改變顯着更可行,但它仍然不是微不足道的,並且涉及很多對一些根深蒂固的模式的修改。

這是(最終)目前在故宮的作品,由名稱multi-stage-install去,是針對[email protected]npm開發鉛阿甘諾維爾是要花費一些時間在新的一年裏在Windows上運行,所以請不要在npm問題跟蹤< https://github.com/npm/npm/issues>

0

這是最終確定它爲我創建窗口相關的問題...

安裝杯和接收錯誤後,運行...一飲而盡

當你看到一個包的失敗,與--no-bin-link手動安裝。

sudo npm install {package} --no-bin-link 

其中{}包是有問題的包。

這一切後,我是在插件「吞掉-通知」消息接收錯誤:未發現:通知,發送。

這是由於Vagrant插件問題。您可以關閉通知..或者安裝插件Vagrant

祝你好運..我花了很長時間在此,即使在遵循了很多人的建議之後。

布蘭登

3

我有同樣的問題。展平依賴並不是一個完整的解決方案,因爲您可能正在使用依賴於相同從屬模塊的不同版本的模塊。我發現gulp-run模塊在展平後停止工作(與模塊假設有關bin/.bin目錄有關,我懷疑)。討厭鬼!

有很多關於這個問題的討論,但看不到解決辦法: https://github.com/joyent/node/issues/6960

https://github.com/npm/npm/issues/3697

那的工作對我來說是手動添加依賴我的項目沒有明確需要一種解決方法。

如果您想確定哪些軟件包會給您帶來問題,我發現PathLengthChecker相當有用。只需提取EXE並運行GUI或命令行應用程序。我發現問題的另一種方法是嘗試在Visual Studio中構建,但它沒有告訴您哪個目錄名太長而失敗。

這裏是我的解決辦法的一個命令行示例:

mkdir c:\reallylongdirectorywillbreakinwindows 
cd c:\reallylongdirectorywillbreakinwindows 
npm init 
npm install --save-dev grunt-bower-task 
PathLengthChecker.exe RootDirectory="C:\reallylongdirectorywillbreakinwindows" MinLength=260 

我回來:

261:C:\ reallylongdirectorywillbreakinwindows \ node_modules \咕嚕鮑爾任務\ node_modules \亭子\ node_modules \ update-notifier \ node_modules \ latest-version \ node_modules \ package-json \ no de_modules \ registry-url \ node_modules \ npmconf \ node_modules \ config-chain \ readme.markdown

[s夾 - 一家總共有12

按照NPM LS命令:

└─┬ [email protected] 
    ├── [email protected] 
    ├─┬ [email protected] 
    │ ├─┬ [email protected] 
    │ │ ├─┬ [email protected] 
    │ │ │ └─┬ [email protected] 
    │ │ │ └─┬ [email protected] 
    │ │ │  └─┬ [email protected] 
    │ │ │  ├─┬ [email protected] 
    │ │ │  │ └── [email protected] 

讓我們一起去npmconf - 這是對於那些造成問題的所有超長文件的容器。我們需要npmconf 2.1.1。

npm install --save-dev [email protected] 
(now delete the node_modules directory - you may have to use Windows Explorer if you can't do it with rmdir /s) 
npm install 
PathLengthChecker.exe RootDirectory="C:\reallylongdirectorywillbreakinwindows" MinLength=260 

沒有結果 - 所有文件都在限制範圍內!

這裏的一個明顯的警告是,它只對每個包工作一次 - 對同一模塊的不同版本的依賴性不能安裝在根節點node_modules級別,因爲節點不考慮目錄結構中的版本。

這種解決方法並不完美,但它解決了我在Windows上使用節點工作的主要目標,並且由於解決方案在package.json中正確,解決方法適用於其他開發人員和構建服務器,而無需任何手動或全局性操作。

54

Windows上深度嵌套文件夾的問題主要是從npm版本3.x開始解決。

據故宮:

.npm @ 3使得安裝「最平坦的」吊裝就位一切可能的頂級node_modules。這意味着嵌套只發生在衝突上,因此樹木不應該變得很深。因此,窗口路徑長度限制不應該進入。

我剛剛安裝了npm 3.1.0,並在一個拋出可怕的The specified path, file name, or both are too long錯誤的軟件包上嘗試過。

問題就消失了。

你可以得到最新的NPM從這裏建立:npm releases

+4

我還在Windows機器上使用了npm 3.x更新。無恥的插件:我在Windows上寫了一篇關於npm 3的文章http://www.triplet.fi/blog/npm-3-will-bring-brighter-future-for-windows-users/ – Tx3 2015-08-08 07:50:15

2

如果你是安裝就OK了全球範圍內,這可能是一個變通辦法:

您可以調整,其中NPM被安裝在全球的路徑模塊的東西很短(通常是c:\ users \ {username} \ AppData \ Roaming \ npm \ npm_modules),這個過程需要很多字符。

要調整它在這裏看到:Change default global installation directory for node.js modules in Windows?

如果你把它調整到,例如C:\ n \在某些情況下,它可能會解決這一問題。

0

在Windows中:

  1. 使用Windows資源管理器,瀏覽到您的無業遊民共享文件夾(我用的方式scotchbox)如C:\scotchbox/public/gulpProject
  2. 在文件夾的地址欄中鍵入cmd,按輸入
  3. 做你一飲而盡安裝npm install
+1

[避免複製粘貼相同答案](http://stackoverflow.com/a/34587459/1743880)。您應該標記爲重複。另外,不要在你的帖子中發誓。 – Tunaki 2016-01-04 08:57:25

0

npm install --no-bin-link。你將有一個整個扁平node_modules

12

的Windows 8.1和10有一個選項,增加了Win32路徑限制:

  • 打開組策略編輯器(按的Windows + [R和類型gpedit.msc並命中輸入
  • 導航到以下直接ory:本地計算機策略\計算機配置\管理模板\系統\文件系統
  • 雙擊啓用Win32長路徑選項並啓用它。

enter image description here

+0

選項不適用於我和fwiw,我從win 7 pro升級,所以這是一個可能的原因 – 2016-09-01 20:59:41

+0

@EvanMorrison「Filesystem \ NTFS \ Enable NTFS long paths」在以後的win10中重命名爲「FileSystem \ Enable Win32 long paths」建立。我更新了答案以供將來參考。 – 2016-09-29 23:05:03

+0

Win Server 2012 R2的任何想法 – sairfan 2017-07-11 21:14:13