Bagaimana cara mengganti versi ketergantungan NPM bersarang?

290

Saya ingin menggunakan grunt-contrib-jasminepaket NPM. Ini memiliki berbagai dependensi. Bagian dari grafik dependensi terlihat seperti ini:

─┬ grunt-contrib-jasmine@0.4.1
  ├─┬ grunt-lib-phantomjs@0.2.0
   ├─┬ phantomjs@1.8.2-2

Sayangnya, ada bug di versi ini phantomjsyang mencegahnya menginstal dengan benar di Mac OS X. Ini diperbaiki di versi terbaru.

Bagaimana saya bisa grunt-lib-phantomjsmenggunakan versi yang lebih baru phantomjs?

Beberapa konteks tambahan:

georgebrock
sumber
Hanya git cloneatau garpu modul yang diperlukan. Anda juga dapat menghapus sarang phantomjssecara manual.
Aleksei Zabrodskii
3
grunt-contrib-jasmineada di 0.5.1, yang menggunakan [email protected], yang menggunakan [email protected]:)
gustavohenke

Jawaban:

238

Anda dapat menggunakan fungsi npm shrinkwrap , untuk mengganti ketergantungan atau sub-ketergantungan.

Saya baru saja melakukan ini dalam proyek kasar kami. Kami membutuhkan versi koneksi yang lebih baru, sejak 2.7.3. menyebabkan masalah bagi kami. Jadi saya membuat file bernama npm-shrinkwrap.json:

{
  "dependencies": {
    "grunt-contrib-connect": {
      "version": "0.3.0",
      "from": "[email protected]",
      "dependencies": {
        "connect": {
          "version": "2.8.1",
          "from": "connect@~2.7.3"
        }
      }
    }
  }
}

NPM harus secara otomatis mengambilnya saat melakukan instalasi untuk proyek.

(Lihat: https://nodejs.org/en/blog/npm/managing-node-js-dependencies-with-shrinkwrap/ )

tuxpiper
sumber
7
Ketika saya melakukan ini, hanya grunt-contrib-connectketergantungan dan anak-anaknya yang diinstal. Semua dependensi saya yang lain di package.json tidak diinstal.
iDVB
5
Saya memiliki masalah yang sama dengan @ iDVB. Saya akhirnya mengedit node_modulesdirektori sehingga dump ketergantungan shrinkwrap penuh persis apa yang saya inginkan, bukan hanya menimpa. Tapi masih semacam solusi menyakitkan.
Kobold
2
@Domi file ini dibuat dengan menjalankan npm shrinkwrap, entri tidak ditambahkan dengan tangan
glasspill
13
Sayangnya, seperti yang disebutkan dalam bug itu, dengan npm4, pendekatan minimalis tidak lagi berfungsi. (Ketika menghapus node_modules, menjalankan instalasi dengan penyusutan minimal tampaknya devDependenciestetap utuh meskipun mengabaikan dependencies, tetapi menjalankan instalasi lain menghapus item-item non-eksplisit, jadi untuk saat ini penting untuk menjalankan npm shrinkwrapuntuk mendapatkan file lengkap, memodifikasi bagian yang dipertanyakan, dan lalu jalankan npm installlagi)
Brett Zamir
6
npm 6.4 hanya akan menimpa file shrinkwrap dan menggunakan dependensi yang sudah ketinggalan zaman
ShadSterling
83

Bagi mereka yang berasal dari 2018 dan seterusnya, gunakan npm versi 5 atau lebih baru: edit Anda package-lock.json: hapus perpustakaan dari "requires"bagian dan tambahkan di bawah "dependensi".

Sebagai contoh, Anda ingin deglobpaket menggunakan globversi paket 3.2.11daripada yang sekarang. Anda membuka package-lock.jsondan melihat:

"deglob": {
  "version": "2.1.0",
  "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.0.tgz",
  "integrity": "sha1-TUSr4W7zLHebSXK9FBqAMlApoUo=",
  "requires": {
    "find-root": "1.1.0",
    "glob": "7.1.2",
    "ignore": "3.3.5",
    "pkg-config": "1.1.1",
    "run-parallel": "1.1.6",
    "uniq": "1.0.1"
  }
},

Hapus "glob": "7.1.2",dari "requires", tambahkan "dependencies"dengan versi yang tepat:

"deglob": {
  "version": "2.1.0",
  "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.0.tgz",
  "integrity": "sha1-TUSr4W7zLHebSXK9FBqAMlApoUo=",
  "requires": {
    "find-root": "1.1.0",
    "ignore": "3.3.5",
    "pkg-config": "1.1.1",
    "run-parallel": "1.1.6",
    "uniq": "1.0.1"
  },
  "dependencies": {
    "glob": {
      "version": "3.2.11"
    }
  }
},

Sekarang hapus node_modulesfolder Anda , jalankan npm installdan itu akan menambah bagian yang hilang ke "dependencies"bagian tersebut.

izogfif
sumber
4
Ini bagus, asalkan npm installberjalan satu kali. Dalam kasus saya pengeditan diperlukan karena dep nested menyebabkan kegagalan.
ppasler
59
ini akan dihapus kapan saja Anda menjalankan npm ialih-alih mengedit package-lock.json Anda dan menambahkan dependensi anak ke "dependensi" di sana, tambahkan dependensi anak ke bagian package.json "dependensi" Anda
trickpatty
6
Saya telah membuat perpustakaan yang melakukan hal itu untuk Anda secara otomatis: github.com/rogeriochaves/npm-force-resolutions
Rogerio Chaves
14
Ini bekerja tetapi kemudian jika saya jalankan npm installlagi maka semua perubahan untuk package-lock.jsondikembalikan dan saya mendapatkan versi buruk dari dep kembali.
2rs2ts
14
Saya menjalankan npm cidan ini tidak menyentuhpackage-lock.json
sschoof
0

Saya memiliki masalah di mana salah satu dependensi bersarang memiliki kerentanan audit npm, tetapi saya masih ingin mempertahankan versi dependensi induk. solusi npm shrinkwrap tidak bekerja untuk saya, jadi apa yang saya lakukan untuk mengganti versi dependensi bersarang:

  1. Hapus dependensi bersarang di bawah bagian 'mengharuskan' di package-lock.json
  2. Tambahkan dependensi yang diperbarui di bawah DevDependencies di package.json, sehingga modul yang memerlukannya masih dapat mengaksesnya.
  3. npm saya
Ethan Yang
sumber
-1

NPM shrinkwrap menawarkan solusi yang bagus untuk masalah ini. Hal ini memungkinkan kita untuk mengganti versi ketergantungan tertentu dari sub-modul tertentu.

Pada dasarnya, ketika Anda menjalankan instalasi npm, npm pertama-tama akan mencari di direktori root Anda untuk melihat apakah ada file npm-shrinkwrap.json. Jika ya, ia akan menggunakan ini terlebih dahulu untuk menentukan dependensi paket, dan kemudian kembali ke proses normal bekerja melalui file package.json.

Untuk membuat npm-shrinkwrap.json, yang perlu Anda lakukan adalah

 npm shrinkwrap --dev

kode:

{
  "dependencies": {
    "grunt-contrib-connect": {
      "version": "0.3.0",
      "from": "[email protected]",
      "dependencies": {
        "connect": {
          "version": "2.8.1",
          "from": "connect@~2.7.3"
        }
      }
    }
  }
}
Murtaza Hussain
sumber
3
Apakah ini berbeda dari jawaban yang saat ini diterima? Jawaban itu memiliki dua komentar yang diperbarui yang menyarankan bahwa versi npm yang lebih baru membutuhkan langkah manual tambahan, atau melakukan hal-hal yang tidak diinginkan dengan solusi ini. Apakah bukan ini masalahnya?
Fabio Beltramini
-1

Saya menemukan solusi yang berhasil untuk saya.

Begitu. Pertama-tama edit file npm-shrinkwrap.json Anda seperti yang disarankan semua solusi lainnya.

Lalu, (pada Windows):

  • Klik kanan pada file 'npm-shrinkwrap.json'
  • Properti
  • Di bawah Atribut pilih 'Read-Only'. Ini akan mencegah npm untuk memodifikasi file mpn-shrinkwrap.json.

Solusi lain yang diusulkan cukup baik jika Anda hanya melakukan operasi 'npm install'. Tetapi setelah 'npm instal' file 'npm-shrinkwrap.json' pertama diubah lagi seperti sebelum modifikasi Anda.

Shlomo Sfez
sumber
-1: ini mengharuskan Anda membuka kunci file lagi setiap kali Anda ingin membuat perubahan. Dalam kasus tersebut, Anda akan kehilangan editan manual ke file shrinkwrap. Selain itu siapa pun yang berkolaborasi pada kode Anda perlu mengaktifkan peretasan ini juga.
thomaux