Yuvalanmış NPM bağımlılık sürümlerini nasıl geçersiz kılabilirim?


290

grunt-contrib-jasmineNPM paketini kullanmak istiyorum . Çeşitli bağımlılıkları vardır. Bağımlılık grafiğinin bir kısmı şöyle görünür:

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

Ne yazık ki, bu sürümde phantomjsMac OS X'e doğru yüklenmesini engelleyen bir hata var . Bu en son sürümde düzeltildi.

Uygulamasının grunt-lib-phantomjsdaha yeni bir sürümünü nasıl kullanabilirim phantomjs?

Bazı ek bağlamlar:


Sadece git cloneveya çatal gerekli modül. İç içe yerleştirilenleri phantomjsmanuel olarak da kaldırabilirsiniz .
Aleksei Zabrodskii

3
grunt-contrib-jasminekullanımları 0.5.1 üzerindedir grunt-lib-phantomjs@0.3.1kullanır phantomjs@1.9.1-0:)
gustavohenke

Yanıtlar:


237

Herhangi bir bağımlılığı veya alt bağımlılığı geçersiz kılmak için npm shrinkwrap işlevini kullanabilirsiniz .

Bunu az önce yaptığımız bir projede yaptım. 2.7.3'ten beri daha yeni bir bağlantı sürümüne ihtiyacımız vardı. bizim için sorun çıkarıyordu. Bu yüzden npm-shrinkwrap.json adlı bir dosya oluşturdum:

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

Proje için kurulum yapılırken npm otomatik olarak almalıdır.

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


7
Bunu yaptığımda, sadece grunt-contrib-connectbağımlılık ve çocukları kurulur. Package.json içindeki diğer bağımlılıklarım yüklü değil.
iDVB

5
@İDVB ile aynı sorunu yaşadım. node_modulesDizini düzenlemeye başladım, böylece tam shrinkwrap bağımlılığı dökümü tam olarak istediğim şeydi, sadece geçersiz kılma değil. Ama yine de bir tür acı verici çözüm.
Kobold

2
@Domi bu dosya npm shrinkwrap çalıştırılarak oluşturulur, girişler elle eklenmez
glasspill

13
Ne yazık ki, bu hatada belirtildiği gibi, npm4 ile minimalist yaklaşım artık işe yaramıyor. (Silerken node_modules, bir küçültme işleminin minimal bir küçültme ile çalıştırılması, devDependenciesgörmezden gelinmesine rağmen sağlam kalıyor gibi görünüyor dependencies, ancak başka bir yüklemenin çalıştırılması müstehcen olmayan öğeleri kaldırıyor, bu yüzden şimdilik npm shrinkwraptam bir dosya almak, söz konusu bölümü değiştirmek ve sonra npm installtekrar çalıştırın )
Brett Zamir

6
npm 6.4 sadece shrinkwrap dosyasının üzerine yazacak ve eski bağımlılıkları kullanacaktır
ShadSterling

86

2018 ve sonrası için npm sürüm 5 veya daha yenisini kullanarak: düzenleyin package-lock.json: kütüphaneyi "requires"bölümden kaldırın ve "bağımlılıklar" altına ekleyin.

Örneğin, paketin geçerli sürümü yerine paket sürümünü deglobkullanmasını istiyorsunuz . Siz açın ve görün:glob3.2.11package-lock.json

"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"
  }
},

Kaldır "glob": "7.1.2",dan "requires"ekleyin "dependencies"uygun sürümü ile:

"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"
    }
  }
},

Şimdi node_modulesklasörünüzü kaldırın , çalıştırın npm installve "dependencies"bölüme eksik parçalar ekleyecektir .


4
npm installBir kez çalıştığı sürece bu güzel . Benim durumumda, iç içe dep başarısızlığa neden olduğu için düzenlemeler gereklidir.
ppasler

60
Bu çalıştırmak kaldırılan zaman olacak npm i"bağımlılıkları" bölümü paket-lock.json düzenleme ve senin package.json çocuk bağımlılığını orada add "bağımlılıkları" çocuk bağımlılığı eklemek yerine
trickpatty

6
Sizin için otomatik olarak tam olarak bunu yapan bir kütüphane oluşturdum: github.com/rogeriochaves/npm-force-resolutions
Rogerio Chaves

14
İşe yarıyor ama sonra npm installtekrar çalıştırırsam o zaman tüm değişiklikler package-lock.jsongeri alınır ve dep'in kötü sürümünü geri alırım.
2rs2ts

14
Ben çalıştırmak npm cive bu dokunmazpackage-lock.json
sschoof


0

Yuvalanmış bağımlılıklardan birinin npm denetim güvenlik açığı olduğu bir sorun yaşadım, ancak yine de üst bağımlılık sürümünü korumak istedim. npm shrinkwrap çözüm benim için çalışmadı, bu yüzden iç içe bağımlılık sürümünü geçersiz kılmak için ne yaptım:

  1. Package-lock.json içindeki 'gerektirir' bölümündeki iç içe bağımlılığı kaldırın
  2. Güncel bağımlılığı package.json içindeki DevDependencies altına ekleyin, böylece onu gerektiren modüller yine de erişebilsin.
  3. npm ben

-1

NPM shrinkwrap bu soruna güzel bir çözüm sunuyor. Belirli bir alt modülün belirli bir bağımlılığının bu sürümünü geçersiz kılmamızı sağlar.

Temel olarak, npm yüklemesini çalıştırdığınızda, npm önce bir npm-shrinkwrap.json dosyasının var olup olmadığını görmek için kök dizininize bakar. Eğer öyleyse, bunu önce paket bağımlılıklarını belirlemek ve daha sonra package.json dosyaları aracılığıyla normal çalışma sürecine geri dönmek için kullanır.

Bir npm-shrinkwrap.json oluşturmak için tek yapmanız gereken

 npm shrinkwrap --dev

kod:

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

3
Bu şu anda kabul edilen cevaptan farklı mı? Bu yanıtta, npm'in yeni sürümlerinin ek manuel adımlar gerektirdiğini veya bu çözümle istenmeyen şeyler yaptığını öne süren iki yorum bulunmaktadır. Durum böyle değil mi?
Fabio Beltramini

-1

Benim için işe yarayan bir çözüm buldum.

Yani. Öncelikle npm-shrinkwrap.json dosyanızı diğer tüm çözümlerin önerdiği şekilde düzenleyin.

Ardından, (Windows'ta):

  • 'Npm-shrinkwrap.json' dosyasına sağ tıklayın
  • Özellikleri
  • Özellikler'in altında 'Salt Okunur'u seçin. Bu, npm'nin mpn-shrinkwrap.json dosyasını değiştirmesini önler.

'Npm install' işlemini sadece bir kez yapıyorsanız önerilen diğer çözümler yeterince iyidir. Ancak ilk 'npm install' işleminden sonra 'npm-shrinkwrap.json' dosyası değişikliğinizden önceki gibi yeniden değiştirilir.


-1: bu, her değişiklik yapmak istediğinizde dosyanın kilidini yeniden açmanızı gerektirir. Bu durumlarda, yine de shrinkwrap dosyasına yapılan manuel düzenlemeleri kaybedersiniz. Ayrıca, kodunuz üzerinde işbirliği yapan herkesin de bu hack'i etkinleştirmesi gerekir.
thomaux
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.