package-lock.json มีบทบาทอย่างไร?


291

npm @ 5 ได้รับการเผยแพร่มีไฟล์package package-lock.jsonใหม่ (หลังจากnpm install) ซึ่งทำให้ฉันสับสน ฉันอยากรู้ว่าไฟล์นี้มีผลกระทบอย่างไร?

คำตอบ:


291

มันเก็บแผนผังการพึ่งพาที่แน่นอนและเป็นเวอร์ชันแทนที่จะใช้การกำหนดเวอร์ชันที่ติดดาวเช่น package.json เอง (เช่น 1.0. *) ซึ่งหมายความว่าคุณสามารถรับประกันการขึ้นต่อกันของนักพัฒนาซอฟต์แวร์หรือ prod release อื่น ๆ นอกจากนี้ยังมีกลไกในการล็อคทรี แต่โดยทั่วไปจะสร้างใหม่หากการเปลี่ยนแปลง package.json

จากเอกสาร npm :

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

ไฟล์นี้มีวัตถุประสงค์เพื่อส่งไปยังที่เก็บข้อมูลต้นทางและให้บริการตามวัตถุประสงค์ต่างๆ:

อธิบายการเป็นตัวแทนของแผนภูมิการพึ่งพาเดียวว่าเพื่อนร่วมทีมการปรับใช้และการรวมอย่างต่อเนื่องรับประกันว่าจะติดตั้งการพึ่งพาเดียวกัน

จัดเตรียมสิ่งอำนวยความสะดวกสำหรับผู้ใช้เพื่อ "time-travel" ไปยังสถานะก่อนหน้าของ node_modules โดยไม่ต้องคอมมิตไดเร็กทอรีเอง

เพื่ออำนวยความสะดวกในการมองเห็นการเปลี่ยนแปลงต้นไม้ผ่านการควบคุมแหล่งที่มาที่แตกต่าง

และปรับกระบวนการติดตั้งให้เหมาะสมโดยการอนุญาตให้ npm ข้ามการแก้ปัญหาเมทาดาทาซ้ำสำหรับแพ็คเกจที่ติดตั้งไว้ก่อนหน้านี้ "

แก้ไข

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

แม้ว่าคุณจะล็อคเวอร์ชันของการพึ่งพาโดยตรงของคุณคุณไม่สามารถรับประกันได้ 100% ว่าทรีการพึ่งพาทั้งหมดของคุณจะเหมือนกันทุกครั้ง ประการที่สองคุณอาจต้องการอนุญาตให้มีการเปลี่ยนแปลงที่ไม่ทำลาย (อิงกับ semantic versioning) ของการพึ่งพาโดยตรงของคุณซึ่งจะช่วยให้คุณควบคุมการพึ่งพาที่ซ้อนกันน้อยลงและคุณไม่สามารถรับประกันได้ว่าการพึ่งพาโดยตรงของคุณจะไม่ ตัวเอง

วิธีการแก้ปัญหาทั้งหมดนี้คือไฟล์ล็อคซึ่งอธิบายไว้ข้างต้นล็อคในรุ่นของต้นไม้พึ่งพาเต็ม สิ่งนี้ช่วยให้คุณสามารถรับประกันแผนผังการพึ่งพาสำหรับนักพัฒนาซอฟต์แวร์รายอื่นหรือรุ่นที่ออกใหม่ในขณะที่ยังคงสามารถทดสอบเวอร์ชันอ้างอิงใหม่ (โดยตรงหรือโดยอ้อม) โดยใช้แพ็คเกจมาตรฐานของคุณ

NB ตัวตัดคำสั่งการย่อขนาด json ก่อนหน้านี้ทำในสิ่งเดียวกัน แต่ไฟล์ล็อคเปลี่ยนชื่อเพื่อให้ฟังก์ชั่นนั้นชัดเจนยิ่งขึ้น หากมีไฟล์หดตัวห่ออยู่ในโครงการแล้วจะใช้ไฟล์นี้แทนไฟล์ล็อกใด ๆ


78
หากมีการอ้างอิงรุ่นที่แน่นอนดังนั้นจึงไม่บังคับใช้การระบุรุ่นที่แน่นอนใน package.json และลืมไฟล์ package-lock.json
jrahhali

15
@jrahhali - ได้แก้ไขคำตอบของฉันตามคำถามของคุณ
Matt

1
แผนผังการพึ่งพานี้จาก pacakge.json.lock นำไปใช้กับนักพัฒนาอื่นได้อย่างไร โดยอัตโนมัติ?
stevek

40
โปรดทราบว่าคำตอบนี้ไม่ถูกต้องอีกต่อไป ! package-lock.jsonไฟล์มีการปรับปรุงทุกครั้งที่คุณโทร NPM ติดตั้งตั้งแต่ NPM 5.1 (เปลี่ยนเป็นgithub.com/npm/npm/issues/16866ตัวอย่างในgithub.com/npm/npm/issues/17979 ) ดังนั้นจึงไม่สามารถใช้ในการตั้งค่ารุ่นเดียวกันสำหรับนักพัฒนาทั้งหมดได้อีกต่อไปเว้นแต่คุณจะระบุรุ่นที่แน่นอน ชอบ1.2.3แทนที่จะเป็น1.2.*ในpackage.jsonไฟล์ของคุณ
คริสเตียน

5
คุณควรเพิ่มการอ้างอิงถึงnpm ciตามที่npm installจะอัพเดต package-lock.json ในขณะที่ ci ใช้เนื้อหา เท่านั้นที่มีnpm ciคุณจะได้รับการทำซ้ำที่แข็งแกร่งสร้าง
k0pernikus

34

มันเป็นเรื่องการปรับปรุงที่สำคัญมากสำหรับ NPM: รับประกันรุ่นเดียวกันแน่นอนของทุกแพคเกจ

วิธีการทำให้แน่ใจว่าโครงการของคุณสร้างขึ้นด้วยแพ็คเกจเดียวกันในสภาพแวดล้อมที่แตกต่างกันในเวลาที่แตกต่างกันอย่างไร สมมติว่าคุณสามารถใช้^1.2.3ในpackage.jsonหรือบางส่วนของการอ้างอิงของคุณกำลังใช้วิธีการที่ แต่คุณจะมั่นใจได้อย่างไรในแต่ละครั้งnpm installจะรับรุ่นเดียวกันในเครื่อง dev ของคุณและในการสร้างเซิร์ฟเวอร์? package-lock.jsonจะทำให้มั่นใจได้ว่า

npm installจะสร้างไฟล์ล็อคอีกครั้งเมื่อสร้างเซิร์ฟเวอร์หรือเซิร์ฟเวอร์การปรับใช้ทำnpm ci(ซึ่งจะอ่านจากไฟล์ล็อคและติดตั้งทรีแพคเกจทั้งหมด)


9
โปรดทราบว่านี่เป็นสิ่งที่ล้าสมัยแล้วในตอนนี้ ใน 5.1.0 เป็นต้นไป "การติดตั้ง npm" จะไม่อ่านจากpackage-lock.jsonไฟล์เลย มันเพิ่งติดตั้งจากที่package.jsonเคยเป็น ที่จะทำให้การใช้งานของpackage-lock.jsonไฟล์ที่คุณต้องใช้คำสั่ง "NPM CI" ใหม่ซึ่งจะติดตั้งรุ่นที่แน่นอนระบุไว้ในแทนรุ่นที่กำหนดในช่วงpackage-lock.json package.json
Venryx

5
ฉันกลัว Venryx ไม่ถูกต้อง npm install ไม่package-lock.jsonอ่านจาก หากต้องการทำซ้ำให้ทำดังต่อไปนี้ ใช้ package.json นี้รันnpm install{... "devDependencies": {"sinon": "7.2.2"}} ตอนนี้คัดลอก / วางpackage.jsonและpackage-lock.jsonไปยังไดเรกทอรีใหม่ เปลี่ยนpackage.jsonเป็น: "Sinon": "^ 7.2.2" npm installทำงาน npm อ่านจาก package-lock.json และติดตั้ง 7.2.2 แทน 7.3.0 หากไม่มี package-lock.json จะมีการติดตั้ง 7.3.0
zumafra

2
และไม่เพียงแค่นั้น แต่ถ้าคุณต้องการที่จะทำบางสิ่งบางอย่างเช่นการเพิ่มเครื่องหมายรูปหมวก ^ จะpackage-lock.jsonเป็นวิธีเดียวที่เหมาะสมที่จะทำคือการลบและการงอกใหม่ได้โดยใช้package-lock.json npm install(คุณไม่ต้องการแก้ไขด้วยตนเองpackage-lock.json) การเปลี่ยนค่าของคุณสมบัติ "รุ่น" (ใกล้ด้านบน) ของpackage.jsonจะเปลี่ยนเดียวกันในpackage-lock.jsonบนแต่การเพิ่มเครื่องหมายการพึ่งพาจะไม่ทำแบบเดียวกันกับnpm install package-lock.json
zumafra

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

2
@zumafra ไฟล์แพคเกจ lock.json จะใช้เมื่อทำnpm ci, npm installก็จะใช้ package.json แม้ว่าล็อคไฟล์ที่มีให้
ซิน

13

package-lock.jsonถูกเขียนไปเมื่อค่าตัวเลขในทรัพย์สินดังกล่าวเป็นสถานที่ให้บริการ "รุ่น" package.jsonหรือทรัพย์สินพึ่งพามีการเปลี่ยนแปลงใน

หากค่าตัวเลขเหล่านี้ในpackage.jsonและpackage-lock.jsonจับคู่package-lock.jsonอ่านจาก

หากค่าตัวเลขเหล่านี้ในpackage.jsonและpackage-lock.jsonไม่ตรงกันpackage-lock.jsonจะถูกเขียนไปยังค่าใหม่เหล่านั้นและโมดิฟายเออร์ใหม่เช่นคาเร็ตและเครื่องหมายตัวหนอนหากมีอยู่ package-lock.jsonแต่มันก็เป็นตัวเลขที่มีการเรียกการเปลี่ยนแปลง

หากต้องการดูสิ่งที่ฉันหมายถึงทำต่อไปนี้ ใช้package.jsonโดยไม่ต้องpackage-lock.jsonรันnpm installด้วย:

{
  "name": "test",
  "version": "1.0.0",
  ...
  "devDependencies": {
    "sinon": "7.2.2"
  }
}

package-lock.json ตอนนี้จะมี:

"sinon": {
  "version": "7.2.2",

ตอนนี้คัดลอก / วางทั้งสองไฟล์ไปยังไดเรกทอรีใหม่ เปลี่ยนpackage.jsonเป็น (เพิ่มเฉพาะคาเร็ต):

{
  "name": "test",
  "version": "1.0.0",
  ...
  "devDependencies": {
    "sinon": "^7.2.2"
  }
}

npm installวิ่ง หากไม่มีpackage-lock.jsonไฟล์ sinon@7.3.0 จะถูกติดตั้ง npm installกำลังอ่านจาก package-lock.jsonและติดตั้ง 7.2.2

ตอนนี้เปลี่ยนpackage.jsonเป็น:

{
  "name": "test",
  "version": "1.0.0",
  ...
  "devDependencies": {
    "sinon": "^7.3.0"
  }
}

npm installวิ่ง package-lock.jsonถูกเขียนถึงและจะแสดงในขณะนี้:

"sinon": {
  "version": "^7.3.0",

7

สิ่งสำคัญที่ต้องพูดถึงเช่นกันคือการปรับปรุงความปลอดภัยที่มาพร้อมกับไฟล์แพ็คเกจแพ็คเกจ เนื่องจากมันทำให้แฮชของแพ็คเกจทั้งหมดหากใครบางคนจะยุ่งเกี่ยวกับการลงทะเบียนสาธารณะและการเปลี่ยนซอร์สโค้ดของแพ็คเกจโดยไม่ต้องเปลี่ยนเวอร์ชั่นของแพ็คเกจเองมันจะถูกตรวจพบโดยไฟล์แพ็คเกจล็อค


4

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

มันอธิบายถึงการเป็นตัวแทนของต้นไม้อ้างอิงเดียวที่เพื่อนร่วมทีมการปรับใช้และการรวมอย่างต่อเนื่องจะรับประกันว่าจะติดตั้งการพึ่งพาเดียวกันมันมีคุณสมบัติดังต่อไปนี้

    {
"name": "mobileapp",
"version": "1.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"@angular-devkit/architect": {
  "version": "0.11.4",
  "resolved": "https://registry.npmjs.org/@angular- devkit/architect/-/architect-0.11.4.tgz",
  "integrity": "sha512-2zi6S9tPlk52vyqNFg==",
  "dev": true,
  "requires": {
    "@angular-devkit/core": "7.1.4",
    "rxjs": "6.3.3"
  }
},

}


2

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


1
แล้วจะเกิดอะไรขึ้นถ้าฉันขัดแย้งกับไฟล์นี้?
Oliver Watkins

0

package-lock.json: มันมีรายละเอียดรุ่นที่แน่นอนที่ติดตั้งในปัจจุบันสำหรับแอปพลิเคชันของคุณ


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