Làm cách nào để tạo nhiều dự án chia sẻ thư mục node_modules?


95

Bất cứ khi nào tôi tạo dự án, tôi phải tải xuống tất cả các phụ thuộc của mô-đun nút. Nếu không sao chép node_modules, Có cách nào để chia sẻ node_modules trung tâm trong nhiều dự án không?

như sau, tôi phải chạy nhiều lệnh mỗi khi ..

npm install gulp-usemin                                                                        
npm install gulp-wrap
npm install gulp-connect
npm install gulp-watch
npm install gulp-minify-css
npm install gulp-uglify
npm install gulp-concat
npm install gulp-less
npm install gulp-rename
npm install gulp-minify-html

3
Bạn có thể cài đặt chúng trong một thư mục mẹ chung, nếu có. Node sẽ đi lên các thư mục tìm kiếm requiremô-đun d. Nếu không, không, không có node_modulesthư mục "trung tâm" chính thức để sử dụng require().
Jonathan Lonowski

Bạn có thể cài đặt toàn cầu các gói này bằng cách sử dụng cờ toàn cầu. Vì vậy, bạn không cần phải chạy lệnh cài đặt mỗi lần. npm install <npm_package_name> -g
Saba Hassan

Câu trả lời:


90

Bạn hoàn toàn có thể chia sẻ thư mục node_modules giữa các dự án.

Từ tài liệu của nút :

Nếu từ định danh mô-đun được chuyển đến request () không phải là mô-đun gốc và không bắt đầu bằng '/', '../' hoặc './', thì nút bắt đầu tại thư mục mẹ của mô-đun hiện tại và thêm / node_modules và cố gắng tải mô-đun từ vị trí đó.

Nếu nó không được tìm thấy ở đó, thì nó sẽ di chuyển đến thư mục mẹ, và cứ tiếp tục như vậy, cho đến khi đạt đến thư mục gốc của hệ thống tệp.

Ví dụ: nếu tệp tại '/home/ry/projects/foo.js' được gọi là request ('bar.js'), thì nút sẽ tìm ở các vị trí sau, theo thứ tự sau:

/home/ry/projects/node_modules/bar.js /home/ry/node_modules/bar.js /home/node_modules/bar.js /node_modules/bar.js

Vì vậy, chỉ cần đặt một thư mục node_modules bên trong thư mục dự án của bạn và đặt bất kỳ mô-đun nào bạn muốn. Chỉ cần yêu cầu họ như bình thường. Khi nút không tìm thấy thư mục node_modules trong thư mục dự án của bạn, nó sẽ tự động kiểm tra thư mục mẹ. Vì vậy, hãy tạo cấu trúc thư mục của bạn như sau:

-myProjects
--node_modules
--myproject1
---sub-project
--myproject2

Vì vậy, như thế này, ngay cả các phụ thuộc của dự án con của bạn cũng có thể lấy trên kho lưu trữ node_modules chính của bạn.

Một hạn chế khi làm theo cách này là bạn sẽ phải tạo tệp package.json của mình theo cách thủ công (trừ khi ai đó biết cách tự động hóa việc này bằng grunt hoặc một cái gì đó). Khi bạn cài đặt các gói của mình và thêm --save đối số vào một npm installlệnh, nó sẽ tự động thêm nó vào phần phụ thuộc hoặc package.json của bạn, điều này rất tiện lợi.


3
Tại sao điều này không được chấp nhận như một câu trả lời? Câu hỏi khác cho @tpie, liệu một người có nên cấu trúc một dự án như bạn đã đề xuất, người ta sẽ xây dựng package.json như thế nào để cài đặt từ kho lưu trữ mô-đun mẹ.
diehell

@diehell Vì vậy, có vẻ như đó là "tất cả hoặc không có gì". Nếu tất cả hoặc các phần phụ thuộc nằm trong thư mục mẹ và không có thư mục node_modules trong CWD thì npm sẽ kiểm tra thư mục gốc và cài đặt ở đó nếu tìm thấy. Nếu bạn đặt một thư mục node_modules trong thư mục, nó sẽ cài đặt ở đó.
tpie

4
Tôi không thấy cách chia sẻ node_modules có thể xử lý các phiên bản gói khác nhau, các gói trong node_modules không được tạo phiên bản, không giống như npm-cache trong c: \ users (Windows), có ai gặp phải điều đó không?
cyberguest

Làm cách nào để sửa đổi mô hình của tôi khi viết các tập lệnh npm và các tệp package.json?
Maddocks

18

Tôi đã tìm thấy một mẹo nhỏ, chỉ cần xem các Liên kết tượng trưng (liên kết tượng trưng) trên Windows hoặc Linux , nó hoạt động giống như các phím tắt nhưng mạnh hơn.

Đơn giản bạn chỉ cần tạo một thư mục Junctioncủa mình ở node_modulesbất cứ đâu bạn muốn. Đường giao nhau không là gì ngoài một đoạn ngắn đối với thư mục node_modules ban đầu của bạn. Tạo nó bên trong thư mục dự án của bạn nơi node_modules thực sự sẽ được tạo nếu được sử dụng npm install.

Để đạt được điều này, bạn cần ít nhất một node_modulesthư mục thực sau đó tạo một Junction cho nó trong các dự án khác.

Trên Windows, bạn có thể sử dụng Command Prompt hoặc sử dụng một ứng dụng. Sử dụng Command Prompt cho phép bạn kiểm soát nhiều hơn một chút, sử dụng ứng dụng dễ dàng hơn, tôi đề xuất Link Shell Extension .


1
Tôi cd với mục tiêu dir, chạy lệnh này: mklink /d node_modules (source dir)\node_modules.
ChrisTorng

1
Nhóm của tôi đã sử dụng phương pháp này một thời gian. Mặc dù tôi thực sự coi thường việc không có node_modulestrong chính thư mục dự án, nhưng điều này hoạt động. Chỉ cần gotta nhớ để duyệt đến thực tế node_modulesthư mục trước khi cài đặt bất cứ điều gì mới: P
Andrew Craswell

Phương pháp này dường như không hiệu quả với tôi. Khi tôi sử dụng tượng trưng hoặc các đường nối, tôi gặp lỗi sau với node-sass: Xây dựng mô-đun không thành công: "Lỗi: Mô-đun không tự đăng ký" và lỗi có thêm chi tiết chỉ định thư mục nơi tồn tại thư mục node_modules "được chia sẻ". Có ý kiến ​​gì không?
mã lật

1
Làm thế nào để tránh bị cắt bớt phụ thuộc khi chạy npm installtrong bất kỳ ứng dụng "được kết nối" nào?
Qwerty

1
nhưng khi tôi chạy npm install <new-package>tất cả các gói không có trong package.json của dự án hiện tại của bạn đều bị xóa.
Rohit Kaushal

17

Hãy thử pnpm thay vì npm .

pnpm sử dụng liên kết cứng và liên kết tượng trưng để lưu một phiên bản mô-đun chỉ một lần trên đĩa.

Cài đặt bằng:

npm install -g pnpm

Để cập nhật các cài đặt hiện có của bạn (và các thư mục con), hãy sử dụng:

pnpm recursive install

8

Thư mục chính sẽ trông như thế này

node_modules
Project 1
Project 2
Project 3
Project 4

chỉ cần mở tệp Project 1/.angular-cli.json

thay đổi lược đồ

"$schema": "./node_modules/@angular/cli/lib/config/schema.json",

đến

"$schema": "./../node_modules/@angular/cli/lib/config/schema.json"

và đừng quên tạo node_modulesthư mục trống bên trong thư mục dự án của bạn


Bạn là người hùng của tôi. Tôi đã dành một tuần cho việc này. Cảm ơn bạn rất nhiều!!
Eliezer Berlin

5

Bằng cách xem xét một số bài báo, có vẻ như Lerna là một công cụ tốt để quản lý nhiều dự án bên trong một thư mục ( monorepo). Nó hỗ trợ chia sẻ mô-đun mà không cần sao chép toàn bộ các gói trong mọi thư mục và các lệnh cài đặt chúng trong nhiều dự án.

pnpm cũng là một công cụ đơn giản và hiệu quả, không trùng lặp những mô-đun đã được cài đặt cho các dự án khác.


0

Giả sử rằng có một node_modules duy nhất nó sẽ chứa tất cả các gói cho tất cả các ứng dụng. do đó các ứng dụng của bạn cũng sẽ chia sẻ hầu hết các mục nhập package.json duy nhất (chỉ là tên nên thay đổi)

ý tưởng của tôi sẽ là có một gốc duy nhất và nhiều cấp src như bên dưới

root\package.json
root\node_modules
root\\..
root\app1\src\\..
root\app2\src\\..

vấn đề duy nhất bạn có thể gặp phải là có bản sao lưu json (hoặc tsconfig) cho bất kỳ ứng dụng nào và khôi phục chúng khi bạn làm việc trên đó hoặc thiết lập các tập lệnh khởi động của bạn để phục vụ bất kỳ ứng dụng nào


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.