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

833
nfort 2014-04-06 21:34.

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

npm install [package_name]

và:

npm install [package_name] --save

và:

npm install [package_name] --save-dev

Điều đó có nghĩa là gì? Và những gì thực sự là hiệu ứng của --save-devtừ khoá?

13 answers

653
Tuong Le 2015-07-12 05:56.
  • --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ị, rút ​​gọn ..
  • --save được sử dụng để lưu gói cần thiết để ứng dụng chạy.
708
Michael Bruce 2017-02-14 04:25.

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

Giả sử bạn đang xây dựng một ứng dụng sử dụng gói thời điểm để phân tích cú pháp và hiển thị ngày tháng. Ứng dụng của bạn là một bộ lập lịch, vì vậy nó thực sự cần gói này để chạy, như 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 package.json của bạn

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

Khi bạn đang phát triển, nó thực sự hữu ích khi sử dụng các công cụ như bộ thử nghiệm và có thể cần lõinghiệp hoa nhài . 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 package.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 nó là một --save-devloại phụ thuộc, không có gì hơn. Bạn có thể thấy như thế nào nếu bạn không hiểu những gì đang thực sự xảy ra, hơi khó hình dung.

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

Sự phụ thuộc

Các phần phụ thuộc được chỉ định trong một đối tượng đơn giản ánh xạ tên gói tới một 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 bộ mô tả được phân tách bằng dấu cách. Sự phụ thuộc cũng có thể được xác định bằng URL tarball hoặc git.

Vui lòng không đặt dây kiểm tra hoặc bộ chuyển đổi trong đối tượng phụ thuộc của bạn. Xem devDependencies , bên dưới.

Ngay cả trong tài liệu, nó cũng yêu cầu bạn sử dụng --save-dev cho các mô-đun như dây nịt kiểm tra.

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

144
Lakshmi Swetha G 2017-02-16 01:17.

Theo mặc định, NPM chỉ cần cài đặt một gói trong node_modules. Khi bạn đang cố gắng cài đặt các phần phụ thuộc cho ứng dụng / mô-đun của mình, trước tiên bạn cần phải 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 của 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 đó chạy npm installtrực tiếp để cài đặt gói của bạn. Nó thường chỉ được cài đặt nếu ai đó sao chép kho lưu trữ nguồn của bạn trước và sau đó 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.

Phụ thuộc Dev 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ử nghiệm, 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 tham khảo tại đây.

-

Xin lưu ý rằng --savebây giờ là tùy chọn mặc định, kể từ NPM 5. Do đó, nó không cần thiết một cách rõ ràng nữa. Có thể chạy npm installmà không có --savekết quả tương tự.

67
Aritra Chakraborty 2019-07-02 02:16.

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

  • Bạn là nhà phát triển của một thư viện npm rất NGHIÊM TÚC . Trong đó 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 các 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 jestkhông? Chỉ để chạy thư viện của bạn?

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

Khi ai đó làm vậy, npm i yourPackagechỉ những thư viện cần thiết để CHẠY thư viện của bạn mới được cài đặt. Các thư viện khác mà bạn đã sử dụng để đóng gói mã của mình hoặc thử nghiệm và chế nhạo sẽ không được cài đặt vì bạn đã đưa 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 tiết lộ devDependancies ?

Giả sử gói của bạn là một gói mã 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 này 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 của bạn devDependencieschứ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.

65
Jackalope 2017-06-19 09:11.

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ó sẵn Typecript (một ngôn ngữ mã hóa có thể phân tích cú pháp javascript) để phát triển, nhưng khi ứng dụng được triển khai, nó không còn cần thiết nữa, vì tất cả mã đã được chuyển sang javascript. Như vậy, sẽ không có ý nghĩa gì nếu đưa nó vào ứng dụng đã 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.

34
wayfarer_boy 2014-04-14 22:32.

Theo gợi ý của @ andreas-hultgren trong câu trả lời này và theo tài liệu npm :

Nếu ai đó đang lên 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 không cần tải xuống và xây dựng khung tài liệu hoặc thử nghiệm 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 package.json đã được đồng nghiệp đánh giá và viết trước trong số những thứ khác) đặt tất cả các gói trong devDependencies và không có gì trong phụ thuộc, vì vậy có vẻ như việc sử dụng --save-devlà một cách an toàn trong webapp phát triển, ít nhất.

21
alex 2014-04-06 22:07.

--save-devlưu thông số kỹ thuật của 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".

10
Alireza 2018-08-13 17:25.

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 như thế nào :

Theo mặc định, cài đặt npm sẽ cài đặt tất cả các mô-đun được liệt kê dưới dạng phụ thuộc trong package.json. Với cờ --production (hoặc khi biến môi trường NODE_ENV được đặt thành production), 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
velhala 2018-07-23 09:26.

Bạn thường không muốn làm cồng kềnh gói sản xuất với những thứ mà bạn chỉ định sử dụng cho mục đích Phát triển.

Sử dụng --save-dev(hoặc -D) tùy chọn để tách các gói như khung Unit Test (jest, jasmine, 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, phải được cài đặt bằ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 nhập 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"
},
7
Ronny Sherer 2019-12-02 04:56.

Tất cả các giải thích ở đây đều tuyệt vời, nhưng thiếu một điều rất quan trọng: Làm thế nào để bạn cài đặt các phụ thuộc sản xuất? (không có phụ thuộc phát triển). Chúng tôi tách dependencieskhỏi devDependenciesbằng cách sử dụng --savehoặc --save-dev. Để cài đặt tất cả những gì chúng tôi 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
5
Biswadev 2017-11-28 22:30.

--save-dev được sử dụng cho các mô-đun được sử dụng trong quá trình phát triển ứng dụng, không yêu cầu khi chạy nó trong môi trường sản xuất --save được sử dụng để thêm nó vào package.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 - lưu để đưa vào các 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 vào dev -phụ thuộc.

npm link hoặc npm install cũng sẽ cài đặt các mô-đun phụ thuộc nhà phát triển cùng với các mô-đun phụ thuộc trong thư mục dự án của bạn

0
nuclear 2018-10-14 16:50.

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

Tôi nghĩ rằng tất cả các điểm 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 một thư viện HTTP có tên là 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 mã của họ. Mã của bạn sẽ được biên dịch với của anh ấy.

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-editorlà một trình biên tập web,

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

Vì vậy, ai đó không phân biệt trường hợp dù --savehay --save-dependencies, chỉ anh ta 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 đưa lodashmã mà mã của bạn sử dụng 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, họ cần unit testcompilerđưa chúng vàodev-dependencies

0
Tristanisginger 2019-03-20 00:53.

Mọi người sử dụng npm trong sản xuất để làm những thứ thú vị độ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ụ dành cho nhà phát triển của mình được chạy.

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

Related questions

MORE COOL STUFF

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett đã bất chấp những lời khuyên hẹn hò điển hình khi cô gặp chồng mình.

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Michael Sheen là một diễn viên phi lợi nhuận nhưng chính xác thì điều đó có nghĩa là gì?

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Ngôi sao của Hallmark Colin Egglesfield chia sẻ về những cuộc gặp gỡ với người hâm mộ ly kỳ tại RomaDrama Live! cộng với chương trình INSPIRE của anh ấy tại đại hội.

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Bạn sẽ phải phủi sạch đầu đĩa Blu-ray hoặc DVD để xem tại sao Northern Exposure trở thành một trong những chương trình nổi tiếng nhất của thập niên 90.

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

8 công dụng tuyệt vời của Baking Soda và Giấm

8 công dụng tuyệt vời của Baking Soda và Giấm

Bạn biết đấy, hai sản phẩm này là nguồn điện để làm sạch, riêng chúng. Nhưng cùng với nhau, chúng có một loạt công dụng hoàn toàn khác.

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Thủy điện rất cần thiết cho lưới điện của Hoa Kỳ, nhưng nó chỉ tạo ra năng lượng khi có nước di chuyển. Bao nhiêu nhà máy thủy điện có thể gặp nguy hiểm khi các hồ và sông cạn kiệt?

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Tóc tỉa từ các tiệm và các khoản quyên góp cá nhân có thể được tái sử dụng như những tấm thảm thấm dầu và giúp bảo vệ môi trường.

Một thương hiệu kế thừa khác có được cuộc sống mới khi những người chủ mới của Black Opal có được Hội chợ thời trang

Một thương hiệu kế thừa khác có được cuộc sống mới khi những người chủ mới của Black Opal có được Hội chợ thời trang

Desiree Rogers, trái, và Cheryl Mayberry McKissack Chuyển sang, Fenty Beauty và Pat McGrath, có một đế chế làm đẹp mới do phụ nữ làm chủ đang trỗi dậy. Sau thương vụ mua lại mỹ phẩm Black Opal vào tháng 9, đội ngũ quyền lực của Giám đốc điều hành công ty Desiree Rogers và Chủ tịch Cheryl Mayberry McKissack đã thông báo mua lại thương hiệu làm đẹp tiên phong Fashion Fair từ người sáng lập Johnson Publishing Company (JPC).

Ngoài việc trở nên vô nghĩa, các bên bộc lộ giới tính giờ đây đã trở nên chết người

Ngoài việc trở nên vô nghĩa, các bên bộc lộ giới tính giờ đây đã trở nên chết người

Đối với những người có quá nhiều thời gian, tiệc tiết lộ giới tính là một cách thú vị để không cần áp đặt những định kiến ​​hạn chế lên thai nhi trước một đối tượng bạn bè giả vờ quan tâm một cách lịch sự. Tuy nhiên, việc chỉ dựa vào những chiếc bánh nướng có màu nhân tạo để biểu thị một tiếng hoo-ha hoặc một đứa trẻ đi tè đã trở nên xa xỉ trong các bậc cha mẹ trên Instagram.

Kirstjen Nielsen đang cố gắng đổi mới bản thân với tư cách là một người phụ nữ 'nói ra sự thật cho sức mạnh'

Kirstjen Nielsen đang cố gắng đổi mới bản thân với tư cách là một người phụ nữ 'nói ra sự thật cho sức mạnh'

Hôm thứ Tư, cựu Bộ trưởng An ninh Nội địa Kirstjen Nielsen vì một lý do nào đó đã được đưa ra một diễn đàn để phát biểu tại Hội nghị thượng đỉnh Những người phụ nữ quyền lực nhất của Fortune. Và có thể đoán trước được, người phụ nữ giám sát các nỗ lực (đang diễn ra) của chính quyền Trump nhằm chia cắt các gia đình ở biên giới đã sử dụng thời gian của mình như một cơ hội để tự bảo vệ mình và tự nhận mình là người — và hãy hít thở sâu ở đây — “đã nói sự thật với quyền lực.

Toyota Racing Development sẽ cho ra mắt Supra 3000GT Concept, Massive Wing vào tháng tới

Toyota Racing Development sẽ cho ra mắt Supra 3000GT Concept, Massive Wing vào tháng tới

Vì thế hệ mới nhất của chiếc xe điều chỉnh được yêu thích trên thế giới hiện đã có mặt tại đây, nên chỉ có điều kiện là Toyota Racing Development sẽ đưa phiên bản Supra thế hệ thứ năm sửa đổi của riêng mình đến SEMA vào tháng tới. Toyota đã cho chúng tôi một gợi ý về những gì sẽ xảy ra trong tuần này: một chiếc Concept GR Supra 3000GT hiện đại.

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Rothschild's luggage got lost, but luckily she has an incredible closet to shop: Sister Paris Hilton's!

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa. Từ Hollywood đến New York và mọi nơi ở giữa, hãy xem các ngôi sao yêu thích của bạn đang làm gì!

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

Các nhà điều tra đang xem xét liệu nhóm và nghi phạm có biết nhau trước vụ tấn công hay không

Thanh thiếu niên, Gia đình Florida Hội đồng quản trị trường học về Luật 'Không nói đồng tính': 'Buộc chúng tôi tự kiểm duyệt'

Thanh thiếu niên, Gia đình Florida Hội đồng quản trị trường học về Luật 'Không nói đồng tính': 'Buộc chúng tôi tự kiểm duyệt'

Vụ kiện, nêu tên một số học khu, lập luận rằng dự luật "Không nói đồng tính" được ban hành gần đây của Florida "có hiệu quả im lặng và xóa bỏ học sinh và gia đình LGBTQ +"

Đường băng hạ cánh

Đường băng hạ cánh

Cuối hè đầu thu là mùa hoài niệm. Những chiếc đèn đường chiếu ánh sáng của chúng qua những con đường đẫm mưa, và những chiếc lá dưới chân - màu đỏ cam tắt trong bóng chạng vạng - là lời nhắc nhở về những ngày đã qua.

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Vào năm 2021, tôi khuyến khích bạn suy nghĩ lại mọi thứ bạn biết về khách hàng mà bạn phục vụ và những câu chuyện bạn kể cho họ. Lùi lại.

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Vào ngày sinh nhật thứ 9 của Felix The Cat, tôi nhớ về một trong những mất mát lớn nhất trong cuộc đời trưởng thành của tôi - Sophie của tôi vào năm 2013. Tôi đã viết bài luận này và chia sẻ nó trên nền tảng này một thời gian ngắn vào năm 2013.

Khi bạn không thể trở thành người mà Internet muốn bạn trở thành

Khi bạn không thể trở thành người mà Internet muốn bạn trở thành

Tôi ghét từ "tàu đắm". Mọi người cảm thấy thoải mái trong la bàn đạo đức của riêng mình, và khi làm như vậy, họ thấy mình vượt qua sự phán xét.

Language