Untuk menyelaraskan dependensi di seluruh paket npm di Mac, pertama-tama bandingkan rentang versi di package.json setiap workspace, putuskan rentang versi umum mana yang cocok untuk setiap paket, lalu perbarui setiap workspace yang terpengaruh dan buat ulang lockfile root. npm workspaces dapat menargetkan paket dari root repositori, tetapi fitur ini tidak menyediakan perintah bawaan yang memindai setiap manifes dan secara otomatis membuat versi dependensi menjadi identik.

1. Periksa apakah repositori menggunakan npm workspaces

Di Terminal, buka direktori root repositori dan periksa konfigurasinya:

cd "/path/to/your/repository"
npm --version
npm pkg get workspaces

Root package.json harus mendefinisikan jalur workspace, dan setiap paket harus memiliki package.json sendiri. Fitur workspace milik npm menautkan paket-paket lokal tersebut selama instalasi dan memungkinkan perintah menargetkan satu atau beberapa workspace berdasarkan nama atau jalur. Jika npm pkg get workspaces tidak menghasilkan apa pun, konfirmasikan manajer paket dan tata letak repositori sebelum menggunakan perintah npm workspace. npm Workspaces

2. Bandingkan deklarasi dependensi

Cari dependensi yang ingin Anda selaraskan di manifes yang dilacak. Misalnya, di Terminal macOS Anda dapat menggunakan grep tanpa perlu menginstal alat tambahan:

grep -n '"typescript"' package.json packages/*/package.json

Ganti typescript dengan nama dependensi. Ini adalah pemeriksaan teks cepat, jadi tinjau bagian yang cocok di setiap manifes untuk melihat apakah paket tersebut berada di bawah dependencies, devDependencies, peerDependencies, atau optionalDependencies. Bidang-bidang tersebut menjelaskan peran yang berbeda; jangan memindahkan dependensi di antara bidang tersebut hanya untuk mencocokkan string versi. Untuk inventaris yang lebih lengkap, periksa setiap manifes workspace di editor Anda atau gunakan perintah daftar npm yang mendukung workspace:

npm ls typescript --workspaces --depth=0

Rentang manifes dan pohon yang terinstal menjawab pertanyaan yang berbeda: yang pertama menunjukkan apa yang diizinkan oleh setiap paket, sedangkan npm ls melaporkan status dependensi yang terinstal. Lockfile npm mencatat versi yang diselesaikan, tetapi tidak menggantikan rentang yang dapat diterima yang dideklarasikan di setiap package.json. npm ls package-lock.json and npm install

3. Pilih kebijakan versi yang kompatibel

Pilih versi yang memenuhi persyaratan konsumen dan kebijakan dukungan repositori. Rentang versi bersama berarti paket-paket tersebut menyatakan kumpulan yang diizinkan yang sama; ini tidak menjamin bahwa semua salinan bersarang (nested) atau transitif akan diselesaikan menjadi satu salinan terinstal. Periksa persyaratan peer dependency dan catatan rilis untuk perubahan yang merusak (breaking changes) sebelum memindahkan paket melintasi versi utama (major). Jika konsumen memerlukan rentang kompatibilitas yang lebih luas, menyelaraskan ke string yang persis sama mungkin tidak tepat; sebaiknya sepakati kebijakan rentang yang setara.

Misalnya, untuk menyetel alat pengembangan ke versi yang sama persis di dua workspace bernama web dan api, jalankan ini dari root:

npm install --save-dev --save-exact typescript@5.8.3 --workspace=web --workspace=api

Gunakan versi yang telah dipilih proyek Anda; 5.8.3 di sini hanyalah sebuah contoh. Perintah install milik npm menerima selektor workspace dan menyimpan paket tersebut ke setiap manifes paket yang dipilih. --save-exact menuliskan versi yang tepat alih-alih operator rentang npm yang biasa. Untuk dependensi runtime, gunakan kategori penyimpanan yang sesuai, seperti --save-prod, bukan --save-dev. npm install

Ulangi dengan selektor workspace tambahan atau jalankan perintah tersebut untuk setiap workspace. Jangan berasumsi bahwa instalasi tingkat root memperbarui setiap manifes paket: targetkan secara eksplisit paket yang deklarasinya harus diubah. Paket root juga dapat disertakan secara sengaja dengan --include-workspace-root jika paket tersebut memang harus mendeklarasikan dependensi yang sama.

4. Instal ulang, periksa perbedaan (diff), dan verifikasi

Setelah memperbarui deklarasi, jalankan penginstalan di root repositori agar npm merekonsiliasi hierarki workspace dan lockfile:

npm install
npm ls typescript --workspaces --depth=0
git diff -- package.json package-lock.json packages/*/package.json

Periksa apakah setiap manifes yang dituju memiliki deklarasi yang disepakati dan apakah perubahan lockfile sudah sesuai ekspektasi. Jalankan skrip build atau test yang relevan pada repositori; npm ls saja tidak memastikan bahwa kode berfungsi dengan versi yang dipilih. Lakukan commit pada package-lock.json root jika proyek melacaknya, sehingga penginstalan oleh tim dapat mereproduksi hierarki yang diselesaikan. Dokumentasi npm package-lock

Jika npm melaporkan dependensi yang tidak valid atau konflik peer, periksa paket yang disebutkan dalam kesalahan alih-alih memaksakan instalasi. Sebuah workspace mungkin memerlukan rentang kompatibel yang berbeda, atau dependensi lain mungkin memaksakan persyaratan peer yang memerlukan rencana peningkatan yang matang.

Kapan npm dedupe membantu

npm dedupe dapat menyederhanakan hierarki dependensi yang terinstal dengan memindahkan dependensi yang kompatibel ke posisi lebih tinggi sehingga paket dapat membaginya. Fitur ini tidak menulis ulang rentang dependensi langsung di package.json, sehingga tidak dapat menyelaraskan deklarasi secara otomatis. Gunakan ini hanya setelah memeriksa bahwa rentangnya kompatibel, lalu tinjau diff lockfile yang dihasilkan. npm dedupe

Penyelesaian yang andal adalah kebijakan terencana yang diekspresikan di setiap manifes workspace yang relevan, lockfile yang dibuat ulang, dan verifikasi terhadap paket-paket yang terpengaruh. Hal tersebut memberi pengelola catatan yang jelas tentang apa yang telah diselaraskan dan membiarkan batasan yang tidak kompatibel tetap terlihat untuk keputusan terpisah.

Sumber