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: มันมีรายละเอียดรุ่นที่แน่นอนที่ติดตั้งในปัจจุบันสำหรับแอปพลิเคชันของคุณ