Tóm tắt những khác biệt về hành vi quan trọng:
dependencies
được cài đặt trên cả hai:
npm install
từ một thư mục chứa package.json
npm install $package
trên bất kỳ thư mục khác
devDependencies
Chúng tôi:
- cũng được cài đặt trên
npm install
một thư mục chứa package.json
, trừ khi bạn vượt qua --production
cờ (đi lên câu trả lời của Gayan Charith ).
- không được cài đặt trên
npm install "$package"
bất kỳ thư mục nào khác, trừ khi bạn cung cấp cho nó --dev
tùy chọn.
- không được cài đặt quá cảnh.
peerDependencies
:
- trước 3.0: luôn được cài đặt nếu thiếu và gây ra lỗi nếu nhiều phiên bản phụ thuộc không tương thích sẽ được sử dụng bởi các phụ thuộc khác nhau.
- dự kiến bắt đầu vào ngày 3.0 (chưa được kiểm tra): đưa ra cảnh báo nếu thiếu
npm install
và bạn phải tự mình giải quyết sự phụ thuộc. Khi chạy, nếu thiếu phụ thuộc, bạn sẽ gặp lỗi (được đề cập bởi @nextgentech )
Độ biến đổi (được đề cập bởi Ben Hutchison ):
dependencies
được cài đặt liên tục: nếu A yêu cầu B và B yêu cầu C, thì C được cài đặt, nếu không, B không thể hoạt động và A.
devDependencies
không được cài đặt quá cảnh. Ví dụ: chúng ta không cần kiểm tra B để kiểm tra A, vì vậy các phụ thuộc kiểm tra của B có thể bị bỏ qua.
Các tùy chọn liên quan không được thảo luận ở đây:
sự phụ thuộc
dependencies
được yêu cầu để chạy, devDependencies
chỉ để phát triển, ví dụ: kiểm tra đơn vị, chuyển mã từ CoffeeScript sang JavaScript, thu nhỏ, ...
Nếu bạn định phát triển một gói, bạn tải xuống (ví dụ như thông qua git clone
), đi đến thư mục gốc chứa package.json
và chạy:
npm install
Vì bạn có nguồn thực tế, rõ ràng là bạn muốn phát triển nó, do đó, theo mặc định, cả hai dependencies
(tất nhiên, vì bạn phải chạy để phát triển) và devDependency
phụ thuộc cũng được cài đặt.
Tuy nhiên, nếu bạn chỉ là người dùng cuối chỉ muốn cài đặt gói để sử dụng gói đó, bạn sẽ thực hiện từ bất kỳ thư mục nào:
npm install "$package"
Trong trường hợp đó, thông thường bạn không muốn phụ thuộc phát triển, vì vậy bạn chỉ cần lấy những gì cần thiết để sử dụng gói : dependencies
.
Nếu bạn thực sự muốn cài đặt các gói phát triển trong trường hợp đó, bạn có thể đặt dev
tùy chọn cấu hình true
, có thể từ dòng lệnh là:
npm install "$package" --dev
Tùy chọn này false
theo mặc định vì đây là trường hợp ít phổ biến hơn nhiều.
đồng đẳng
(Đã kiểm tra trước 3.0)
Nguồn: https://nodejs.org/en/blog/npm/peer-dependencies/
Với các phụ thuộc thông thường, bạn có thể có nhiều phiên bản của phụ thuộc: đơn giản là nó được cài đặt bên trong node_modules
phần phụ thuộc.
Ví dụ, nếu dependency1
và dependency2
cả hai phụ thuộc vào dependency3
các phiên bản khác nhau, cây dự án sẽ trông như sau:
root/node_modules/
|
+- dependency1/node_modules/
| |
| +- dependency3 v1.0/
|
|
+- dependency2/node_modules/
|
+- dependency3 v2.0/
Tuy nhiên, các plugin là các gói thường không yêu cầu gói khác, được gọi là máy chủ trong ngữ cảnh này. Thay thế:
- bổ sung được yêu cầu bởi máy chủ lưu trữ
- plugin cung cấp một giao diện chuẩn mà chủ nhà mong muốn tìm thấy
- chỉ có máy chủ sẽ được người dùng gọi trực tiếp, do đó phải có một phiên bản duy nhất của nó.
Ví dụ, nếu dependency1
và dependency2
ngang hàng phụ thuộc vào dependency3
, cây dự án sẽ trông như sau:
root/node_modules/
|
+- dependency1/
|
+- dependency2/
|
+- dependency3 v1.0/
Điều này xảy ra mặc dù bạn không bao giờ đề cập đến dependency3
trong package.json
tập tin của bạn .
Tôi nghĩ rằng đây là một ví dụ của mẫu thiết kế Inversion of Control .
Một ví dụ mẫu về sự phụ thuộc ngang hàng là Grunt, máy chủ lưu trữ và các plugin của nó.
Ví dụ: trên một plugin Grunt như https://github.com/gruntjs/grunt-contrib-uglify , bạn sẽ thấy rằng:
grunt
là một peer-dependency
- chỉ
require('grunt')
có ở dưới tests/
: nó không thực sự được sử dụng bởi chương trình.
Sau đó, khi người dùng sẽ sử dụng một plugin, anh ta sẽ ngầm yêu cầu plugin từ Gruntfile
bằng cách thêm một grunt.loadNpmTasks('grunt-contrib-uglify')
dòng, nhưng đó là grunt
người dùng sẽ gọi trực tiếp.
Điều này sẽ không hoạt động sau đó nếu mỗi plugin yêu cầu một phiên bản Grunt khác nhau.
Hướng dẫn sử dụng
Tôi nghĩ rằng tài liệu trả lời câu hỏi khá tốt, có thể bạn không đủ quen thuộc với nút / trình quản lý gói khác. Tôi có lẽ chỉ hiểu nó bởi vì tôi biết một chút về Ruby bundler.
Dòng chính là:
Những thứ này sẽ được cài đặt khi thực hiện liên kết npm hoặc cài đặt npm từ thư mục gốc của gói và có thể được quản lý như mọi tham số cấu hình npm khác. Xem npm-config (7) để biết thêm về chủ đề.
Và sau đó dưới npm-config (7) tìm dev
:
Default: false
Type: Boolean
Install dev-dependencies along with packages.
optionalDependencies
ngay bây giờ.