Đường dẫn tệp npm windows quá dài để cài đặt gói


89

Tình hình

Tôi muốn sử dụng gulp và chuỗi công cụ front-end liên quan trong môi trường phát triển được lưu trữ trên Windows. Tôi đang cố gắng sử dụng các plug-in gulp như Browser-Sync, vì biểu đồ thư mục node_modules khiến đường dẫn tệp windows quá dài để sao chép tệp. Tôi muốn một cách tiếp cận thực tế để xử lý vấn đề này ngay bây giờ trên Windows, bất kể cộng đồng Node có thể cung cấp hoặc không cung cấp những gì để cải thiện khả năng sử dụng npm trên Windows trong tương lai.

2 câu hỏi

  1. Có quy trình làm việc npm cho Windows hoạt động theo cách mà nó đã dự kiến ​​không? "chạy lệnh và cài đặt tệp" (ví dụ: có thể so sánh với npm trên OSX, npm trên Linux, ruby ​​gems hoặc thậm chí là nuget) Tôi không muốn loay hoay với hàng loạt chỉnh sửa tệp thủ công, liên kết tượng trưng, ​​v.v. mỗi lần sử dụng npm trên Windows.

  2. Có quy trình làm việc Cygwin ổn định, được ghi chép đầy đủ cho việc thực thi npm và nút để giải quyết các giới hạn đường dẫn tệp Windows API không?

Chi tiết về Gory được liệt kê bên dưới ...

Vấn đề chung

  • Chạy cài đặt npm từ dấu nhắc lệnh chuẩn của Windows không thành công trên hệ thống phân cấp node_modules lồng nhau sâu.
  • Theo luồng repo github của Joyent, đây là một vấn đề được thừa nhận không có cách giải quyết hợp lý nào cho các nhà phát triển trong môi trường lấy Windows làm trung tâm. ( Thật không? )
  • NT Kernel hỗ trợ độ dài đường dẫn tệp lên đến 32.767 ký tự.
  • MAXPATH của Windows API được giới hạn ở 260 ký tự.
  • API Windows xử lý các hoạt động tệp cho tất cả các shell chính của Windows và không bao gồm: Explorer, CMD, Powershell, MYSgit bash, v.v. ( MS thực sự? NTFS đã tồn tại được bao lâu? )
  • Cygwin hỗ trợ các đường dẫn tệp dài, nhưng npm.cmd không hoạt động hiệu quả do định dạng crlf. Tôi đã thử biến đổi DOS2Unix trên npm để làm cho nó hoạt động với Cygwin, nhưng dường như có vấn đề khác với điều này.

Hack hiện tại của tôi

  • Tạo một thư mục "n" làm vùng dàn dựng trên thư mục gốc của C: \, vì điều này sẽ rút ngắn đường dẫn thư mục của tôi.
  • Chạy npm bên trong thư mục "n" để cài đặt các mô-đun cho bất kỳ thứ gì tôi cần.
  • Kích hoạt Cygwin và sử dụng cp để sao chép thư mục node_modules vào một dự án đích.
  • Rửa sạch và lặp lại khi các phụ thuộc thay đổi hoặc khi tôi cần tạo một dự án mới.

Các cách giải quyết không thể lặp lại khác

Các liên kết tượng trưng có thể được sử dụng để rút ngắn đường dẫn tệp, nhưng đây là những cách tấn công khó hiểu. Khi hệ sinh thái npm phát triển, các chuỗi phụ thuộc lồng nhau sẽ trở nên quá dài và cách giải quyết này không thể sử dụng được.

Thêm TẤT CẢ các phụ thuộc vào tệp package.json của thư mục gốc đã được đề cập trong một chủ đề mà tôi đã xem qua. Mặc dù cách tiếp cận này sẽ làm phẳng cấu trúc thư mục và ngăn tải các mô-đun trùng lặp, nhưng cách giải quyết này có vẻ không tự nhiên. Nó cũng giết chết khả năng sử dụng, độ bền và năng suất của npm, vì bạn phải loay hoay với các tệp và thư mục sau khi cài đặt theo cách thủ công hoặc với một số tập lệnh hack. Cách tiếp cận cũng dễ bị chung số phận mà cách tiếp cận Liên kết tượng trưng cuối cùng có thể phải gánh chịu.


Tôi gần như nghĩ rằng tôi đã giải quyết được điều này. Tôi đã nhận Cygwin làm việc với npm bằng cách chạy dos2unix using trên 2 tệp sau: npm.cmd và npm
Allan McLemore

Các giới hạn về đường dẫn API của Windows khiến npm không sử dụng được, vì một số mô-đun npm sử dụng Visual Studio để tạo tệp. Đây là lỗi tôi nhận được khi tôi npm Browser-Sync: C: \ Program Files (x86) \ MSBuild \ Microsoft.Cpp \ v4.0 \ V120 \ Microsoft.CppBuild.targets (301,5): lỗi MS B3491: Có thể không ghi dòng vào tệp "Release \ obj \ validation \ validation.tlog \ validation.lastbuilds tate". Đường dẫn được chỉ định, tên tệp hoặc cả hai đều quá dài. Tên tệp đủ điều kiện phải ít hơn 260 ký tự và tên thư mục phải ít hơn 248 ký tự.
Allan McLemore

Tôi có thể có cách tiếp cận "kéo taffy" để tải các mô-đun nút bằng npm trên windows. Nó bao gồm một số vòng sau: npm install, npm debupe, npm co lại và rm -r node_modules. Làm điều này lặp đi lặp lại dường như làm phẳng các đường dẫn tệp dài ở một mức độ nào đó, nhưng nó giống như kéo taffy (ví dụ: không thực hiện cho đến khi bạn hoàn thành). Có ai đã hệ thống hóa điều này hoặc viết một công cụ tự động để tạo ra chìa khóa trao tay hơn không?
Allan McLemore

Nói về "tập lệnh hacky", tôi đã viết một đoạn mà tôi không thấy là hacky TERRIBLY. Tôi đã tạo một công cụ có tên là fenestrate mà bạn có thể sử dụng để làm phẳng cấu trúc thư mục của các mô-đun sau khi cài đặt theo chương trình. Bạn có thể cài đặt nó dưới dạng hook postinstall npm chung.
zetlen

2
@yoneal Đối với mục đích sử dụng cá nhân và để bắt đầu nhanh chóng, fenestrate nên duyệt đệ quy thư mục node_modules của bạn, vì vậy bạn không cần phải chạy nó theo cách thủ công dựa trên các phụ thuộc sâu. Tuy nhiên, sẽ thật tuyệt nếu phân tách những phụ thuộc đó - tôi nghĩ rằng rất nhiều mô-đun được chia nhỏ với cấu hình fenestrate đơn giản sẽ gửi một thông điệp tuyệt vời đến những người bảo trì npm.
zetlen

Câu trả lời:


58

Vấn đề với các thư mục lồng nhau sâu trên Windows hầu hết đã được giải quyết bắt đầu từ phiên bản npm 3.x.

Theo npm:

.npm @ 3 làm cho cài đặt "phẳng tối đa" bằng cách đưa mọi thứ có thể lên node_modules cấp cao nhất. Điều này có nghĩa là việc làm tổ chỉ xảy ra khi có xung đột và như vậy, cây không bao giờ bị sâu. Do đó, giới hạn độ dài đường dẫn cửa sổ không nên chạy vào.

Tôi vừa mới cài đặt npm 3.1.0và dùng thử trên một gói đang The specified path, file name, or both are too longgặp lỗi đáng sợ .

Vấn đề đã biến mất.

Bạn có thể tải các bản dựng npm mới nhất từ ​​đây: bản phát hành npm


4
Tôi cũng đã thành công với bản cập nhật npm 3.x trên máy Windows. Shameless plug: Tôi đã viết một bài báo về npm 3 trên Windows triplet.fi/blog/…
Tx3

21

Windows 8.1 và 10 có một tùy chọn để tăng giới hạn đường dẫn Win32:

  • Mở Trình chỉnh sửa Chính sách Nhóm (Nhấn Windows+ Rvà nhập gpedit.mscvà nhấnEnter )
  • Điều hướng đến thư mục sau: Local Computer Policy\Computer Configuration\Administrative Templates\System\Filesystem
  • Nhấp đúp vào tùy chọn Bật đường dẫn dài Win32 và bật nó.

nhập mô tả hình ảnh ở đây


tùy chọn này không có sẵn cho tôi, và fwiw, tôi nâng cấp từ win 7 rất pro đó là một nguyên nhân có thể
Evan Morrison

@EvanMorrison "Hệ thống tập tin \ NTFS \ Bật đường dẫn dài NTFS" được đổi tên thành "Hệ thống tệp tin \ Bật đường dẫn dài Win32" trong các bản dựng win10 sau này. Tôi đã cập nhật câu trả lời để tham khảo trong tương lai.
Marcelo Mason,

1
bất kỳ ý tưởng cho Win Server 2012 R2
sairfan

12

Đây là một công việc xoay quanh giải pháp.

Có một số mô-đun nút làm phẳng sự phụ thuộc của bạn cho bạn.
Các liên kết ở đây:

Những gì các mô-đun này đang làm cũng có thể được thực hiện thủ công. Đây là giải pháp thực sự duy nhất tồn tại cho đến thời điểm hiện tại, tức là có tất cả các mô-đun của bạn ở một cấp duy nhất, yêu cầu lẫn nhau, thay vì tất cả đều có các bản sao riêng tư của các phụ thuộc của chúng được lồng sâu vào nhau.


10
Tôi thấy các gói làm phẳng được ghi chép đầy đủ và dễ sử dụng.
StriplingWarrior

3

Allan -

Từ vấn đề github mà bạn đã liên kết,

npm theo mặc định sẽ thêm vào lúc cài đặt. Điều này khả thi hơn đáng kể so với việc thay đổi hệ thống mô-đun của Node, nhưng nó vẫn không chính xác là tầm thường và liên quan đến việc làm lại một số mẫu lâu đời.

Đây là (cuối cùng) hiện đang hoạt động lúc npm, theo tên multi-stage-install, và được nhắm mục tiêu cho npm@3. npmTrưởng nhóm phát triển Forrest Norvell sẽ dành một khoảng thời gian để chạy trên Windows trong năm mới, vì vậy hãy tạo các vấn đề liên quan đến cửa sổ trên trình npmtheo dõi vấn đề < https://github.com/npm/npm/issues >


3

Tôi có cùng một vấn đề. Làm phẳng các phần phụ thuộc không phải là một giải pháp hoàn chỉnh, vì bạn có thể đang sử dụng các mô-đun phụ thuộc vào các phiên bản khác nhau của cùng một mô-đun phụ thuộc. Tôi phát hiện ra mô-đun gulp-run ngừng hoạt động sau khi làm phẳng (liên quan đến các giả định mô-đun về thư mục bin / .bin, tôi nghi ngờ). Drat!

Có rất nhiều cuộc thảo luận về vấn đề nhưng không có giải pháp nào trong tầm mắt: https://github.com/joyent/node/issues/6960

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

Một cách giải quyết phù hợp với tôi là thêm thủ công các phụ thuộc mà dự án của tôi không cần một cách rõ ràng.

Nếu bạn muốn xác định gói nào đang gây ra sự cố cho bạn, tôi thấy PathLengthChecker khá hữu ích. Chỉ cần giải nén EXE và chạy ứng dụng GUI hoặc dòng lệnh. Cách khác mà tôi đã phát hiện ra vấn đề là để cố gắng xây dựng trong Visual Studio, nhưng nó không thành công mà không nói cho bạn tên thư mục quá dài.

Đây là một ví dụ dòng lệnh về cách giải quyết của tôi:

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

Tôi đã trở lại:

261: C: \ reallylongdirectorywillbreakinwindows \ node_modules \ grunt-bower-task \ node_modules \ bower \ node_modules \ update-notifier \ node_modules \ new-version \ node_modules \ package-json \ no de_modules \ registry-url \ node_modules \ npmconf \ node_modules \ config-chain \ readme.markdown

[ảnh chụp - có 12 người trong số họ]

Theo lệnh npm ls :

└─┬ grunt-bower-task@0.4.0
  ├── async@0.1.22
  ├─┬ bower@1.3.12
  │ ├─┬ update-notifier@0.2.0
  │ │ ├─┬ latest-version@0.2.0
  │ │ │ └─┬ package-json@0.2.0
  │ │ │   └─┬ registry-url@0.1.1
  │ │ │     └─┬ npmconf@2.1.1
  │ │ │       ├─┬ once@1.3.1
  │ │ │       │ └── wrappy@1.0.1

Hãy làm với npmconf - đó là vùng chứa tất cả các tệp có độ dài quá mức đang gây ra sự cố. Chúng ta cần npmconf 2.1.1.

npm install --save-dev npmconf@2.1.1
(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

Không có kết quả - tất cả các tệp đều nằm trong giới hạn!

Cảnh báo rõ ràng ở đây là nó chỉ hoạt động một lần cho mỗi gói - không thể cài đặt các phụ thuộc trên các phiên bản khác nhau của cùng một mô-đun ở cấp node_modules gốc vì nút không tính đến các phiên bản trong cấu trúc thư mục.

Cách giải quyết này không hoàn hảo, nhưng nó giải quyết được các mục tiêu chính của tôi là làm cho nút hoạt động trên Windows và vì giải pháp này nằm ngay trong package.json, nên giải pháp này phù hợp với các nhà phát triển khác và xây dựng máy chủ mà không cần bất kỳ thao tác thủ công hoặc toàn cầu nào.


2

Nếu bạn đồng ý với việc cài đặt nó trên toàn cầu, đây có thể là một công việc:

Bạn có thể điều chỉnh đường dẫn nơi npm đang cài đặt các mô-đun chung thành một thứ gì đó rất ngắn (thường là c:\users\\{username}\AppData\Roaming\npm\npm_modules:) vốn đã có rất nhiều ký tự.

Để điều chỉnh nó, hãy xem tại đây: Thay đổi thư mục cài đặt chung mặc định cho các mô-đun node.js trong Windows?

Nếu bạn điều chỉnh nó thành, ví dụ, c:\n\trong một số trường hợp, nó có thể giải quyết được vấn đề.


1

Đây là những gì cuối cùng đã sửa nó cho tôi ...

Sau khi cài đặt gulp và nhận được lỗi, chạy ... gulp

Khi bạn thấy một gói không thành công, hãy cài đặt nó theo cách thủ công với --no-bin-link.

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

Trong đó {package} là gói đang gặp sự cố.

Sau tất cả những điều này, tôi đã nhận được Lỗi trong plugin 'gulp-thông báo' Thông báo: không tìm thấy: thông báo-gửi.

Điều này là do sự cố plugin với Vagrant. Bạn có thể tắt thông báo ..

export DISABLE_NOTIFIER=true;

Hoặc cài đặt plugin với Vagrant .

Chúc may mắn .. Tôi đã dành một thời gian dài cho việc này, ngay cả sau khi làm theo nhiều khuyến nghị của mọi người.

Brandon


0

Trong cửa sổ:

  1. Sử dụng trình khám phá cửa sổ của bạn, Điều hướng đến thư mục chia sẻ lang thang của bạn (nhân tiện, tôi đang sử dụng scotchbox) ví dụ: C:\scotchbox/public/gulpProject
  2. Trong thanh địa chỉ của thư mục, nhập cmdvà nhấnEnter
  3. Thực hiện cài đặt gulp của bạn npm install

1
Tránh sao chép cùng một câu trả lời . Thay vào đó, bạn nên gắn cờ là trùng lặp. Ngoài ra, đừng chửi thề trong bài viết của bạn.
Tunaki

0

npm install --no-bin-link. Bạn sẽ có một toàn bộ phẳng node_modules

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.