Sự khác biệt giữa --save và --save-dev là gì?


747

Sự khác biệt giữa:

npm install [package_name] --save

và:

npm install [package_name] --save-dev

Điều đó có nghĩa là gì?


4
vâng tôi bối rối về điều này - nếu bạn sử dụng tích hợp liên tục như Jenkins, Jenkins có biết sử dụng các mô-đun devDependencies để chạy thử nghiệm không? Tôi giả sử như vậy nhưng nó không phải là siêu rõ ràng.
Alexander Mills

5
có lẽ chỉnh sửa câu hỏi để nói, sự khác biệt chức năng giữa phụ thuộc và devDependencies là gì?
Alexander Mills

5
Các gói được cài đặt qua tùy chọn --save-dev không được cài đặt lại khi người dùng thực thi npm install --production. Đó là sự khác biệt trong hoạt động (xem https://docs.npmjs.com/cli/install để biết thêm thông tin).
Andrew

7
@MuhammadUmer Đó chính xác là lý do tại sao mọi người đặt câu hỏi ở đây - để 'có được manh mối'. Có lẽ thêm một câu trả lời thực sự sẽ hiệu quả hơn - đây chắc chắn là một sự khác biệt thú vị mà tôi không biết.
Simon_Weaver

3
ngoài ra nếu bạn đặt biến môi trường NODE_ENVthành sản xuất, thì chỉ cần npm installtự động loại trừ các gói phát triển.
Muhammad Umer

Câu trả lời:


591
  • --save-devđược sử dụng để lưu gói cho mục đích phát triển. Ví dụ: kiểm tra đơn vị, thu nhỏ ..
  • --save được sử dụng để lưu gói cần thiết để ứng dụng chạy.

150
Họ khác nhau như thế nào? Khi nào tôi sẽ sử dụng cái này với cái kia? Tôi vẫn có thể sử dụng gói đó trong sản xuất nếu nó ở dưới --save-dev?
Dave Voyles 8/11/2016

14
Câu trả lời ngắn gọn trả lời hai câu hỏi đầu tiên của bạn. Câu trả lời cho câu hỏi cuối cùng, "Tôi vẫn có thể sử dụng gói trong sản xuất nếu nó nằm dưới --save-dev", là "không." Mặc dù chắc chắn có thể làm điều này, nhưng nó không có ý định.
Technetium

61
Tốc ký các phiên bản: -Dlà chữ viết tắt --save-dev-Slà chữ viết tắt--save
chrisco

164
Câu trả lời này thật mơ hồ. Ngay cả một ví dụ nhỏ cũng sẽ đi một chặng đường dài để giúp làm cho điều này rõ ràng hơn.
Choylton B. Higginbottom

33
Lưu ý rằng kể từ phiên bản npm 5.0.0, --savetùy chọn không còn cần thiết nữa. Nếu bạn làm như vậy npm install my-package, nó sẽ thêm "gói của tôi" làm phụ thuộc trong tệp pack.json.
Martin Carel

643

Sự khác biệt giữa --save--save-devcó thể không được chú ý ngay lập tức nếu bạn đã thử cả hai trong các dự án của riêng bạn. Vì vậy, đây là một vài ví dụ ...

Hãy nói rằng bạn đang xây dựng một ứng dụng sử dụng gói khoảnh khắc để phân tích và hiển thị ngày. Ứng dụng của bạn là một trình lập lịch biểu vì vậy nó thực sự cần gói này để chạy, vì trong: không thể chạy mà không có nó . Trong trường hợp này bạn sẽ sử dụng

npm install moment --save

Điều này sẽ tạo ra một giá trị mới trong gói.json của bạn

"dependencies": {
   ...
   "moment": "^2.17.1"
}

Khi bạn đang phát triển, nó thực sự giúp sử dụng các công cụ như bộ thử nghiệm và có thể cần lõi hoa nhàinghiệp . Trong trường hợp này bạn sẽ sử dụng

npm install jasmine-core --save-dev
npm install karma --save-dev

Điều này cũng sẽ tạo ra một giá trị mới trong gói.json của bạn

"devDependencies": {
    ...
    "jasmine-core": "^2.5.2",
    "karma": "^1.4.1",
}

Bạn không cần bộ thử nghiệm để chạy ứng dụng ở trạng thái bình thường, vì vậy đây là --save-devloại phụ thuộc, không có gì hơn. Bạn có thể thấy nếu bạn không hiểu những gì đang thực sự xảy ra, thì hơi khó tưởng tượng.

Lấy trực tiếp từ tài liệu NPM docs # phụ thuộc

Phụ thuộc

Phụ thuộc được chỉ định trong một đối tượng đơn giản ánh xạ tên gói thành phạm vi phiên bản. Phạm vi phiên bản là một chuỗi có một hoặc nhiều mô tả được phân tách bằng dấu cách. Phụ thuộc cũng có thể được xác định bằng một tarball hoặc git URL.

Xin vui lòng không đặt khai thác thử nghiệm hoặc bộ chuyển đổi trong đối tượng phụ thuộc của bạn. Xem devDependencies , dưới đây.

Ngay cả trong các tài liệu, nó yêu cầu bạn sử dụng --save-dev cho các mô-đun như khai thác thử nghiệm.

Tôi hy vọng điều này sẽ giúp và rõ ràng.


15
IMO, tôi nghĩ từ khóa 'lưu' là một vấn đề. Tại sao họ không tạo cờ -dev để phát triển và triển khai để triển khai. Nó có ý nghĩa hơn từ khóa 'lưu'.
Thịnh Vũ

1
Tại sao gói không biết (quyết định) nếu đó là gói phát hành hoặc gói dev và - được sử dụng cho cả hai. Có vẻ kỳ quặc để làm cho người dùng cài đặt quyết định điều này, khi nhà phát triển gói tạo ra ý định.
CodeGrue

4
CodeGrue, nếu bạn chỉ sử dụng jQuery để thử nghiệm các thành phần React thì nó sẽ đi vào save-dev, nhưng bạn thực sự có thể không sử dụng nó để xây dựng dự án chính của mình. Vâng, điều này là có thể. Vậy tại sao người đóng gói biết bạn đang làm gì với nó?
Michael Bruce

2
Rõ ràng hơn nhiều. Tôi là một anh chàng nhúng học quy trình làm việc Bootstra + Node.js lần đầu tiên. Không rõ ràng sự khác biệt là gì ngoài vòng bít.
Leroy105

3
@YakovL save-dev có nghĩa là các gói không được cài đặt khi có người khác cài đặt gói của bạn làm phụ thuộc của chúng. Các gói chỉ được sử dụng để chạy các tập lệnh như start / build sẽ không cần thiết trong trường hợp đó, vì vậy chúng được đặt trong các phụ thuộc dev. Nếu bạn đang làm việc trên một ứng dụng web chứ không phải trên một gói để người khác sử dụng, có lẽ bạn không nên lo lắng về nó.
RIV

111

Theo mặc định, NPM chỉ cần cài đặt một gói dưới node_modules. Khi bạn đang cố gắng cài đặt các phụ thuộc cho ứng dụng / mô-đun của mình, trước tiên bạn cần cài đặt chúng, sau đó thêm chúng vào dependenciesphần của bạn package.json.

--save-devthêm gói bên thứ ba vào các phụ thuộc phát triển của gói. Nó sẽ không được cài đặt khi ai đó cài đặt gói của bạn. Nó thường chỉ được cài đặt nếu ai đó nhân bản kho lưu trữ nguồn của bạn và chạy npm installtrong đó.

--savethêm gói của bên thứ ba vào các phụ thuộc của gói. Nó sẽ được cài đặt cùng với gói bất cứ khi nào ai đó chạy npm install package.

Dev phụ thuộc là những phụ thuộc chỉ cần thiết để phát triển gói. Điều đó có thể bao gồm người chạy thử, trình biên dịch, trình đóng gói, v.v ... Cả hai loại phụ thuộc đều được lưu trữ trong package.jsontệp của gói . --savethêm vào dependencies, --save-devthêm vàodevDependencies

tài liệu cài đặt npm có thể được giới thiệu ở đây.


37
Tôi nghi ngờ điều này ... bạn có thể sử dụng --save-dev và --save hoán đổi cho nhau nếu bạn đang xây dựng một ứng dụng web sẽ không trở thành một gói tức là được tải xuống từ npm, nếu bạn đang phát triển một gói để chia sẻ với người khác, thì nó là quan trọng để hiểu sự khác biệt.
VFein

13
Cuối cùng cũng cảm ơn ai đó đã nói mục đích của nó khi bạn sử dụng cài đặt npm
CapturedTree

3
--save hiện được mặc định với cài đặt npm với bản phát hành npm 5 năm 2017
NattyC

chờ đã, tại sao câu phức? Trong DevDependecy, nhà phát triển có thể cài đặt các gói và nó sẽ chỉ được cập nhật devDevependency. Vì vậy, khi nhà phát triển mới sao chép cơ sở mã dự án và chạy npm install => ở đây chỉ dependency package name is going to install.trong node_modules .. không phải gói của nhà phát triển như trong phụ thuộc Dev.
Anupam Maurya

60

Một ví dụ hoàn hảo về điều này là:

$ npm install typescript --save-dev

Trong trường hợp này, bạn muốn có Bản in (ngôn ngữ mã hóa có thể phân tích bằng javascript) để phát triển, nhưng một khi ứng dụng được triển khai, thì không còn cần thiết nữa, vì tất cả các mã đã được dịch sang javascript. Như vậy, sẽ không có nghĩa gì nếu đưa nó vào ứng dụng được xuất bản. Thật vậy, nó sẽ chỉ chiếm dung lượng và tăng thời gian tải xuống.


4
Điều tương tự cũng xảy ra với: "$ npm install grunt --save-dev", vì nó hữu ích cho việc phát triển, nhưng không phải để triển khai.
Jackalope

1
Lưu ý phụ: Microsoft đề nghị cài đặt các gói @ type / xxx làm phụ thuộc, không phải devDependencies github.com/Microsoft/types-publisher/issues/81
Dave

2
Điều tôi thấy khó hiểu là làm thế nào điều này thậm chí quan trọng? Các gói được lưu bằng cách sử dụng --savevẫn chỉ được lưu trong node_modulesthư mục. Mã không được bao gồm trong trang web được triển khai.
Kokodoko

6
@Kokodoko Khi bạn sử dụng --save-devcờ, gói được thêm vào devDependenciesđối tượng của bạn . Nếu / khi ai đó cài đặt gói của bạn , tất cả dependenciesđều được tải xuống nhưng devDependencieskhông phải vì chúng không bắt buộc khi chạy. Như câu trả lời đã nêu, điều này giúp họ tiết kiệm thời gian và không gian. Các nhà phát triển làm việc trên chính các tệp gói của bạn chỉ có thể chạy npm installbên trong thư mục gói để cài đặt devDependencies.
Jasjit Singh Marwah 18/03/18

Vì vậy, nếu bạn tải xuống một repo từ github và gõ npm install, devDependenciesbị bỏ qua?
Kokodoko

41

Tôi sẽ cho bạn một ví dụ,

  • Bạn là một nhà phát triển của một thư viện npm rất SERIOUS . Mà sử dụng các thư viện thử nghiệm khác nhau để kiểm tra gói.
  • Một người dùng đã tải xuống thư viện của bạn và muốn sử dụng nó trong mã của họ. Họ có cần tải xuống thư viện thử nghiệm của bạn không? Có thể bạn sử dụng jestđể thử nghiệm và họ sử dụng mocha. Bạn có muốn họ cài đặt jestlà tốt? Chỉ để chạy thư viện của bạn?

Không có quyền? Đó là lý do tại sao họ ở devDependencies.

Khi ai đó làm như vậy, npm i yourPackagechỉ các thư viện cần thiết để CHẠY thư viện của bạn sẽ được cài đặt. Các thư viện khác mà bạn đã sử dụng để gói mã của mình hoặc kiểm tra và chế nhạo sẽ không được cài đặt vì bạn đặt chúng vào devDependencies. Khá gọn gàng phải không?

Vì vậy, tại sao các nhà phát triển cần phải phơi bày các devDependancies ?

Giả sử gói của bạn là gói nguồn mở và 100 người đang gửi yêu cầu kéo đến gói của bạn. Sau đó, họ sẽ kiểm tra gói như thế nào? Họ sẽ git clonerepo của bạn và khi họ sẽ làm một npm isự phụ thuộc cũng như devDependencies .
Bởi vì họ không sử dụng gói của bạn. Họ đang phát triển gói hơn nữa, do đó, để kiểm tra gói của bạn, họ cần phải vượt qua các trường hợp thử nghiệm hiện có cũng như viết mới. Vì vậy, họ cần sử dụng devDependenciesthư viện chứa tất cả các thư viện thử nghiệm / xây dựng / chế nhạo mà BẠN đã sử dụng.


8
Tốt hơn nhiều so với câu trả lời được chấp nhận cũng như câu trả lời với số phiếu tối đa vì câu trả lời này thực tế hơn về bản chất. Cảm ơn!
ngoại lệ

Đây nên là câu trả lời được lựa chọn. Tất cả các câu trả lời khác không thực sự giải thích TẠI SAO bạn sẽ sử dụng cái này hơn cái kia.
Rocky Kev

34

Theo đề xuất của @ andreas-hultgren trong câu trả lời này và theo các tài liệu npm :

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ó lẽ họ không muốn hoặc không 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.

Tuy nhiên, để phát triển ứng dụng web, Yeoman (một công cụ giàn giáo cài đặt tệp pack.json được đánh giá ngang hàng trong số những thứ khác) đặt tất cả các gói trong devDependencies và không có gì phụ thuộc, vì vậy có vẻ như việc sử dụng --save-devlà đặt cược an toàn trong phát triển webapp , ít nhất.


3
Lưu ý rằng tôi đã gặp phải sự cố khi sử dụng gulp và cài đặt các gói --save-devmà gói sẽ không cài đặt các phụ thuộc cần thiết. Chạy --savecài đặt những phụ thuộc bị thiếu.
Nick M

18
Tôi cũng muốn lưu ý rằng tôi hiện đang sử dụng --savecho tất cả trừ phụ thuộc kiểm tra và tài liệu (theo tài liệu npm). Tôi đang bắt đầu nghĩ rằng ví dụ Yeoman mà tôi đã đề cập ở trên không phải là một ví dụ tốt về thực hành tốt nhất.
wayfarer_boy

Tôi cũng nghĩ vậy, tại sao bạn cần --save-devchỉ trở nên ít rõ ràng hơn với mỗi câu trả lời ở đây :)
Kokodoko

20

--save-devlưu thông số semver vào mảng "devDependencies" trong tệp mô tả gói của bạn, thay --savevào đó lưu nó vào "phụ thuộc".


83
và sự khác biệt chức năng là gì?
ahnbizcad

6
Câu trả lời này có ý nghĩa nhất đối với tôi, devDepencies sau đó được yêu cầu để phát triển chứ không phải sản xuất, vì vậy htmllint, sass biên dịch vv và Phụ thuộc cho các yêu cầu sản xuất, chẳng hạn như Diaporama sẽ cần phải có mặt để chạy.
xay con khỉ đột

3
@ahnbizcad Nó được trả lời tốt hơn ở đây nhưng sự khác biệt về chức năng chính là devDependencies không được bao gồm quá cảnh.
Pace

Đây không phải là cách trực quan nhất để mô tả nó cho một người chưa biết, phải không?: Dev --save-devlàm cho các gói cục bộ cho dự án của bạn, trong khi --savelàm cho chúng trở thành cục bộ để cài đặt nút của bạn?
ahnbizcad

9

Câu trả lời rõ ràng đã được cung cấp. Nhưng điều đáng nói là devDependenciesảnh hưởng đến việc cài đặt các gói:

Theo mặc định, cài đặt npm sẽ cài đặt tất cả các mô-đun được liệt kê là phụ thuộc trong gói.json. Với cờ - sản phẩm (hoặc khi biến môi trường NODE_ENV được đặt thành sản xuất), npm sẽ không cài đặt các mô-đun được liệt kê trong devDependencies.

Xem: https://docs.npmjs.com/cli/install


8

Nói chung, bạn không muốn làm phình gói sản xuất với những thứ mà bạn chỉ có ý định sử dụng cho mục đích Phát triển.

Sử dụng tùy chọn --save-dev(hoặc -D) để phân tách các gói như khung Kiểm tra đơn vị (jest, hoa nhài, mocha, chai, v.v.)

Bất kỳ gói nào khác mà ứng dụng của bạn cần cho Sản xuất, nên được cài đặt bằng cách sử dụng --save(hoặc -S).

npm install --save lodash       //prod dependency
npm install -S moment           // "       "
npm install -S opentracing      // "       "

npm install -D jest                 //dev only dependency
npm install --save-dev typescript   //dev only dependency

Nếu bạn mở package.jsontệp thì bạn sẽ thấy các mục này được liệt kê dưới hai phần khác nhau:

"dependencies": {
  "lodash": "4.x",
  "moment": "2.x",
  "opentracing": "^0.14.1"
},

"devDependencies": {
    "jest": "22.x",
    "typescript": "^2.8.3"
},

5

--save-dev được sử dụng cho các mô-đun được sử dụng để phát triển ứng dụng, không yêu cầu trong khi chạy nó trong môi trường sản xuất --save được sử dụng để thêm nó trong pack.json và nó được yêu cầu để chạy ứng dụng.

Ví dụ: express, body-Parser, lodash, mũ bảo hiểm, mysql tất cả những thứ này được sử dụng trong khi chạy ứng dụng - sử dụng để đặt phụ thuộc trong khi mocha, istanbul, chai, sonarqube-Scanner đều được sử dụng trong quá trình phát triển, vì vậy hãy đặt chúng trong dev phụ thuộc.

Liên kết npm hoặc cài đặt npm cũng sẽ cài đặt các mô đun phụ thuộc dev cùng với các mô đun phụ thuộc trong thư mục dự án của bạn


3

Tất cả các giải thích ở đây là tuyệt vời, nhưng thiếu một điều rất quan trọng: Làm thế nào để bạn chỉ cài đặt phụ thuộc sản xuất? (không có sự phụ thuộc phát triển). Chúng tôi tách dependenciesra devDependenciesbằng cách sử dụng --savehoặc --save-dev. Để cài đặt tất cả chúng ta sử dụng:

npm i

Để chỉ cài đặt các gói sản xuất, chúng ta nên sử dụng:

npm i --only=production

0

Tôi muốn thêm một số ý tưởng của tôi như

Tôi nghĩ rằng tất cả sự khác biệt sẽ xuất hiện khi ai đó sử dụng mã của bạn thay vì sử dụng một mình

Ví dụ: bạn viết thư viện HTTP có tên node's request

Trong thư viện của bạn,

bạn đã sử dụng lodash để xử lý chuỗi và đối tượng, không có lodash, mã của bạn không thể chạy

Nếu ai đó sử dụng thư viện HTTP của bạn như một phần của mã của mình. Mã của bạn sẽ được biên dịch với của mình.

mã của bạn cần lodash, vì vậy bạn cần đưa vào dependenciesđể biên dịch


Nếu bạn viết một dự án như monaco-editor, đó là một trình soạn thảo web,

bạn đã gói tất cả các mã của mình và product env librarysử dụng gói web của bạn , khi quá trình xây dựng hoàn thành, chỉ có mộtmonaco-min.js

Vì vậy, một người nào đó không trường hợp dù --savehay --save-dependencies, chỉ có ông cần làmonaco-min.js

Tóm lược:

  1. Nếu ai đó muốn biên dịch mã của bạn (sử dụng làm thư viện), hãy đặt lodashmã được sử dụng bởi mã của bạn vàodependencies

  2. Nếu ai đó muốn thêm nhiều tính năng hơn vào mã của bạn, anh ta cần unit testcompiler, đặt chúng vàodev-dependencies


0

Mọi người sử dụng npm trong sản xuất để làm những thứ hay ho độc ác, Node.js là một ví dụ về điều này, vì vậy bạn không muốn tất cả các công cụ dev của mình được chạy.

Nếu bạn đang sử dụng gulp (hoặc tương tự) để tạo tệp xây dựng để đặt trên máy chủ của mình thì điều đó không thực sự quan trọng.

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.