Saya bertanya-tanya apakah kita harus melacak node_modules di repo kami atau melakukan instalasi npm ketika memeriksa kode?
git
node.js
version-control
npm
Tolga E
sumber
sumber
Jawaban:
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:
sumber
git checkout foo
. Jika node_modules tidak berada di bawah VCS - beralih cabanggit checkout foo ; npm install
dan apa pun versi NPM Anda saat ini harus bekerja;)Rincian modul disimpan
packages.json
, itu sudah cukup. Tidak perlu checkinnode_modules
.Orang biasa menyimpan
node_modules
dalam 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:
sumber
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 install
di 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.json
mereka. Anda dapat mengotomatiskan proses ini menggunakan shrinkpack .sumber
npm install --global shrinkpack
sendirinya memiliki kelemahan yang ditangguhkan, dengan meminta paket-paket lain untuk menginstal paket-paket yang menyusut? Ini bertentangan dengan Saran Addy.shrinkpack
diperlukan 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.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.
Paket yang diterbitkan tidak dapat dicabut dari npm registry dengan mudah lagi. Jadi Anda tidak perlu takut kehilangan ketergantungan yang diandalkan proyek Anda sebelumnya.
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.
sumber
Tidak melacak
node_modules
dengan kontrol sumber adalah pilihan yang tepat karena beberapa modul NodeJS, seperti driver MongoDB NodeJS, menggunakan pengaya NodeJS C ++. Pengaya ini dikompilasi saat menjalankannpm install
perintah. Jadi ketika Anda melacaknode_modules
direktori, Anda mungkin secara tidak sengaja melakukan file biner khusus OS.sumber
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:
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:
Anda menggunakan metode
function1(x)
paket itu.Sekarang para pengembang paket-studpid mengubah nama metode
function1(x)
menjadifunction2(x)
dan mereka membuat kesalahan ... Mereka mengubah versi paket mereka dari1.0.1
menjadi1.1.0
. Itu masalah karena ketika Anda meneleponnpm install
waktu berikutnya, Anda akan menerima versi1.1.0
karena 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
.gitignore
file dan tambahkan barisnode_modules
.sumber
npm install
Windows 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?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.Saya ingin menawarkan alternatif jalan tengah.
node_modules
ke git.package-lock.json
file untuk memakukan versi ketergantungan Anda.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.
sumber
Satu hal lagi yang perlu dipertimbangkan: memeriksa
node_modules
membuat lebih sulit / tidak mungkin untuk menggunakan perbedaan antaradependencies
dandevDependencies
.Namun di sisi lain, bisa dikatakan meyakinkan untuk mendorong produksi kode yang sama persis yang melalui tes - termasuk
devDependencies
.sumber
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.
sumber