Làm thế nào để triển khai ứng dụng Node.js với cấu trúc node_modules sâu trên Windows?


91

Tôi đã gặp phải một vấn đề tò mò - dường như một số mô-đun Node.js có cấu trúc phân cấp thư mục sâu đến mức lệnh sao chép của Windows (hoặc PowerShell Copy-Itemlà những gì chúng tôi thực sự đang sử dụng) gặp phải lỗi "đường dẫn quá dài" khi đường dẫn trên 250 ký tự dài.

Ví dụ: đây là hệ thống phân cấp thư mục mà một mô-đun Node duy nhất có thể tạo:

node_modules\nodemailer\node_modules\simplesmtp\node_modules\
xoauth2\node_modules\request\node_modules\form-data\node_modules\
combined-stream\node_modules\delayed-stream\...

Nó có vẻ điên rồ nhưng là hiện thực với các mô-đun Node.

Chúng tôi cần sử dụng copy-paste trong quá trình triển khai (chúng tôi không sử dụng nền tảng đích "thông minh" như Heroku, nơi triển khai Git sẽ là một tùy chọn) và đây là một hạn chế nghiêm trọng trên Windows.

Không có lệnh npm hoặc thứ gì đó sẽ thu gọn node_modulesthư mục hoặc có thể chỉ bao gồm những gì thực sự cần thiết trong thời gian chạy? (Mô-đun nút thường chứa testcác thư mục, v.v. mà chúng ta không cần phải triển khai.) Bất kỳ ý tưởng nào khác về cách làm việc xung quanh nó? Không sử dụng Windows không phải là một tùy chọn :)


1
Dự án của bạn có bộ package.jsonvới dependencies? Nếu vậy, bạn có thể sao chép node_modulesvà sử dụng npm đến installhoặc updatecác phần phụ thuộc không?
Jonathan Lonowski

4
@JonathanLonowski Môi trường triển khai của chúng tôi không hỗ trợ thực thi npm installtrong môi trường đích, nó hoạt động bằng cách tạo cục bộ "gói triển khai" (về cơ bản là ZIP cộng với một số siêu dữ liệu), sau đó được tải lên máy mục tiêu, được giải nén ở đó và thế là xong. Vì vậy, tôi cần phải bao gồm node_modulestrực tiếp.
Borek Bernard

Câu trả lời:


24

npm v3 (phát hành gần đây) giải quyết vấn đề này bằng cách loại bỏ các yếu tố phụ thuộc .. Kiểm tra ghi chú phát hành tại đây trong https://github.com/npm/npm/releases/tag/v3.0.0 trong flat flatphần dưới đây.

Và bình luận cuối cùng về vấn đề này https://github.com/npm/npm/issues/3697


5
Các ghi chú phát hành cho flat flatbây giờ được chôn trong một trang khác. Đây là liên kết trực tiếp: github.com/npm/npm/releases/tag/v3.0.0
John-Philip

Cảm ơn @ John-Philip, cập nhật câu trả lời với các liên kết mới
RameshVel

62

chỉ để thêm vào điều này ... một điều khác đã giúp tôi liệt kê tất cả các mô-đun đã cài đặt với npm ls.

điều này sẽ cung cấp cho bạn một cây gồm các mô-đun và phiên bản ... từ đó, khá dễ dàng để xác định cái nào là bản sao ... npm dedupeđã không làm bất cứ điều gì cho tôi. Tôi không chắc đó là lỗi hay cái gì (Node v 10.16)

Vì vậy, một khi bạn xác định một mô-đun trùng lặp, hãy cài đặt nó vào thư mục node_module gốc bằng cách sử dụng npm install dupemodule@1.2.3 --save-dev. Phiên bản là quan trọng.

sau đó, tôi đã xóa thư mục node_modules của mình và làm mới npm install.

Phiên bản ngắn

  1. npm ls để có được danh sách tất cả các mô-đun đã cài đặt.
  2. xem qua các mô-đun đó và xác định các mô-đun trùng lặp ( phiên bản là quan trọng )
  3. npm install module@version --save-dev để cài đặt các mô-đun đó trong thư mục node_modules gốc và cập nhật package.json.
  4. rmdir node_modules để xóa thư mục node_modules.
  5. npm install để kéo xuống một bản sao mới của các phụ thuộc của bạn.

Một khi tôi đã làm điều đó, mọi thứ sạch sẽ hơn nhiều.

Tôi cũng khuyên bạn nên bình luận tệp package.json của bạn để hiển thị những tệp nào đã được đưa xuống để làm phẳng cây node_modules.


Nó hiệu quả tuyệt vời đối với tôi. Cảm ơn bạn! Thứ lỗi cho sự thiếu hiểu biết của tôi, nhưng tại sao các mô-đun luôn không được cài đặt ở cấp cao nhất?
Caleb

2
@Caleb có thể là do các mô-đun khác nhau dựa trên các phiên bản khác nhau của cùng một mô-đun, hoặc có thể chỉ vì dễ dàng hơn để có được bất cứ thứ gì cần thiết, sau đó tính toán nó xuống ... Tôi không biết.
Ben Lesh

7
Bất kể, cảm ơn cho mẹo. Tôi vừa loại bỏ khoảng 1700 tệp trùng lặp khỏi dự án của chúng tôi. Xóa mọi thứ là phần yêu thích của tôi khi trở thành một nhà phát triển! Ngoài ra, cho bất cứ ai nhìn vào cách thêm ý kiến để package.json, đây là câu trả lời của bạn: stackoverflow.com/questions/14221579/...
Caleb

anh chàng nút github.com/joyent/node/issues/6960 nói rằng Windows là công dân hạng nhất. Họ nói rằng. Nhưng họ đã đóng vấn đề và không có gì khắc phục. Người dùng Windows may mắn.
vee

38

Tôi không nghĩ rằng có bất kỳ giải pháp tuyệt vời nào với những hạn chế của bạn, nhưng đây là một số điều có thể hữu ích.

  • Hãy thử sử dụng npm dedupeđể tối ưu hóa hệ thống phân cấp thư mục của bạn có thể rút ngắn một số đường dẫn
  • Sử dụng npm install --productionđể cài đặt mà không cần công cụ phát triển
  • Lấy một số phụ thuộc lồng nhau sâu sắc đó (chỉ đủ để tránh vấn đề, tôi đề nghị) và chuyển chúng vào thư mục node_modules cấp cao nhất. Chỉ cần theo dõi chúng để bạn biết đâu là phụ thuộc thực sự của mình và đâu là giải pháp thay thế cho vấn đề này.
  • HOẶC di chuyển một số phụ thuộc sâu đó vào node_modulesthư mục cao nhất dưới your_project/node_modules/pkg_with_deep_depsđó sẽ cho phép chúng có đường dẫn đủ ngắn nhưng vẫn hoạt động. Vì vậy, đây sẽ là your_project/node_modules/pkg_with_deep_deps/node_modules.
    • Tôi nghĩ rằng requiresẽ có thể tìm thấy những thứ đó chính xác tại thời điểm chạy. Bạn chỉ cần ghi lại rõ ràng những gì bạn đã thay đổi theo cách thủ công, lý do tại sao bạn làm điều đó và giữ cho các phần phụ thuộc thực sự của riêng bạn được thể hiện chính xác trongpackage.json

Dưới đây là một cuộc thảo luận về vấn đề github trình bày chi tiết về vấn đề này.


Cảm ơn bạn đã chỉ ra dedupe(hoàn toàn không biết về nó) và --production( npm install -hkhông hiển thị tùy chọn này)! Rất tiếc, sử dụng kho lưu trữ ZIP không phải là một tùy chọn, hãy xem nhận xét ở trên.
Borek Bernard

9
npm debupe sẽ chỉ san phẳng các mô-đun "chung" đến vị trí chung thấp nhất trong hệ thống phân cấp. Không đủ tốt. Một giải pháp thích hợp sẽ cho phép "ép phẳng" toàn bộ hệ thống phân cấp và có thể cho phép bỏ qua các thư mục test / doc. Một giải pháp thay thế sẽ là cho nút hỗ trợ đọc mô-đun trực tiếp từ tệp tar.
MMind

3
Đồng ý rằng một số loại phân phối "nhị phân" của các gói (ZIP, tarball, bất cứ thứ gì) sẽ rất hữu ích.
Borek Bernard

11

Tôi đã viết một mô-đun nút có tên "npm-flatten" giúp làm phẳng sự phụ thuộc của bạn cho bạn tại đây: https://www.npmjs.org/package/npm-flatten

Nếu bạn đang tìm kiếm một bản phân phối, tôi cũng đã viết một gói NuGet sẽ tích hợp một môi trường node.js hoàn chỉnh với dự án .NET của bạn tại đây: http://www.nuget.org/packages/NodeEnv/

Phản hồi sẽ được hoan nghênh.


Điều này đã làm việc cho chúng tôi. Chúng tôi thậm chí còn có kết quả tốt hơn khi chạy nmp debup trước.
Shaun Rowan

1

Điều gì đó đã giúp tôi ánh xạ một ổ đĩa cục bộ vào thư mục Node.js của tôi:

net use n: \ computername \ c $ \ users \ myname \ Documents \ node.js / dai dẳng: có

Trước: c: \ users \ myname \ Documents \ node.js \ projectname (45 ký tự) Sau: n: \ projectname (14 ký tự ít hơn 31 ký tự)

Trong nhiều trường hợp, điều này cho phép một số mô-đun được cài đặt.

Tôi sẽ nói rằng tôi vừa phát hiện lại sự cố này hôm nay khi tôi cố gắng sao lưu tất cả mã của mình vào ổ USB.

"C: \ Users \ myname \ Documents \ Node.js \ angle-phonecat \ node_modules \ karma \ node_modules \ chokidar \ node_modules \ anymatch \ node_modules \ micromatch \ node_modules \ regex-cache \ node_modules \ benchmarked \ node_modules \ file-reader \ node_modules \ kéo dài-cạn \ điểm chuẩn \ fixtures quá dài. "

Ngay cả khi tôi cố gắng sao lưu chúng bằng ký tự ổ đĩa N:, nó vẫn không thành công trong một số trường hợp do độ dài đường dẫn nhưng nó chỉ đủ để sửa lỗi ở trên.


1

1) Trong quá trình xây dựng bản phát hành, Bạn có thể ngăn Visual studio quét các tệp / thư mục này bằng cách đặt thuộc tính thư mục dưới dạng thư mục Ẩn (CHỈ ĐẶT nó thành node_modules). Tham khảo: http://issues.umbraco.org/issue/U4-6219#comment=67-19103

2) Bạn có thể loại trừ các tệp hoặc thư mục được xuất bản trong quá trình đóng gói bằng cách bao gồm nút XML sau trong tệp CsProject.

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
  ...
  <OutputPath>bin\</OutputPath>
   <NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
  <ExcludeFilesFromDeployment>File1.aspx;File2.aspx</ExcludeFilesFromDeployment>
  <ExcludeFoldersFromDeployment>Folder1;Folder2</ExcludeFoldersFromDeployment>
</PropertyGroup>

1

Tôi đã tìm thấy một giải pháp từ Hướng dẫn Node.js của Microsoft .

  • Bắt đầu trong một đường dẫn ngắn (ví dụ: c: \ src)
  • > npm install -g rimraf xóa các tệp vượt quá max_path
  • > npm dedupe di chuyển các gói trùng lặp lên cấp cao nhất
  • > npm install -g flatten-packages chuyển tất cả các gói lên cấp cao nhất, nhưng có thể gây ra sự cố lập phiên bản
  • Nâng cấp lên npm@3mà cố gắng làm chonode_modules hệ thống thư mục phẳng tối đa.
    • Giao hàng với Node v5
    • Hoặc là… > npm install –g npm-windows-upgrade

0

Đây không phải là một giải pháp thích hợp, thay vì xử lý khi bạn đang vội, nhưng bạn có thể sử dụng 7-Zip để nén thư mục của mình, di chuyển tệp đã nén và giải nén mà không gặp bất kỳ vấn đề gì.

Chúng tôi đã sử dụng giải pháp đó để triển khai ứng dụng Node.js mà không thể thực hiện cài đặt npm sạch.


Vâng. Đây là những gì tôi làm mỗi khi tôi cần cài đặt mongoose. Nó có mã gốc trong đó và tôi đã có nhiều phiên bản Visual Studio = fail. Tôi chỉ có thể mở VS, đưa từng tệp .sln bị lỗi vào và xây dựng lại nó. Nhưng sẽ dễ dàng hơn khi chỉ XCOPY trên toàn bộ bộ thư mục node_modules \ mongoose của tôi khi cần thiết (tất nhiên là xem các phiên bản).
Michael Blankenship
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.