ฉันจะแทนที่เวอร์ชันการพึ่งพา NPM ที่ซ้อนกันได้อย่างไร?


290

ฉันต้องการใช้grunt-contrib-jasmineแพคเกจ NPM มันมีการพึ่งพาต่าง ๆ ส่วนหนึ่งของกราฟการพึ่งพาเป็นดังนี้:

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

น่าเสียดายที่มีข้อผิดพลาดในรุ่นนี้phantomjsซึ่งป้องกันไม่ให้ติดตั้งอย่างถูกต้องบน Mac OS X ได้รับการแก้ไขในเวอร์ชั่นล่าสุด

ฉันgrunt-lib-phantomjsจะใช้รุ่นที่ใหม่กว่าได้phantomjsอย่างไร

บริบทเพิ่มเติมบางส่วน:


เพียงgit cloneหรือแยกโมดูลที่จำเป็น นอกจากนี้คุณยังสามารถลบแบบซ้อนได้phantomjsด้วยตนเอง
Aleksei Zabrodskii

3
grunt-contrib-jasmineอยู่ใน 0.5.1 ซึ่งใช้grunt-lib-phantomjs@0.3.1ซึ่งใช้phantomjs@1.9.1-0:)
gustavohenke

คำตอบ:


238

คุณสามารถใช้ฟังก์ชันการลดขนาด npmเพื่อแทนที่การพึ่งพาใด ๆ หรือการพึ่งพาย่อย

ฉันเพิ่งทำสิ่งนี้ในโครงการที่น่ากลัวของพวกเรา เราต้องการเวอร์ชันที่ใหม่กว่าของการเชื่อมต่อตั้งแต่ 2.7.3 ทำให้เกิดปัญหากับเรา ดังนั้นฉันจึงสร้างไฟล์ชื่อ npm-shrinkwrap.json:

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

npm ควรรับโดยอัตโนมัติในขณะที่ทำการติดตั้งสำหรับโครงการ

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


7
เมื่อฉันทำสิ่งนี้grunt-contrib-connectจะติดตั้งเฉพาะการพึ่งพาและลูก ๆ การพึ่งพาอื่น ๆ ทั้งหมดของฉันใน package.json ไม่ได้รับการติดตั้ง
iDVB

5
ฉันมีปัญหาเช่นเดียวกับ @iDVB ฉันสิ้นสุดการแก้ไขnode_modulesไดเรกทอรีเพื่อให้การถ่ายโอนข้อมูลการอ้างอิงการหดตัวแบบเต็มเป็นสิ่งที่ฉันต้องการไม่ใช่แค่แทนที่ แต่ก็ยังเป็นวิธีการแก้ปัญหาที่เจ็บปวด
โบลด์

2
@Domi ไฟล์นี้สร้างโดยการเรียกใช้ npm shrinkwrap, รายการไม่ถูกเพิ่มด้วยมือ
glasspill

13
น่าเสียดายที่มีการกล่าวถึงในข้อผิดพลาดนั้นด้วย npm4 วิธีการแบบเรียบง่ายไม่สามารถใช้งานได้อีกต่อไป (เมื่อลบการnode_modulesเรียกใช้การติดตั้งโดยใช้ตัวย่อขนาดเล็กสุดดูเหมือนว่าจะdevDependenciesไม่เป็นอันตรายdependenciesแต่การเรียกใช้การติดตั้งอื่นจะลบรายการที่ไม่ชัดเจนออกไปดังนั้นตอนนี้การเรียกใช้npm shrinkwrapเพื่อรับไฟล์เต็มรูปแบบ จากนั้นเรียกใช้npm installอีกครั้ง)
Brett Zamir

6
NPM 6.4 จะเขียนทับไฟล์
shrinkwrap

85

สำหรับผู้ใช้ตั้งแต่ปี 2018 ขึ้นไปให้ใช้ npm เวอร์ชัน 5 หรือใหม่กว่า: แก้ไขของคุณpackage-lock.json: ลบไลบรารีออกจาก"requires"ส่วนและเพิ่มใน "การอ้างอิง"

ตัวอย่างเช่นคุณต้องการdeglobแพ็กเกจที่จะใช้globเวอร์ชันแพ็คเกจ3.2.11แทนแพ็กเกจปัจจุบัน คุณเปิดpackage-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"
  }
},

ลบออก"glob": "7.1.2",จาก"requires"เพิ่ม"dependencies"ด้วยรุ่นที่เหมาะสม:

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

ตอนนี้ลบnode_modulesโฟลเดอร์ของคุณเรียกใช้npm installแล้วมันจะเพิ่มส่วนที่ขาดหายไปใน"dependencies"ส่วน


4
นี่เป็นสิ่งที่ดีตราบใดที่npm installทำงานครั้งเดียว ในกรณีของฉันการแก้ไขมีความจำเป็นเนื่องจาก dep ที่ซ้อนกันทำให้เกิดความล้มเหลว
ppasler

60
สิ่งนี้จะถูกลบออกทุกครั้งที่คุณเรียกใช้npm iแทนที่จะแก้ไข package-lock.json ของคุณและเพิ่มการพึ่งพาของเด็กไปที่ "การพึ่งพา" ที่นั่นเพิ่มการพึ่งพาของเด็กไปยังส่วน "การอ้างอิง" package.json ของคุณ
trickpatty

6
ฉันได้สร้างห้องสมุดที่ทำสิ่งนั้นให้คุณโดยอัตโนมัติ: github.com/rogeriochaves/npm-force-resolutions
Rogerio Chaves

14
มันใช้งานได้ แต่ถ้าหากฉันทำงานnpm installอีกครั้งการเปลี่ยนแปลงทั้งหมดจะpackage-lock.jsonได้รับการคืนค่าและฉันได้รับเวอร์ชันที่ไม่ดีของ dep back
2rs2ts

14
ฉันเรียกใช้npm ciและสิ่งนี้ไม่ได้สัมผัสpackage-lock.json
sschoof

31

สำหรับผู้ที่ใช้ไหมพรม

ฉันลองใช้ npm shrinkwrap จนกระทั่งฉันค้นพบ cli ของเส้นด้ายไม่สนใจไฟล์ npm-shrinkwrap.json ของฉัน

Yarn มีhttps://yarnpkg.com/lang/en/docs/selective-version-resolutions/สำหรับสิ่งนี้ เรียบร้อย

ลองดูคำตอบนี้ด้วย: https://stackoverflow.com/a/41082766/3051080


0

ฉันมีปัญหาที่หนึ่งในการพึ่งพาที่ซ้อนกันมีช่องโหว่การตรวจสอบ npm แต่ฉันยังต้องการรักษาเวอร์ชันการพึ่งพาของผู้ปกครอง โซลูชันการลดขนาด npm ไม่ทำงานสำหรับฉันดังนั้นสิ่งที่ฉันทำเพื่อแทนที่เวอร์ชันการพึ่งพาที่ซ้อนกัน:

  1. ลบการอ้างอิงแบบซ้อนภายใต้ส่วน 'require' ใน package-lock.json
  2. เพิ่มการพึ่งพาที่อัปเดตภายใต้ DevDependencies ใน package.json เพื่อให้โมดูลที่ต้องการจะยังคงสามารถเข้าถึงได้
  3. npm i

-1

NPM shrinkwrapนำเสนอทางออกที่ดีสำหรับปัญหานี้ มันช่วยให้เราสามารถแทนที่รุ่นที่อ้างอิงเฉพาะของโมดูลย่อยที่เฉพาะเจาะจง

โดยพื้นฐานแล้วเมื่อคุณรันการติดตั้ง npm npm จะดูในไดเรกทอรีรากของคุณก่อนเพื่อดูว่ามีไฟล์ npm-shrinkwrap.json อยู่หรือไม่ ถ้าเป็นเช่นนั้นจะใช้สิ่งนี้ก่อนเพื่อตรวจสอบการขึ้นต่อกันของแพ็กเกจจากนั้นกลับสู่กระบวนการปกติของการทำงานผ่านไฟล์ package.json

ในการสร้าง npm-shrinkwrap.json สิ่งที่คุณต้องทำคือ

 npm shrinkwrap --dev

รหัส:

{
  "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
สิ่งนี้แตกต่างจากคำตอบที่ยอมรับในปัจจุบันหรือไม่? คำตอบนั้นมีความคิดเห็น upvoted สองข้อเสนอแนะว่าเวอร์ชันใหม่ของ npm ต้องการขั้นตอนแบบแมนนวลเพิ่มเติมหรือทำสิ่งที่ไม่พึงประสงค์ด้วยโซลูชันนี้ นั่นไม่ใช่กรณีหรือไม่
Fabio Beltramini

-1

ฉันพบวิธีแก้ปัญหาที่เหมาะกับฉัน

ดังนั้น. ก่อนอื่นแก้ไขไฟล์ npm-shrinkwrap.json ของคุณตามที่แนะนำโซลูชันอื่น ๆ ทั้งหมด

จากนั้น (บน Windows):

  • คลิกขวาที่ไฟล์ 'npm-shrinkwrap.json'
  • คุณสมบัติ
  • ภายใต้คุณสมบัติให้เลือก 'อ่านอย่างเดียว' สิ่งนี้จะป้องกัน npm เพื่อแก้ไขไฟล์ mpn-shrinkwrap.json

โซลูชันอื่น ๆ ที่นำเสนอนั้นดีพอถ้าคุณใช้งาน 'npm install' เพียงครั้งเดียว แต่หลังจากการติดตั้ง 'npm ครั้งแรก' ไฟล์ 'npm-shrinkwrap.json' จะได้รับการแก้ไขอีกครั้งเหมือนก่อนที่คุณจะทำการดัดแปลง


-1: สิ่งนี้จะทำให้คุณต้องปลดล็อกไฟล์อีกครั้งทุกครั้งที่คุณต้องการเปลี่ยนแปลง ในกรณีเหล่านั้นคุณจะหลวมการแก้ไขด้วยตนเองไปยังไฟล์ shrinkwrap อยู่ดี นอกจากนี้ทุกคนที่ทำงานร่วมกับโค้ดของคุณต้องเปิดใช้งานแฮ็คนี้ด้วย
thomaux
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.