Câu hỏi Sự khác biệt giữa các phụ thuộc, devDependencies và peerDependencies trong tệp npm package.json là gì?


Tài liệu này trả lời câu hỏi của tôi rất kém. Tôi không hiểu những lời giải thích đó. Ai đó có thể nói bằng những từ đơn giản hơn? Có thể với các ví dụ nếu khó chọn từ đơn giản?


1466
2017-09-18 14:57


gốc


Lưu ý cũng có optionalDependencies hiện nay. - Aidan Feldman
@AidanFeldman "optionalDependencies" là oxymoron của tôi trong ngày - Nick Bull


Các câu trả lời:


Tóm tắt các khác biệt về hành vi quan trọng:

  • dependencies được cài đặt trên cả hai:

    • npm install từ thư mục chứa package.json
    • npm install $package trên bất kỳ thư mục nào khác
  • devDependencies là:

    • cũng được cài đặt trên npm install trên một thư mục có chứa package.json, trừ khi bạn vượt qua --production cờ (đi upvote Câu trả lời của Gayan Charith).
    • chưa được cài đặt trên npm install "$package" trên bất kỳ thư mục nào khác, trừ khi bạn cho nó --dev Tùy chọn.
    • không được cài đặt quá mức.
  • peerDependencies:

    • trước 3.0: luôn được cài đặt nếu thiếu, và tăng lỗi nếu nhiều phiên bản không tương thích của phụ thuộc sẽ được sử dụng bởi các phụ thuộc khác nhau.
    • dự kiến ​​bắt đầu từ 3.0 (chưa được kiểm tra): đưa ra cảnh báo nếu thiếu npm installvà bạn phải tự mình giải quyết sự phụ thuộc. Khi chạy, nếu phụ thuộc bị thiếu, bạn sẽ gặp lỗi (được đề cập bởi @nextgentech)
  • Transitivity (được đề cập bởi Ben Hutchison):

    • dependencies được cài đặt quá cảnh: nếu A yêu cầu B và B yêu cầu C, thì C sẽ được cài đặt, nếu không thì B không thể hoạt động và cả A.

    • devDependencies không được cài đặt quá mức. 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 thử nghiệm 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:

devDependencies

dependencies được yêu cầu để chạy, devDependencies chỉ để phát triển, ví dụ: kiểm tra đơn vị, Coffeescript để Javascript transpilation, minification, ...

Nếu bạn định phát triển một gói, bạn tải xuống gói đó (ví dụ: qua git clone), chuyển đế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ó, vì vậy theo mặc định cả hai dependencies (vì tất nhiên 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 một gói để sử dụng nó, bạn sẽ làm từ bất kỳ thư mục nào:

npm install "$package"

Trong trường hợp đó, bạn thường không muốn phụ thuộc phát triển, vì vậy bạn chỉ cần có được 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 cho true, có thể từ dòng lệnh dưới dạng:

npm install "$package" --dev

Tùy chọn là false theo mặc định vì đây là trường hợp ít phổ biến hơn nhiều.

peerDependencies

(thử nghiệm trước 3.0)

Nguồn: https://nodejs.org/en/blog/npm/peer-dependencies/

Với các phụ thuộc thường xuyên, bạn có thể có nhiều phiên bản phụ thuộc: nó được cài đặt đơn giản bên trong node_modulescủa sự phụ thuộc.

Ví dụ. nếu dependency1 và dependency2 cả hai đều phụ thuộc vào dependency3 ở các phiên bản khác nhau, cây dự án sẽ trông giố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à chủ nhà trong ngữ cảnh này. Thay thế:

  • plugin là bắt buộc bởi chủ nhà
  • plugin cung cấp giao diện chuẩn mà máy chủ mong đợi tìm
  • chỉ người chủ sẽ được gọi trực tiếp bởi người dùng, 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 giống như:

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 của bạn package.json tập tin.

Tôi nghĩ đây là một ví dụ của Đảo ngược kiểm soát mẫu thiết kế.

Một ví dụ nguyên mẫu của các phụ thuộc ngang hàng là Grunt, host 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 peerDependency
  • duy nhất require('grunt') dưới tests/: nó không thực sự được chương trình sử dụng.

Sau đó, khi người dùng sẽ sử dụng plugin, anh ta sẽ ngầm yêu cầu plugin từ Gruntfile bằng cách thêm grunt.loadNpmTasks('grunt-contrib-uglify') nhưng đó là grunt mà 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

Tôi nghĩ rằng các doc trả lời câu hỏi khá tốt, có thể bạn không chỉ đủ quen thuộc với nút / 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 npm cài đặt từ thư mục gốc của gói và có thể được quản lý giống như bất kỳ thông số cấu hình npm nào 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.

1747
2018-02-25 04:25



Ah. Tôi hiểu tôi đã hiểu lầm. Câu trả lời của bạn đọc như thể npm install package là một lệnh mà bạn sử dụng để cài đặt tất cả các gói không phụ thuộc vào dev, chứ không phải những gì tôi nghĩ giờ đây, đó là 'cài đặt gói được gọi là [package]', đó là cách tôi nghĩ nó hoạt động trước khi đọc. Nếu tôi là bạn tôi muốn chỉnh sửa để nói [tên gói], trong đó cho thấy rõ ràng rằng những gì bạn có nghĩa là 'chèn-tên-đây'. - Tom W
Điều đó thật tuyệt! Tôi không bao giờ nhận ra, nhưng câu trả lời này đã dạy tôi rằng sự phụ thuộc so với sự khác biệt devDependencies chỉ áp dụng nếu bạn định xuất bản một gói npm. Nếu bạn chỉ làm việc trên một ứng dụng hoặc trang web, nó không quan trọng quá nhiều. Cảm ơn! - jedd.ahyoung
Bài đăng này phải được cập nhật để phản ánh thay đổi peerDependencies hành vi trong npm @ 3 sắp tới. Từ blog.npmjs.org/post/110924823920/npm-weekly-5Thay vào đó, chúng tôi sẽ cảnh báo bạn nếu sự phụ thuộc ngang hàng chưa được cài đặt, điều này đòi hỏi bạn phải tự giải quyết xung đột phụ thuộc ngang hàng, theo cách thủ công, nhưng về lâu dài, điều này sẽ làm cho nó ít có khả năng là bạn sẽ kết thúc ở một chỗ khó khăn với các gói phụ thuộc của bạn. " - nextgentech
Ngoài ra, devDependencies không được cài đặt quá tải bởi các gói phụ thuộc. Ví dụ: gói A phụ thuộc vào gói B. Gói B phụ thuộc vào gói C, và B cũng devDepends trên gói D. Nếu bạn chạy npm installtừ gói A, bạn sẽ nhận được B và C nhưng không phải D. - Ben Hutchison
@ JerilKuruvila Tôi không hiểu ý anh ấy là gì. Phân biệt dependencies và devDependencies cũng có thể hữu ích nếu bạn không xuất bản lên NPM. Ví dụ: bạn không muốn tập lệnh cung cấp sản xuất của mình tìm nạp phụ thuộc dev. - Ciro Santilli 新疆改造中心 六四事件 法轮功


Nếu bạn không muốn cài đặt devDependencies, bạn chỉ cần sử dụng npm install --production 


363
2017-07-05 10:06



npm install --save dành cho phần mềm phụ thuộc? - Vamsi Pavan Mahesh
npm install sẽ cài đặt tất cả các phụ thuộc. --save flag được sử dụng khi bạn muốn thêm module cụ thể vào package.json. ví dụ: - npm install uglify --save sẽ cài đặt uglify trong thư mục dự án của bạn và thêm uglify vào dự án, tệp package.json. - Gayan Charith
Và bởi vì chúng ta đang nói devDependencies, bạn có thể sử dụng --save-dev để lưu module mới như là một devDependency. Ví dụ: npm install uglify --save-dev - Mykaelos
Kể từ npm 5, --save tùy chọn không còn cần thiết nữa. Nếu bạn thực hiện "npm install my-package", nó sẽ thêm gói của tôi làm phụ thuộc vào package.json tập tin. - Martin Carel


Ví dụ, mocha bình thường sẽ là một phụ thuộc devD, bởi vì thử nghiệm không cần thiết trong sản xuất, trong khi thể hiện sẽ là một phụ thuộc.


91
2017-09-18 18:39



Tôi sẽ dựa vào việc thử nghiệm làm phụ thuộc vì bạn có thể muốn chạy thử nghiệm tự trước khi khởi chạy máy chủ sản xuất - Rudolf Olah
Thay vào đó, tôi khuyên bạn nên sử dụng một dịch vụ tích hợp liên tục như Hudson hoặc CircleCI để chạy thử nghiệm của bạn và sau đó triển khai sản xuất nếu họ vượt qua. - dankohn
Nó vẫn có thể có liên quan để kiểm tra máy chủ thực tế vì máy chủ CI có thể khác nhau bằng cách nào đó từ máy chủ prod và sự khác biệt này có thể, ví dụ: ngăn ứng dụng khởi động ... - Nicole
@ Nicole tại sao bạn sẽ làm cho máy chủ dàn dựng của bạn không giống nhau trong cấu hình cho sản phẩm của bạn? - Lucas
@Lucas ví dụ máy chủ phân tầng thường có một DB khác nhau và nằm trong một phân đoạn mạng khác với máy prod. Bất kỳ điều nào trong số này có thể là nguyên nhân tiềm năng gây ra lỗi. (Tất nhiên là phụ thuộc vào thiết lập và yêu cầu cụ thể của bạn.) - Nicole


Để lưu gói vào package.json như phụ thuộc dev:

npm install "$package" --save-dev

Khi bạn chạy npm install nó sẽ cài đặt cả hai devDependencies và dependencies. Để tránh cài đặt devDependencies chạy:

npm install --production

48
2018-01-08 06:41



bạn cũng có thể sử dụng: npm i -S - Maysara


Có một số mô-đun và gói chỉ cần thiết để phát triển, không cần thiết trong quá trình sản xuất. Giống như nó nói nó trong tài liệu:

Nếu ai đó đang có kế hoạch tải xuống và sử dụng mô-đun của bạn trong chương trình của họ, thì có thể họ không muốn hoặc cần tải xuống và xây dựng khung kiểm tra hoặc tài liệu bên ngoài mà bạn sử dụng. Trong trường hợp này, tốt nhất là liệt kê các mục bổ sung này trong một hàm băm phụ thuộc.


29
2017-09-18 14:59





phụ thuộc
Các phụ thuộc mà dự án của bạn cần chạy, giống như một thư viện cung cấp các hàm mà bạn gọi từ mã của bạn.
Chúng được cài đặt quá mức (nếu A phụ thuộc vào B phụ thuộc vào C, npm cài đặt trên A sẽ cài đặt B và C).
Ví dụ: lodash: dự án của bạn gọi một số hàm lodash.

devDependencies
Phụ thuộc bạn chỉ cần trong quá trình phát triển hoặc phát hành, như trình biên dịch lấy mã của bạn và biên dịch nó thành javascript, khung kiểm tra hoặc trình tạo tài liệu.
Chúng không được cài đặt quá mức (nếu A phụ thuộc vào B dev-phụ thuộc vào C, npm install on A sẽ chỉ cài đặt B).
Ví dụ: grunt: dự án của bạn sử dụng grunt để xây dựng chính nó.

peerDependencies
Các phụ thuộc mà dự án của bạn móc vào hoặc sửa đổi trong dự án mẹ, thường là một plugin cho một số thư viện hoặc công cụ khác. Nó chỉ nhằm mục đích kiểm tra, đảm bảo rằng dự án cha mẹ (dự án sẽ phụ thuộc vào dự án của bạn) có một sự phụ thuộc vào dự án mà bạn đưa vào. Vì vậy, nếu bạn tạo một plugin C bổ sung chức năng cho thư viện B, thì ai đó tạo dự án A sẽ cần phải có sự phụ thuộc vào B nếu họ có sự phụ thuộc vào C.
Chúng không được cài đặt (trừ khi npm <3), chúng chỉ được kiểm tra.
Ví dụ: grunt: dự án của bạn thêm chức năng để grunt và chỉ có thể được sử dụng trên các dự án sử dụng grunt.

Tài liệu này giải thích các phụ thuộc ngang hàng thực sự tốt: https://nodejs.org/en/blog/npm/peer-dependencies/ 

Ngoài ra, tài liệu npm đã được cải thiện theo thời gian và giờ đây đã có giải thích tốt hơn về các loại phụ thuộc khác nhau: https://github.com/npm/npm/blob/master/doc/files/package.json.md#devdependencies


18
2017-09-05 17:27





Một lời giải thích đơn giản mà làm cho nó rõ ràng hơn với tôi là:

Khi bạn triển khai ứng dụng của mình, các mô-đun phụ thuộc cần phải được cài đặt hoặc ứng dụng của bạn sẽ không hoạt động. Các module trong devDependencies không cần phải được cài đặt trên máy chủ sản xuất vì bạn không phát triển trên máy đó. liên kết


8
2017-09-29 15:36



Vì vậy, nếu chúng tôi đang làm cho trang web và trong phiên bản prod tất cả các libs sẽ được inlined vào vendor.js, tất cả deps của chúng tôi nên được dev deps nếu biên dịch mã được cam kết vào repo? Và nó nên được cam kết, như otherwice nó lạ mà bạn phải biên dịch module, không chỉ cài đặt nó (và thử nghiệm cũng là một nơi nào đó ở đây như bất kỳ thay đổi trong submodules có thể dẫn đến hồi quy) ... - Qwertiy
Câu trả lời tuyệt vời, nhưng có một câu hỏi? Webpack có thể xây dựng một gói bị hỏng không? Đoán của tôi là gói devDependencies sẽ không hoạt động trong phiên bản sản phẩm, webpack -p Ý tôi là. hãy trả lời câu hỏi của tôi. - AmerllicA
Nếu có bất kỳ vấn đề nào trong khi xây dựng sản phẩm, quy trình triển khai của bạn phải được thiết kế theo cách nó hiển thị lỗi tại thời điểm xây dựng và không đẩy mã bị lỗi vào sản xuất (ví dụ: bạn có thể thử Jenkins). Devways phụ thuộc không cần thiết phải được cài đặt trên máy chủ sản xuất. - Jyoti Duhan