Haruskah folder “node_modules” dimasukkan dalam repositori git

Jawaban:

177

Jawabannya tidak semudah yang disarankan Alberto Zaccagni. Jika Anda mengembangkan aplikasi (terutama aplikasi perusahaan), termasuk node_modules di repo git Anda adalah pilihan yang layak dan alternatif mana yang Anda pilih tergantung pada proyek Anda.

Karena dia berdebat dengan sangat baik terhadap node_modules, saya akan berkonsentrasi pada argumen untuk mereka.

Bayangkan Anda baru saja menyelesaikan aplikasi perusahaan dan Anda harus mendukungnya selama 3-5 tahun. Anda pasti tidak ingin bergantung pada modul npm seseorang yang besok bisa hilang dan Anda tidak dapat memperbarui aplikasi lagi.

Atau Anda memiliki modul pribadi yang tidak dapat diakses dari internet dan Anda tidak dapat membuat aplikasi di Internet. Atau mungkin Anda tidak ingin bergantung pada build akhir Anda pada layanan npm karena beberapa alasan.

Anda dapat menemukan pro dan kontra dalam artikel Addy Osmani ini (walaupun ini tentang Bower, situasinya hampir sama). Dan saya akan mengakhiri dengan kutipan dari beranda Bower dan artikel Addy:

"Jika Anda tidak membuat paket yang dimaksudkan untuk dikonsumsi oleh orang lain (misalnya, Anda sedang membangun aplikasi web), Anda harus selalu memeriksa paket yang diinstal ke dalam kontrol sumber."

ivoszz
sumber
6
Saya setuju dengan ini sepenuhnya. Saya tidak ingin sistem build perusahaan kami memerlukan koneksi Internet untuk membuat build yang sukses karena itu perlu mengunduh dependensi, yang diharapkan masih ada. Terima kasih.
deadlydog
9
@Alberto Zaccagni Saya yakin Anda benar pertama kali. Jika Anda benar-benar membangun aplikasi perusahaan, maka Anda harus menggunakan alat perusahaan. Artifactory dan npm-artifactory harus digunakan untuk melindungi proyek yang menghilang dari internet. Bahkan pada proyek kecil ini lebih bersih daripada memeriksa beberapa salinan dari hal yang sama ke kontrol sumber.
Ted Bigham
10
Setelah masalah pad kiri , saya pikir itu bukan ide yang buruk untuk melacak node_modules.
Léo Lam
6
Aspek penting noone disebutkan. Jika node_modules Anda berada di bawah VCS - beralih cabang saja git checkout foo. Jika node_modules tidak berada di bawah VCS - beralih cabang git checkout foo ; npm installdan apa pun versi NPM Anda saat ini harus bekerja;)
Ivan Kleshnin
7
Solusi perusahaan terbersih adalah meng-host repositori npm internal yang dapat diakses intranet yang memiliki semua versi modul yang Anda gunakan, dan jangan periksa di node_modules dengan kode sumber. Sistem build Anda akan merujuk repositori simpul internal Anda.
user2867288
104

Rincian modul disimpan packages.json, itu sudah cukup. Tidak perlu checkin node_modules.

Orang biasa menyimpan node_modulesdalam kontrol versi untuk mengunci dependensi modul, tetapi dengan npm shrinkwrap itu tidak diperlukan lagi.

Pembenaran lain untuk hal ini, seperti yang ditulis @ChrisCM dalam komentar:

Juga perlu dicatat, modul apa pun yang melibatkan ekstensi asli tidak akan berfungsi arsitektur untuk arsitektur, dan perlu dibangun kembali. Memberikan justifikasi konkret untuk TIDAK memasukkannya dalam repo.

Alberto Zaccagni
sumber
10
Sederhana, dan to the point +1. Juga perlu dicatat, modul apa pun yang melibatkan ekstensi asli tidak akan berfungsi arsitektur untuk arsitektur, dan perlu dibangun kembali. Memberikan justifikasi konkret untuk TIDAK memasukkannya dalam repo.
ChrisCM
3
Tidak juga, ini adalah pembenaran untuk menggunakan lingkungan dev yang dapat direproduksi menggunakan misalnya gelandangan. Seharusnya hanya perlu bekerja pada satu arsitektur.
Robin Smith
20

Saya akan merekomendasikan untuk tidak mengecek node_modules karena paket-paket seperti PhantomJS dan node-sass misalnya, yang menginstal biner yang sesuai untuk sistem saat ini.

Ini berarti bahwa jika satu Dev berjalan npm installdi Linux dan memeriksa di node_modules - itu tidak akan bekerja untuk Dev lain yang mengkloning repo di Windows.

Lebih baik untuk memeriksa di tarbal mana npm menginstal unduhan dan menunjuk npm-shrinkwrap.jsonmereka. Anda dapat mengotomatiskan proses ini menggunakan shrinkpack .

Jamie Mason
sumber
Tetapi bukankah dengan npm install --global shrinkpacksendirinya memiliki kelemahan yang ditangguhkan, dengan meminta paket-paket lain untuk menginstal paket-paket yang menyusut? Ini bertentangan dengan Saran Addy.
danjah
bisakah Anda mengulangi pertanyaannya, tolong @ danjah? Saya tidak sepenuhnya mengerti Anda, maaf.
Jamie Mason
Dari apa yang Anda jelaskan, ketergantungan shrinkpackdiperlukan untuk kemudian menginstal dependensi build secara andal. Oleh karena itu, pemasangan alat bangun sendiri menjadi kelemahan argumen terhadap pengiriman semua dependensi pembangunan ke kontrol versi.
danjah
1
Saya pikir memeriksa dalam file kunci sudah cukup (package-lock.json; yarn.lock) setidaknya menurut TFM: docs.npmjs.com/files/package-lock.json
aimass
1
Anda akan mendapatkan grafik dependensi yang dapat diprediksi saat menggunakan lockfile, dan tidak rentan terhadap masalah yang dibahas di sekitar PhantomJS dan node-sass dll pada platform yang berbeda. Anda akan memerlukan koneksi internet dan untuk registri tetap up tentu saja.
Jamie Mason
7

Topik ini cukup tua, saya mengerti. Tapi saya kehilangan beberapa pembaruan untuk argumen yang disediakan di sini karena perubahan situasi di sistem eco npm.

Saya selalu menyarankan untuk tidak menempatkan node_modules di bawah kontrol versi. Hampir semua manfaat dari melakukan hal itu sebagaimana tercantum dalam konteks jawaban yang diterima sudah ketinggalan zaman seperti yang sekarang.

  1. Paket yang diterbitkan tidak dapat dicabut dari npm registry dengan mudah lagi. Jadi Anda tidak perlu takut kehilangan ketergantungan yang diandalkan proyek Anda sebelumnya.

  2. Menempatkan file package-json.lock di VCS membantu dengan dependensi yang sering diperbarui mungkin menghasilkan pengaturan berbeda meskipun mengandalkan file package.json yang sama.

Jadi, menempatkan node_modules ke dalam VCS jika memiliki alat membangun offline mungkin dianggap sebagai satu-satunya kasus penggunaan yang memenuhi syarat yang tersisa. Namun, node_modules biasanya tumbuh cukup cepat. Pembaruan apa pun akan mengubah banyak file. Dan ini mempengaruhi repositori dengan berbagai cara. Jika Anda benar-benar mempertimbangkan dampak jangka panjang yang mungkin menjadi penghambat juga.

VCS terpusat seperti svn memerlukan transfer yang dilakukan dan memeriksa file melalui jaringan yang akan sangat lambat ketika datang untuk memeriksa atau memperbarui folder node_modules.

Ketika datang ke git jumlah file tambahan yang tinggi ini akan langsung mencemari repositori. Ingatlah bahwa git tidak melacak perbedaan antara versi file apa pun, tetapi menyimpan salinan dari kedua versi file segera setelah satu karakter berubah. Setiap pembaruan untuk setiap ketergantungan akan menghasilkan perubahan besar lainnya. Repositori git Anda akan dengan cepat bertambah besar karena ini memengaruhi cadangan dan sinkronisasi jarak jauh. Jika Anda memutuskan untuk menghapus node_modules dari repositori git nanti itu masih menjadi bagian dari alasan historis. Jika Anda telah mendistribusikan repositori git Anda ke beberapa server jarak jauh (misalnya untuk cadangan) membersihkannya adalah tugas yang menyakitkan dan rawan kesalahan yang akan Anda hadapi.

Jadi, jika Anda peduli untuk proses yang efisien dan ingin menjaga hal-hal "kecil" Saya lebih suka menggunakan repositori artefak yang terpisah seperti Nexos Repository (atau hanya beberapa server HTTP dengan arsip ZIP) yang menyediakan beberapa set dependensi yang sebelumnya diambil untuk diunduh.

Thomas Urban
sumber
6

Tidak melacak node_modulesdengan kontrol sumber adalah pilihan yang tepat karena beberapa modul NodeJS, seperti driver MongoDB NodeJS, menggunakan pengaya NodeJS C ++. Pengaya ini dikompilasi saat menjalankan npm installperintah. Jadi ketika Anda melacak node_modulesdirektori, Anda mungkin secara tidak sengaja melakukan file biner khusus OS.

MZ
sumber
3

Saya setuju dengan ivoszz bahwa terkadang berguna untuk memeriksa folder node_modules, tetapi ...


skenario 1:

Satu skenario: Anda menggunakan paket yang dihapus dari npm. Jika Anda memiliki semua modul di folder node_modules, maka itu tidak akan menjadi masalah bagi Anda. Jika Anda hanya memiliki nama paket di package.json, Anda tidak bisa mendapatkannya lagi. Jika suatu paket kurang dari 24 jam, Anda dapat dengan mudah menghapusnya dari npm. Jika lebih dari 24 jam, maka Anda perlu menghubungi mereka. Tapi:

Jika Anda menghubungi dukungan, mereka akan memeriksa untuk melihat apakah menghapus versi paket Anda akan merusak instalasi lain. Jika demikian, kami tidak akan menghapusnya.

Baca lebih lajut

Jadi peluang untuk ini rendah, tetapi ada skenario 2 ...


skenario 2:

Skenario lain di mana ini terjadi: Anda mengembangkan versi perusahaan dari perangkat lunak Anda atau perangkat lunak yang sangat penting dan menulis di paket Anda. Json:

"dependencies": {
    "studpid-package": "~1.0.1"
}

Anda menggunakan metode function1(x)paket itu.

Sekarang para pengembang paket-studpid mengubah nama metode function1(x)menjadi function2(x)dan mereka membuat kesalahan ... Mereka mengubah versi paket mereka dari 1.0.1menjadi 1.1.0. Itu masalah karena ketika Anda menelepon npm installwaktu berikutnya, Anda akan menerima versi 1.1.0karena Anda menggunakan tilde ( "studpid-package": "~1.0.1").

Panggilan function1(x)dapat menyebabkan kesalahan dan masalah sekarang.


Tapi:

Mendorong seluruh folder node_modules (seringkali lebih dari 100 MB) ke repositori Anda, akan menghabiskan ruang memori Anda. Beberapa kb (hanya package.json) dibandingkan dengan ratusan MB (package.json & node_modules) ... Pikirkanlah.

Anda dapat melakukannya / harus memikirkannya jika:

  • perangkat lunaknya sangat penting.

  • Anda dikenakan biaya ketika ada sesuatu yang gagal.

  • Anda tidak mempercayai registri npm. NPM terpusat dan secara teoritis dapat ditutup.

Anda tidak perlu menerbitkan folder node_modules di 99,9% dari kasus jika:

  • Anda mengembangkan perangkat lunak hanya untuk diri Anda sendiri.

  • Anda telah memprogram sesuatu dan hanya ingin mempublikasikan hasilnya di GitHub karena orang lain mungkin tertarik.


Jika Anda tidak ingin node_modules berada di repositori Anda, cukup buat .gitignorefile dan tambahkan baris node_modules.

ndsvw
sumber
1
Satu lagi kerugian dari "mempublikasikan folder node_modules" bisa menjadi: Memanggil npm installWindows dan MacOS dapat menghasilkan file yang berbeda (file tergantung OS) dalam beberapa paket. Tapi saya tidak yakin tentang itu. Dapatkah seseorang memverifikasi bahwa ini benar?
ndsvw
2
"skenario 2": itu sebabnya Anda berkomitmen package-lock.json. Jika ada masalah di masa depan dengan pembaruan paket-studpid, Anda dapat memutar kembali file kunci untuk mencari tahu versi yang tepat yang cocok untuk Anda.
ToolmakerSteve
2

Saya ingin menawarkan alternatif jalan tengah.

  1. Jangan tambahkan node_moduleske git.
  2. Gunakan package-lock.jsonfile untuk memakukan versi ketergantungan Anda.
  3. Dalam CI Anda atau proses rilis, ketika Anda merilis versi, buat salinan dari folder node_modules dan buat cadangannya (misalnya dalam penyimpanan cloud).

Jika Anda tidak dapat mengakses NPM (atau pendaftar lain yang Anda gunakan) atau paket tertentu di NPM, Anda memiliki salinan node_modules dan dapat terus bekerja hingga Anda memulihkan akses.

Martin Capodici
sumber
0

Satu hal lagi yang perlu dipertimbangkan: memeriksa node_modulesmembuat lebih sulit / tidak mungkin untuk menggunakan perbedaan antara dependenciesdan devDependencies.

Namun di sisi lain, bisa dikatakan meyakinkan untuk mendorong produksi kode yang sama persis yang melalui tes - termasuk devDependencies.

Jan Żankowski
sumber
"untuk membuat kode yang sama persis dengan yang menjalani tes": Itulah yang Anda inginkan dari Docker. Atau manajer paket os, seperti rpm. Anda tidak membangun kembali kode antara tes dan prod, kan? devDependencies membantu membangun kode akhir, tetapi tidak memiliki tempat dalam penyebaran, baik dalam pengujian maupun produksi.
Per Wiklander
Apakah akan membantu jika devDependencies berada di package.json satu direktori mereka lebih tinggi daripada direktori "src"? Karena modul node dicari untuk memulai di direktori saat ini dan kemudian naik, Anda harus tetap menggunakan dependensi dev Anda dan memisahkan modul dev / src.
Alex
0

node_modules tidak perlu di-check-in jika dependensi disebutkan dalam package.json. Programmer lain mana saja bisa mendapatkannya dengan melakukan npm install dan npm cukup pintar untuk membuat node_modules di direktori kerja Anda untuk proyek tersebut.

Himanshu
sumber