Bagaimana Anda mencegah pemasangan modul "devDependencies" NPM untuk Node.js (package.json)?

588

Saya memilikinya di file package.json saya (versi singkat):

{
  "name": "a-module",
  "version": "0.0.1",
  "dependencies": {
    "coffee-script":      ">= 1.1.3"
  },
  "devDependencies": {
    "stylus":             ">= 0.17.0"
  }
}

Saya menggunakan NPM versi 1.1.1 di Mac 10.6.8.

Ketika saya menjalankan perintah berikut dari root proyek, itu menginstal dependencies dan devDependencies :

npm install

Saya mendapat kesan bahwa perintah ini menginstal devDependencies:

npm install --dev

Bagaimana saya membuatnya jadi npm installhanya menginstal dependencies(jadi lingkungan produksi hanya mendapatkan modul-modul), sementara sesuatu seperti npm install --devmenginstal keduanya dependenciesdan devDependencies?

Lance Pollard
sumber
1
Menurut dokter, Anda benar, --dev menginstal devdeps, jika tidak, hanya deps. npmjs.org/doc/json.html . Saya tahu ini berfungsi untuk paket bernama, setidaknya.
mna
1
jika Anda menemukan Pertanyaan ini pada tahun 2015, --save-dev switch melakukan persis seperti yang ditanyakan dalam Pertanyaan ini.
Anand
1
Jawaban ini stackoverflow.com/a/22004559/3718119 memberikan penjelasan yang bagus untuk perbedaan antara dependenciesdan devDependenciesdan ketika masing-masing digunakan.
quasoft

Jawaban:

844

The npm installperintah akan menginstal devDependenciesbersama lainnya dependenciesketika dijalankan di dalam direktori paket, dalam lingkungan pengembangan (default).

Gunakan npm install --only=prod(atau --only=production) untuk menginstal saja dependencies , dan tidak devDependencies,terlepas dari nilai NODE_ENVvariabel lingkungan.

Sumber: npm docs

Catatan: Sebelum v3.3.0 dari npm (2015-08-13), opsi dipanggil --production, yaitu npm install --production.

Rohan Singh
sumber
2
Alasan Agate mungkin untuk menghapus devDependencies sehingga konsumen yang menginstal paket Anda dengan npm install yourpackage.tgzjuga tidak mendapatkan devDependencies. Namun, itu sudah terjadi. Lihat jawaban Kevin Cox di bawah ini ( stackoverflow.com/a/15826602/825588 ).
Johann
5
npmjs.org/doc/cli/npm-install.html "Secara default, npm install akan menginstal semua modul yang terdaftar sebagai dependensi. Dengan flag --production, npm tidak akan menginstal modul yang terdaftar di devDependencies."
tomByrer
14
Ya Tuhan. Saya benar-benar memiliki NODE_ENV=productiondari hal lain yang saya lakukan dan tidak bisa mencari tahu mengapa saya npm installtidak menginstal dependensi. Terima kasih atas jawabannya.
aendrew
1
npm install --dev hanya akan menginstal dependensi dev
Rustem K
10
Untuk npm 3.3 dan selanjutnya: npm PERINGATAN instal Penggunaan --devopsi sudah usang. Gunakan --only=devsebagai gantinya.
srcspider
232

Saya mengalami masalah itu juga! npm install agak membingungkan dan posting web terus memunculkan flag -d / - dev seolah-olah ada mode instal 'development' yang eksplisit.

  • npm installakan menginstal " dependensi " dan " devDependensi "

  • npm install --productionhanya akan menginstal " dependensi "

  • npm install --devhanya akan menginstal " devDependencies "

smertrios
sumber
29
PERINGATAN: Jika NODE_ENVdiatur ke productiondan Anda menjalankannya npm installtidak akan menginstal dependensi dev. Saya mengalami masalah ini di Dockerfile saya.
Vaughan
1
@ Vughan Saya sudah mengalami ini juga, dapat diselesaikan dengan menjalankan npm --production=false install(meskipun tidak yakin apakah ini akan bekerja bersama bendera --dev)
Bavell
138

Opsi baru adalah:

npm install --only=prod

Jika Anda ingin menginstal hanya devDependencies:

npm install --only=dev
Cloxure
sumber
1
Ini menjawab kebalikan dari pertanyaan. OP bertanya bagaimana TIDAK untuk menginstal devDependencies.
musicin3d
2
Anda sebagian benar @ musicin3d, itu sebabnya pada bagian pertama saya menjawab cara menginstal depend hanya prod dan pada bagian kedua cara menginstal dependensi hanya dev, kalau-kalau.
Cloxure
5
Hai yang disana. Saya meninggalkan komentar itu sebelum @ user1614572 menambahkan bagian tentang --only=prod. Anda, Tuan, sebagian benar. ; P
musicin3d
dapatkah kita menyertakan ketergantungan terpisah untuk penyebaran?
Jeeva Jsb
1
Itu komentar, bukan jawaban. Saya tidak memeriksa semua komentar saya secara berkala. Saya belum pernah melihat orang-orang memperbarui komentar dari tahun lalu. Anda pada dasarnya datang ke sini untuk mengkritik bahwa saya menaruh satu tahun pada komentar saya. Saya tidak akan menanggapi lebih lanjut. Bersenang-senang memancing orang lain.
Jacques ジ ャ ッ ク
47

Jika Anda membaca POST ini pada tahun 2016, silakan mencapai apa yang Anda inginkan dengan menggunakan

--only={prod[uction]|dev[elopment]} 

argumen akan menyebabkan hanya devDependencies atau hanya non-devDependencies yang diinstal terlepas dari NODE_ENV.

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

wzr1337
sumber
Mengapa menggunakan huruf besar "POST"? docs.npmjs.com/cli/install dengan jelas mendokumentasikan KEDUA --productiondan --only={prod[uction]|dev[elopment]}.
Dan Dascalescu
33

Jika Anda telah menginstal semua dependensi Anda, dan Anda ingin menghindari harus mengunduh lagi paket produksi Anda dari NPM, Anda cukup mengetik:

npm prune --production

Ini akan menghapus dependensi dev Anda dari node_modulesfolder Anda , yang berguna jika Anda mencoba mengotomatiskan proses dua langkah seperti

  1. Webpack proyek saya, menggunakan dependensi dev
  2. Buat gambar Docker hanya menggunakan modul produksi

Berlari npm prunedi antara keduanya akan menyelamatkan Anda dari keharusan menginstal ulang semuanya!

piercebot
sumber
19

Saat menggunakan "npm install", modul-modul dimuat dan tersedia di seluruh aplikasi Anda terlepas dari apakah itu "dependensi devD" atau "dependensi". Jumlah ide ini: semua yang didefinisikan package.json Anda sebagai dependensi (tipe apa pun) diinstal ke node_modules.

Tujuan untuk perbedaan antara dependensi / devDependencies / optionalDependencies adalah apa yang dapat dilakukan oleh pelanggan dari kode Anda w / npm untuk menginstal sumber daya ini.

Per dokumentasi: https://npmjs.org/doc/json.html ...

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.

Dalam hal ini, yang terbaik adalah membuat daftar item tambahan ini dalam hash dependensi devD.

Hal-hal ini akan diinstal setiap kali flag konfigurasi --dev diatur. Bendera ini diatur secara otomatis ketika melakukan npm link atau ketika melakukan npm menginstal dari root paket, dan dapat dikelola seperti param konfigurasi npm lainnya. Lihat konfigurasi (1) untuk informasi lebih lanjut tentang topik ini.

Namun, untuk menyelesaikan pertanyaan ini, jika Anda HANYA ingin menginstal "dependensi" menggunakan npm, perintah berikut adalah:

npm install --production

Ini dapat dikonfirmasi dengan melihat komit Git yang menambahkan filter ini (bersama dengan beberapa filter lain [tercantum di bawah] untuk menyediakan fungsionalitas ini).

Filter alternatif yang dapat digunakan oleh npm:

--save          => updates dependencies entries in the {{{json}}} file
--force         => force fetching remote entries if they exist on disk 
--force-latest  => force latest version on conflict
--production    => do NOT install project devDependencies
--no-color      => do not print colors

@dmarr coba gunakan npm install --production

creatovisguru
sumber
16

npm akan menginstal dependensi dev ketika menginstal dari dalam suatu paket (jika ada package.jsondi direktori saat ini). Jika itu dari lokasi lain (npm registry, git repo, lokasi berbeda pada sistem file) itu hanya menginstal dependensi.

Kevin Cox
sumber
Bisakah Anda memformulasikan ulang? Saya pikir Anda membuat kesalahan dalam tanda kurung Anda, saya pikir Anda lupa untuk menutupnya lebih awal dan frasa Anda tidak masuk akal bagi saya (penutur asli bahasa Inggris). Komentar Johann di bawah jawaban Rohan Singh menunjuk saya untuk melihat jawaban Anda (karena keraguan saya persis sama dengan keraguan batu akik), dan tidak berhasil. Saya masih belum mengerti bagaimana npm install some-moduletidak akan menginstal dependensi dev some-module.
Rafael Eyng
Terima kasih sudah diperbaiki. Namun saya tidak mengerti sisa pertanyaan Anda.
Kevin Cox
3

Saya telah menemukan bahwa, ketika mencoba untuk menginstal dependensi dev untuk paket yang berisi addon node, Anda tidak dapat menghindari membangun addon ketika menjalankan npm install --dev bahkan jika Anda hanya ingin menginstal devDependencies. Jadi, saya harus berkeliling npm:

node -e 'console.log( Object.keys( require( "./package.json" ).devDependencies ) );' | \
sed  -e "s/^[^']*'//" -e "s/'.*$//" | \
xargs npm install

Atau, lebih baik (dan lebih ringkas),

node -e 'Object.keys( require( "./package.json" ).devDependencies )
.map( function( item ){ console.log( item ) } );' | xargs npm install
Gabriel Schulhof
sumber
3

Gunakan npm install packageName --saveini akan menambah paket dalam dependensi , jika Anda menggunakannya npm install packageName --save-devmaka devDependencies .

npm install packageName --save-devharus digunakan untuk menambahkan paket untuk tujuan pengembangan. Seperti menambahkan paket TDD (Chai, mocha, dll). Yang digunakan dalam pengembangan dan bukan dalam produksi.

Sandip Nirmal
sumber
OP tidak memiliki masalah dalam menyimpan dependensi, package.jsontetapi begitu dependensi ini sudah disimpan , maka bagaimana cara memaksa npmuntuk menginstal hanya satu tipe dependensi tertentu. Ketika saya membaca jawaban Anda di sini, saya tidak belajar apa pun yang membantu menyelesaikan masalah yang ditimbulkan oleh OP.
Louis
3

Perlu disebutkan bahwa Anda dapat menggunakan NODE_ENVvariabel lingkungan untuk mencapai hasil yang sama. Sangat berguna jika Anda menyimpan aplikasi Node Anda (misalnya Docker).

NODE_ENV=production npm install

Kode di atas akan menginstal semua dependensi Anda kecuali yang dev (yaitu devDependencies).

jika Anda perlu menggunakan variabel lingkungan di Dockerfileinformasi lebih lanjut Anda dapat ditemukan di sini .

Variabel lingkungan mudah ditimpa kapan pun diperlukan (misalnya jika Anda ingin menjalankan test suite Anda, katakan pada Travis CI). Jika itu masalahnya Anda dapat melakukan sesuatu seperti ini:

docker run -v $(pwd):/usr/src/app --rm -it -e NODE_ENV=production node:8 npm install

Dokumentasi NPM di sini

produksi

  • Default: false
  • Ketik: Boolean Setel ke true untuk dijalankan dalam mode "produksi".

    1. devDependencies tidak diinstal pada level teratas ketika menjalankan instalasi npm lokal tanpa argumen.
    2. Setel NODE_ENV = "produksi" untuk skrip siklus hidup.

Selamat kontainerisasi =)

Francesco Casula
sumber
3

Saya sarankan untuk digunakan npm ci. Jika Anda ingin menginstal hanya paket yang dibutuhkan produksi (seperti yang Anda tulis - tanpa devDependencies), maka:

npm ci --only=production

atau

NODE_ENV=production npm ci

Jika Anda lebih suka oldschool npm installmaka:

npm install --production

atau

NODE_ENV=production npm install

Inilah jawaban yang bagus mengapa Anda harus menggunakannya npm ci.

marverix
sumber
Keren, itu bekerja dengan npm cibaik, bukan hanya npm install!
Klesun
2

Perlu ditambahkan ke jawaban yang dipilih: Sampai sekarang, npm installdalam direktori paket (mengandung package.json) akan menginstal devDependencies, sedangkan npm install -gtidak akan menginstalnya.

ack
sumber
7
Ya, -gtidak akan menginstal devDependencies, tetapi menginstal paket secara global, yang seringkali bukan hasil yang diinginkan.
Bardi Harborow
0

npm install --productionadalah cara yang tepat untuk memasang modul simpul yang diperlukan untuk produksi. Periksa dokumentasi untuk lebih jelasnya

Rubin bhandari
sumber
-1

Sekarang ada masalah, jika Anda memiliki package-lock.json dengan npm 5+. Anda harus menghapusnya sebelum menggunakan npm install --production.

Erich Stark
sumber
-1
npm install --dev will install dev dependencies

Dan, sesuai pertanyaan untuk menginstal dependensi saja, perintah berikut akan membantu

npm install --prod will install dependencies
karthiks416
sumber