npm @ 5 ได้รับการเผยแพร่มีไฟล์package package-lock.jsonใหม่ (หลังจากnpm install) ซึ่งทำให้ฉันสับสน ฉันอยากรู้ว่าไฟล์นี้มีผลกระทบอย่างไร?
npm @ 5 ได้รับการเผยแพร่มีไฟล์package package-lock.jsonใหม่ (หลังจากnpm install) ซึ่งทำให้ฉันสับสน ฉันอยากรู้ว่าไฟล์นี้มีผลกระทบอย่างไร?
คำตอบ:
มันเก็บแผนผังการพึ่งพาที่แน่นอนและเป็นเวอร์ชันแทนที่จะใช้การกำหนดเวอร์ชันที่ติดดาวเช่น 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 ก่อนหน้านี้ทำในสิ่งเดียวกัน แต่ไฟล์ล็อคเปลี่ยนชื่อเพื่อให้ฟังก์ชั่นนั้นชัดเจนยิ่งขึ้น หากมีไฟล์หดตัวห่ออยู่ในโครงการแล้วจะใช้ไฟล์นี้แทนไฟล์ล็อกใด ๆ
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ไฟล์ของคุณ
npm ciตามที่npm installจะอัพเดต package-lock.json ในขณะที่ ci ใช้เนื้อหา เท่านั้นที่มีnpm ciคุณจะได้รับการทำซ้ำที่แข็งแกร่งสร้าง
มันเป็นเรื่องการปรับปรุงที่สำคัญมากสำหรับ NPM: รับประกันรุ่นเดียวกันแน่นอนของทุกแพคเกจ
วิธีการทำให้แน่ใจว่าโครงการของคุณสร้างขึ้นด้วยแพ็คเกจเดียวกันในสภาพแวดล้อมที่แตกต่างกันในเวลาที่แตกต่างกันอย่างไร สมมติว่าคุณสามารถใช้^1.2.3ในpackage.jsonหรือบางส่วนของการอ้างอิงของคุณกำลังใช้วิธีการที่ แต่คุณจะมั่นใจได้อย่างไรในแต่ละครั้งnpm installจะรับรุ่นเดียวกันในเครื่อง dev ของคุณและในการสร้างเซิร์ฟเวอร์? package-lock.jsonจะทำให้มั่นใจได้ว่า
npm installจะสร้างไฟล์ล็อคอีกครั้งเมื่อสร้างเซิร์ฟเวอร์หรือเซิร์ฟเวอร์การปรับใช้ทำnpm ci(ซึ่งจะอ่านจากไฟล์ล็อคและติดตั้งทรีแพคเกจทั้งหมด)
package-lock.jsonไฟล์เลย มันเพิ่งติดตั้งจากที่package.jsonเคยเป็น ที่จะทำให้การใช้งานของpackage-lock.jsonไฟล์ที่คุณต้องใช้คำสั่ง "NPM CI" ใหม่ซึ่งจะติดตั้งรุ่นที่แน่นอนระบุไว้ในแทนรุ่นที่กำหนดในช่วงpackage-lock.json package.json
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
package-lock.jsonเป็นวิธีเดียวที่เหมาะสมที่จะทำคือการลบและการงอกใหม่ได้โดยใช้package-lock.json npm install(คุณไม่ต้องการแก้ไขด้วยตนเองpackage-lock.json) การเปลี่ยนค่าของคุณสมบัติ "รุ่น" (ใกล้ด้านบน) ของpackage.jsonจะเปลี่ยนเดียวกันในpackage-lock.jsonบนแต่การเพิ่มเครื่องหมายการพึ่งพาจะไม่ทำแบบเดียวกันกับnpm install package-lock.json
package.jsonเป็นสิ่งที่คุณสามารถปรับเปลี่ยนด้วยตนเองและpackage-lock.jsonเป็นสิ่งที่คุณไม่เคยสัมผัสด้วยตนเอง คุณมักจะควบคุมรุ่นทั้งไฟล์ - package-lock.jsonโดยเฉพาะอย่างยิ่ง เปิดไฟล์ทั้งสองแก้ไขชื่อโครงการด้วยตนเองpackage.jsonเรียกใช้npm installและดูว่าชื่อโครงการเปลี่ยนpackage-lock.jsonไปอย่างไร ดูเหมือนจะไม่ถูกบันทึกไว้ในlicense package-lock.json
npm ci, npm installก็จะใช้ package.json แม้ว่าล็อคไฟล์ที่มีให้
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",
สิ่งสำคัญที่ต้องพูดถึงเช่นกันคือการปรับปรุงความปลอดภัยที่มาพร้อมกับไฟล์แพ็คเกจแพ็คเกจ เนื่องจากมันทำให้แฮชของแพ็คเกจทั้งหมดหากใครบางคนจะยุ่งเกี่ยวกับการลงทะเบียนสาธารณะและการเปลี่ยนซอร์สโค้ดของแพ็คเกจโดยไม่ต้องเปลี่ยนเวอร์ชั่นของแพ็คเกจเองมันจะถูกตรวจพบโดยไฟล์แพ็คเกจล็อค
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"
}
},
}
ไฟล์นี้ถูกสร้างและใช้งานโดยอัตโนมัติโดย npm เพื่อติดตามการติดตั้งแพ็กเกจของคุณและเพื่อจัดการสถานะและประวัติการพึ่งพาของโครงการของคุณได้ดียิ่งขึ้น คุณไม่ควรแก้ไขเนื้อหาของไฟล์นี้
package-lock.json: มันมีรายละเอียดรุ่นที่แน่นอนที่ติดตั้งในปัจจุบันสำหรับแอปพลิเคชันของคุณ