Apa perbedaan antara --save dan --save-dev?

747

Apa perbedaan antara:

npm install [package_name] --save

dan:

npm install [package_name] --save-dev

Apa artinya ini?

nfort
sumber
4
ya saya bingung tentang ini - jika Anda menggunakan integrasi berkelanjutan seperti Jenkins, apakah Jenkins tahu untuk menggunakan modul devDependencies untuk menjalankan tes? Saya berasumsi begitu tapi itu tidak terlalu jelas.
Alexander Mills
5
mungkin mengedit pertanyaan juga untuk mengatakan, apa perbedaan fungsional antara dependensi dan dependensi dev?
Alexander Mills
5
Paket yang diinstal melalui opsi --save-dev tidak diinstal ulang saat pengguna menjalankannya npm install --production. Itulah perbedaan operasional (lihat https://docs.npmjs.com/cli/install untuk info lebih lanjut).
Andrew
7
@MuhammadUmer. Justru itulah sebabnya orang-orang bertanya di sini - untuk 'mendapatkan petunjuk'. Mungkin menambahkan jawaban nyata akan lebih produktif - ini jelas perbedaan yang menarik yang tidak saya sadari.
Simon_Weaver
3
juga jika Anda menetapkan variabel lingkungan NODE_ENVke produksi, maka hanya npm installsecara otomatis mengecualikan paket pengembangan.
Muhammad Umer

Jawaban:

591
  • --save-devdigunakan untuk menyimpan paket untuk tujuan pengembangan. Contoh: tes unit, minifikasi ..
  • --save digunakan untuk menyimpan paket yang diperlukan untuk menjalankan aplikasi.
Tuong Le
sumber
150
Bagaimana mereka berbeda? Kapan saya akan menggunakan satu vs yang lain? Masih bisakah saya menggunakannya dalam paket produksi jika masih di bawah --save-dev?
Dave Voyles
14
Jawabannya dengan ringkas menjawab dua pertanyaan pertama Anda. Jawaban untuk pertanyaan terakhir, "Bisakah saya masih menggunakan paket dalam produksi jika di bawah --save-dev," adalah "tidak." Meskipun tentu mungkin untuk melakukan ini, itu tidak dimaksudkan.
Technetium
61
Versi -Dsingkat : kependekan dari --save-devdan -Smerupakan kependekan dari--save
chrisco
164
Jawaban ini jelas tidak jelas. Bahkan sebuah contoh kecil akan membantu membuat ini menjadi lebih jelas.
Choylton B. Higginbottom
33
Perhatikan bahwa pada npm versi 5.0.0, --saveopsi tidak lagi diperlukan. Jika Anda melakukannya npm install my-package, itu akan menambahkan "paket saya" sebagai dependensi dalam file package.json.
Martin Carel
644

Perbedaan antara --savedan --save-devmungkin tidak segera terlihat jika Anda telah mencoba keduanya di proyek Anda sendiri. Jadi, inilah beberapa contoh ...

Katakanlah Anda sedang membangun aplikasi yang menggunakan paket momen untuk mem-parsing dan menampilkan tanggal. Aplikasi Anda adalah penjadwal sehingga sangat membutuhkan paket ini untuk dijalankan, seperti pada: tidak dapat berjalan tanpanya . Dalam hal ini yang akan Anda gunakan

npm install moment --save

Ini akan menciptakan nilai baru di package.json Anda

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

Ketika Anda sedang berkembang, sangat membantu untuk menggunakan alat-alat seperti test suites dan mungkin memerlukan inti melati dan karma . Dalam hal ini yang akan Anda gunakan

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

Ini juga akan menciptakan nilai baru di package.json Anda

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

Anda tidak perlu rangkaian uji untuk menjalankan aplikasi dalam keadaan normal, jadi ini adalah --save-devketergantungan tipe, tidak lebih. Anda dapat melihat bagaimana jika Anda tidak mengerti apa yang sebenarnya terjadi, itu agak sulit untuk dibayangkan.

Diambil langsung dari NPM docs docs # dependencies

Ketergantungan

Ketergantungan ditentukan dalam objek sederhana yang memetakan nama paket ke rentang versi. Rentang versi adalah string yang memiliki satu atau lebih deskriptor yang dipisahkan oleh ruang. Ketergantungan juga dapat diidentifikasi dengan tarball atau URL git.

Tolong jangan menaruh test harness atau transpiler di objek dependensi Anda. Lihat devDependencies , di bawah ini.

Bahkan dalam dokumen, ia meminta Anda untuk menggunakan --save-dev untuk modul seperti test harness.

Saya harap ini membantu dan jelas.

Michael Bruce
sumber
15
IMO, saya pikir kata kunci 'save' adalah masalah. Mengapa mereka tidak membuat flag -dev untuk dikembangkan dan -deploy untuk ditempatkan. Masuk akal daripada kata kunci 'simpan'.
Thinh Vu
1
Mengapa paket itu tidak tahu (memutuskan) apakah itu paket rilis atau paket dev dan --simpan digunakan untuk keduanya. Tampaknya aneh untuk membuat pengguna instalasi memutuskan ini, ketika pengembang paket menciptakan niat.
CodeGrue
4
CodeGrue, jika Anda menggunakan jQuery hanya untuk menguji komponen Bereaksi itu akan masuk ke save-dev, tetapi Anda mungkin tidak benar-benar menggunakannya untuk membangun proyek utama Anda. Ya, ini mungkin. Jadi mengapa pembuat paket itu tahu apa yang Anda lakukan dengannya?
Michael Bruce
2
Jauh lebih jelas. Saya seorang pria tertanam yang mempelajari alur kerja Bootstra + Node.js untuk pertama kalinya. Tidak jelas apa perbedaannya.
Leroy105
3
@YakovL save-dev berarti paket tidak diinstal ketika orang lain menginstal paket Anda sebagai ketergantungannya. Paket-paket yang hanya digunakan untuk menjalankan skrip seperti start / build tidak diperlukan dalam kasus itu, jadi mereka dimasukkan dalam dependensi dev. Jika Anda bekerja pada aplikasi web dan bukan pada paket untuk digunakan oleh orang lain, Anda mungkin tidak perlu khawatir sama sekali.
riv
112

Secara default, NPM hanya menginstal paket di bawah node_modules. Ketika Anda mencoba menginstal dependensi untuk aplikasi / modul Anda, Anda harus menginstalnya terlebih dahulu, dan kemudian menambahkannya ke dependenciesbagian Anda package.json.

--save-devmenambahkan paket pihak ketiga ke dependensi pengembangan paket. Itu tidak akan diinstal ketika seseorang menginstal paket Anda. Ini biasanya hanya diinstal jika seseorang mengkloning repositori sumber Anda dan berjalan npm installdi dalamnya.

--savemenambahkan paket pihak ketiga ke dependensi paket. Ini akan diinstal bersama dengan paket setiap kali seseorang berjalan npm install package.

Dependensi Dev adalah dependensi yang hanya diperlukan untuk mengembangkan paket. Itu bisa termasuk pelari uji, kompiler, pembuat paket, dll. Kedua jenis dependensi disimpan dalam file paket package.json. --savemenambah dependencies, --save-devmenambahdevDependencies

dokumentasi instalasi npm dapat dirujuk di sini.

Lakshmi Swetha G
sumber
37
Saya curiga ini ... Anda dapat menggunakan --save-dev dan --save secara bergantian jika Anda membangun aplikasi web yang tidak akan menjadi paket yaitu diunduh dari npm, jika Anda mengembangkan paket untuk berbagi dengan orang lain, itu Penting untuk memahami perbedaannya.
VFein
13
Terima kasih akhirnya seseorang yang mengatakan tujuannya ketika Anda menggunakan npm install
CapturedTree
3
--save sekarang default dengan npm install dengan rilis npm 5 pada 2017
NattyC
tunggu, mengapa kalimatnya rumit? Dalam pengembang DevDependecy dapat menginstal paket, dan itu akan diperbarui hanya devDevependency. Jadi ketika pengembang baru mengkloning basis kode proyek dan menjalankan npm install => di sini hanya dependency package name is going to install.di node_modules .. bukan paket pengembang seperti pada Dev-dependency.
Anupam Maurya
60

Contoh sempurna untuk ini adalah:

$ npm install typescript --save-dev

Dalam hal ini, Anda ingin memiliki Typecript (bahasa pengkodean javascript-parseable) yang tersedia untuk pengembangan, tetapi setelah aplikasi dikerahkan, itu tidak perlu lagi, karena semua kode telah ditranslasikan ke javascript. Dengan demikian, tidak masuk akal untuk memasukkannya ke dalam aplikasi yang diterbitkan. Memang, itu hanya akan memakan waktu dan meningkatkan waktu unduhan.

Jackalope
sumber
4
Hal yang sama berlaku untuk: "$ npm install grunt --save-dev", karena berguna untuk pengembangan, tetapi tidak untuk penyebaran.
Jackalope
1
Catatan tambahan: Microsoft menyarankan untuk menginstal paket @ types / xxx sebagai dependensi, bukan devDependencies github.com/Microsoft/types-publisher/issues/81
Dave
2
Apa yang saya anggap membingungkan adalah bagaimana ini penting? Paket yang disimpan menggunakan --savehanya disimpan di node_modulesfolder. Kode tidak termasuk dalam situs web yang digunakan.
Kokodoko
6
@Kokodoko Saat Anda menggunakan --save-devflag, paket ditambahkan ke devDependenciesobjek Anda . Jika / ketika seseorang menginstal paket Anda , semua dependenciesdiunduh tetapi devDependenciestidak, karena mereka tidak diharuskan saat runtime. Seperti jawaban yang dinyatakan, ini menghemat waktu dan ruang mereka. Pengembang yang mengerjakan file paket Anda sendiri dapat berjalan npm installdi dalam direktori paket untuk menginstalnya devDependenciesjuga.
Jasjit Singh Marwah
Jadi, jika Anda mengunduh repo dari github dan mengetik npm install, devDependenciesapakah diabaikan?
Kokodoko
41

Biarkan saya memberi Anda sebuah contoh,

  • Anda adalah pengembang perpustakaan npm yang sangat SERIUS . Yang menggunakan pustaka pengujian yang berbeda untuk menguji paket.
  • Seorang pengguna Mengunduh perpustakaan Anda dan ingin menggunakannya dalam kode mereka. Apakah mereka perlu mengunduh perpustakaan pengujian Anda juga? Mungkin Anda gunakan jestuntuk pengujian dan mereka gunakan mocha. Apakah Anda ingin mereka menginstal jestjuga? Hanya Untuk menjalankan perpustakaan Anda?

Tidak benar? Itu sebabnya mereka berada di devDependencies.

Ketika seseorang melakukannya, npm i yourPackagehanya perpustakaan yang diperlukan untuk MENJALANKAN perpustakaan Anda akan diinstal. Perpustakaan lain yang Anda gunakan untuk menggabungkan kode Anda dengan atau pengujian dan mengejek tidak akan diinstal karena Anda memasukkannya ke dalam devDependencies. Cukup rapi bukan?

Jadi, mengapa para pengembang perlu memaparkan devDependancies ?

Katakanlah paket Anda adalah paket sumber terbuka dan 100 orang mengirim permintaan tarik ke paket Anda. Lalu bagaimana mereka akan menguji paket tersebut? Mereka akan git clonerepo Anda dan ketika mereka akan melakukan npm iyang dependensi serta devDependencies .
Karena mereka tidak menggunakan paket Anda. Mereka mengembangkan paket lebih lanjut, sehingga, untuk menguji paket Anda, mereka harus lulus uji kasus yang ada dan juga menulis yang baru. Jadi, mereka perlu menggunakan devDependenciesperpustakaan Anda yang berisi semua perpustakaan pengujian / bangunan / mengejek yang ANDA gunakan.

Aritra Chakraborty
sumber
8
Jauh lebih baik daripada jawaban yang diterima serta jawaban dengan suara maksimal karena jawaban ini lebih praktis. Terima kasih!
Pengecualian tanpa tertangkap
Ini harus menjadi jawaban yang dipilih. Semua jawaban lain tidak benar-benar menjelaskan MENGAPA Anda akan menggunakan satu di atas yang lain.
Rocky Kev
34

Seperti yang disarankan oleh @ andreas-hultgren dalam jawaban ini dan menurut npm docs :

Jika seseorang berencana mengunduh dan menggunakan modul Anda dalam program mereka, maka mereka mungkin tidak ingin atau perlu mengunduh dan membuat kerangka uji atau dokumentasi eksternal yang Anda gunakan.

Namun, untuk pengembangan webapp, Yeoman (alat perancah yang menginstal file paket.json yang ditinjau oleh rekan-rekan, antara lain) menempatkan semua paket di devDependency dan tidak ada dalam dependensi, sehingga tampaknya penggunaan --save-devtaruhan yang aman dalam pengembangan webapp , setidaknya.

wayfarer_boy
sumber
3
Perhatikan bahwa saya telah mengalami masalah ketika menggunakan tegukan dan menginstal paket dengan --save-devmana paket tidak akan menginstal dependancies yang diperlukan. Menjalankan --savemenginstal dependensi yang hilang.
Nick M
18
Saya juga ingin mencatat bahwa saya sekarang menggunakan --saveuntuk semua kecuali dependensi pengujian dan dokumentasi (sesuai npm docs). Saya mulai berpikir contoh Yeoman yang saya sebutkan di atas bukan contoh yang baik dari praktik terbaik.
wayfarer_boy
Saya pikir juga begitu, mengapa Anda perlu --save-devmenjadi semakin tidak jelas dengan setiap jawaban di sini :)
Kokodoko
20

--save-devmenyimpan spec semver ke dalam array "devDependencies" dalam file deskriptor paket Anda, dan --savemenyimpannya dalam "dependensi".

alex
sumber
83
dan apa perbedaan fungsionalnya?
ahnbizcad
6
jawaban ini paling masuk akal bagi saya, devDependency kemudian diperlukan untuk pengembangan tetapi bukan produksi, jadi htmllint, kompilasi sass dll dan Ketergantungan adalah untuk persyaratan produksi, seperti Diaporama yang perlu hadir untuk hal-hal yang harus dijalankan.
penggiling gorila
3
@ ahnbizcad Di sini dijawab lebih baik, tetapi perbedaan fungsional utama adalah bahwa dependensi devD tidak termasuk secara transitif.
Laju
Bukankah cara paling intuitif untuk menggambarkannya untuk seseorang yang belum tahu, ini ?: Dev --save-devmembuat paket-paket lokal untuk proyek Anda, sedangkan --savemembuatnya lokal untuk instalasi node Anda?
ahnbizcad
9

Jawaban yang jelas sudah disediakan. Tetapi perlu disebutkan bagaimana devDependenciesmemengaruhi menginstal paket:

Secara default, npm install akan menginstal semua modul yang terdaftar sebagai dependensi di package.json. Dengan flag --production (atau ketika variabel lingkungan NODE_ENV diatur ke produksi), npm tidak akan menginstal modul yang terdaftar di devDependencies.

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

Alireza
sumber
8

Anda biasanya tidak ingin mengasapi paket produksi dengan hal-hal yang hanya ingin Anda gunakan untuk tujuan Pengembangan.

Gunakan opsi --save-dev(atau -D) untuk memisahkan paket-paket seperti kerangka kerja Unit Test (bercanda, melati, moka, chai, dll.)

Paket lain apa pun yang dibutuhkan aplikasi Anda untuk Produksi, harus diinstal menggunakan --save(atau -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

Jika Anda membuka package.jsonfile maka Anda akan melihat entri ini terdaftar di bawah dua bagian berbeda:

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

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

--save-dev digunakan untuk modul yang digunakan dalam pengembangan aplikasi, tidak perlu saat menjalankannya di lingkungan produksi --save digunakan untuk menambahkannya di package.json dan diperlukan untuk menjalankan aplikasi.

Contoh: express, body-parser, lodash, helm, mysql semua ini digunakan saat menjalankan penggunaan aplikasi - simpan untuk meletakkan dependensi sementara mocha, istanbul, chai, sonarqube-scanner semua digunakan selama pengembangan, jadi letakkan mereka di dev -dependensi.

tautan npm atau instal npm juga akan menginstal modul dev-dependency beserta modul dependensi di folder proyek Anda

Biswadev
sumber
3

Semua penjelasan di sini bagus, tetapi tidak memiliki hal yang sangat penting: Bagaimana Anda menginstal dependensi produksi saja? (tanpa ketergantungan pengembangan). Kami terpisah dependenciesdari devDependenciesdengan menggunakan --saveatau --save-dev. Untuk menginstal semua yang kami gunakan:

npm i

Untuk menginstal hanya paket produksi yang harus kita gunakan:

npm i --only=production
Ronny Sherer
sumber
0

Saya ingin menambahkan beberapa ide saya sebagai

Saya pikir semua perbedaan akan muncul ketika seseorang menggunakan kode Anda daripada menggunakan sendiri

Misalnya, Anda menulis perpustakaan HTTP yang disebut node's request

Di perpustakaan Anda,

Anda menggunakan lodash untuk menangani string dan objek, tanpa lodash, kode Anda tidak dapat berjalan

Jika seseorang menggunakan perpustakaan HTTP Anda sebagai bagian dari kode-kodenya. Kode Anda akan dikompilasi dengan miliknya.

kode Anda perlu lodash, Jadi Anda perlu dimasukkan dependencieske dalam kompilasi


Jika Anda menulis proyek seperti monaco-editor, yang merupakan editor web,

Anda memiliki bundel semua kode dan paket product env libraryweb Anda, saat build selesai, hanya memiliki amonaco-min.js

Jadi seseorang tidak mempermasalahkan apakah --saveatau --save-dependencieshanya dia yang membutuhkannyamonaco-min.js

Ringkasan:

  1. Jika seseorang ingin mengkompilasi kode Anda (gunakan sebagai pustaka), masukkan lodashyang digunakan oleh kode Andadependencies

  2. Jika seseorang ingin menambahkan lebih banyak fitur ke kode Anda, ia perlu unit testdan compiler, masukkan ke dalamnyadev-dependencies

toffee
sumber
0

Orang-orang menggunakan npm pada produksi untuk melakukan hal-hal keren yang jahat, Node.js adalah contohnya, jadi Anda tidak ingin semua alat dev Anda dijalankan.

Jika Anda menggunakan gulp (atau sejenisnya) untuk membuat file membangun untuk diletakkan di server Anda maka itu tidak masalah.

Tristanisginger
sumber