ความแตกต่างระหว่าง npm-shrinkwrap.json และ package-lock.json คืออะไร


158

ด้วยการเปิดตัว npm @ 5ตอนนี้มันจะเขียน a package-lock.jsonเว้นแต่ว่ามีnpm-shrinkwrap.jsonอยู่แล้ว

ฉันติดตั้ง npm @ 5 ทั่วโลกผ่านทาง:

npm install npm@5 -g

และตอนนี้ถ้าnpm-shrinkwrap.jsonพบในระหว่าง:

npm install

คำเตือนจะถูกพิมพ์:

npm WARN read-shrinkwrap This version of npm
is compatible with lockfileVersion@1,
but npm-shrinkwrap.json was generated for lockfileVersion@0.
I'll try to do my best with it!

เพื่อนำออกไปของฉันเป็นที่ฉันควรเปลี่ยน shrinkwrap package-lock.jsonกับ

ทำไมถึงมีรูปแบบใหม่สำหรับมัน? สิ่งที่package-lock.jsonไม่npm-shrinkwrap.jsonสามารถทำได้?

คำตอบ:


176

ไฟล์มีเนื้อหาเหมือนกันทุกประการ แต่มีความแตกต่างเล็กน้อยในวิธีที่ npm จัดการกับมันอธิบายไว้ในไซต์เอกสารและในไฟล์เอกสารใน repo npm ที่เริ่มต้นด้วยการระบุความแตกต่างระหว่างสองไฟล์เหล่านี้อย่างชัดเจน :

  • package-lock.jsonไม่เคยเผยแพร่ถึง npm ในขณะที่npm-shrinkwrapเป็นค่าเริ่มต้น
  • package-lock.json ไฟล์ที่ไม่ได้อยู่ในแพ็คเกจระดับบนจะถูกข้าม แต่ไฟล์ที่หดตัวที่เป็นของการอ้างอิงจะได้รับการเคารพ
  • npm-shrinkwrap.jsonเข้ากันได้ย้อนหลังกับ npm เวอร์ชัน 2, 3 และ 4 ในขณะที่package-lock.jsonnpm 5+ จะรับรู้เท่านั้น

คุณสามารถแปลงที่มีอยู่package-lock.jsonไปยังโดยการเรียกใช้npm-shrinkwrap.jsonnpm shrinkwrap

ดังนั้น:

  • หากคุณไม่ได้เผยแพร่แพ็คเกจของคุณเป็น npm ตัวเลือกระหว่างไฟล์ทั้งสองนี้มีผลเพียงเล็กน้อย คุณอาจต้องการที่จะใช้package-lock.jsonเพราะมันเป็นค่าเริ่มต้นและชื่อของมันมีความชัดเจนเพื่อเริ่มต้น NPM; หรือคุณอาจต้องการใช้npm-shrinkwrap.jsonสำหรับความเข้ากันได้แบบย้อนหลังกับ npm 2-4 หากคุณมั่นใจว่าทุกคนในทีมพัฒนาของคุณใช้เวลา npm 5+ (โปรดทราบว่า npm 5 ได้รับการปล่อยตัวเมื่อวันที่ 25 พฤษภาคม 2017 ความเข้ากันได้แบบย้อนหลังจะกลายเป็นสิ่งที่สำคัญยิ่งน้อยลงไปกว่าที่เราได้รับนับจากวันดังกล่าวเนื่องจากผู้คนส่วนใหญ่จะอัพเกรดในที่สุด)
  • หากคุณกำลังเผยแพร่แพ็คเกจของคุณถึง npm คุณมีตัวเลือกระหว่าง:

    1. ใช้ a package-lock.jsonเพื่อบันทึกเวอร์ชันที่อ้างอิงที่คุณติดตั้งอย่างแน่นอน แต่อนุญาตให้ผู้ที่ติดตั้งแพคเกจของคุณใช้เวอร์ชันใด ๆ ของการพึ่งพาที่เข้ากันได้กับช่วงเวอร์ชันที่บอกโดยคุณpackage.jsonหรือ
    2. ใช้npm-shrinkwrap.jsonเพื่อรับประกันว่าทุกคนที่ติดตั้งแพคเกจของคุณได้ว่ารุ่นเดียวกันของการอ้างอิงทั้งหมด


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


2
+1 - คุณสามารถอธิบายหัวข้อย่อยที่สองของคุณได้หรือไม่? ความแตกต่างระหว่างพฤติกรรมนั้นและการมี npm-shrinkwrap คืออะไร
Rhys

2
@ ใช้กระสุนลูกที่สองจะไม่สำคัญถ้าคุณไม่ได้ทำอะไรแปลก ๆ โดยพื้นฐานแล้วมันเพิ่งบอกว่าถ้าห้องสมุดทำการเผยแพร่package-lock.json(ซึ่งเป็นไปไม่ได้) อย่างใดดังนั้นถ้าคุณติดตั้งไลบรารีนั้นเป็นการพึ่งพาของแพ็คเกจอื่น ๆ บางอย่างpackage-lock.jsonNPM ของไลบรารีจะถูกละเว้น แต่ถ้าห้องสมุดเผยแพร่npm-shrinkwrap.jsonและคุณติดตั้งห้องสมุดเป็นพึ่งพาแล้วคุณจะยังติดตั้งเป็นการอ้างอิงรองรุ่นที่แน่นอนnpm-shrinkwrap.jsonของการอ้างอิงทั้งหมดที่ระบุไว้ในห้องสมุด
Mark Amery

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

@ k0pernikus ฉันไม่คิดว่ามีความแตกต่างใด ๆ ระหว่างวิธีการnpm ciจับnpm-shrinkwrap.jsonและpackage-lock.json- สิ่งที่เกี่ยวข้องกับคำถามนี้เกี่ยวกับความแตกต่างระหว่างสองไฟล์หรือไม่? นอกจากนี้หลังจากอ่านไปแล้ว: ฉันคิดว่า" npm install... ไม่ได้ใช้ประโยชน์จากpackage-lock.json"เป็นเท็จตั้งแต่ตอนบ่ายโมงที่ 5.4 - npm installตอนนี้ฉันเชื่อว่าคุณpackage-lock จะเคารพคุณเว้นแต่ว่ามันจะไม่เข้ากันกับคุณpackage.jsonในทันที (แต่ฉันออกจากโลก JavaScript ไป
Mark Amery

27

คำอธิบายจากนักพัฒนา NPM :

ความคิดนี้แน่นอนสำหรับ package-lock.json ที่จะเป็นเทคโนโลยีล่าสุดและยิ่งใหญ่ที่สุดใน shrinkwrap และ npm-shrinkwrap.json จะถูกสงวนไว้สำหรับผู้ที่มีค่าไม่กี่คนที่สนใจห้องสมุดของพวกเขาที่มี node_modules ที่แน่นอน - และ สำหรับผู้ที่ต้องการใช้ CI โดยใช้ npm @> = 2 เพื่อติดตั้งแผนผังเฉพาะโดยไม่ต้องชนรุ่น npm

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


18
ฉันยังไม่ชัดเจนกับความแตกต่าง ถ้าnpm-shrinkwrapเป็นของ node_modules ที่แน่นอน .... ฉันถือว่าpackage-lock.jsonล็อคน้อยกว่าที่แน่นอน และถ้าเป็นเช่นนั้นสิ่งที่ไม่ล็อคที่npm-shrinkwrapล็อค?
dman

คุณเข้าใจผิด @dman package-lock เป็นเวอร์ชันใหม่ของ npm-shrinkwrap แพคเกจล็อคเป็นการยกเลิก (ดังนั้นคุณต้องลบคุณลักษณะเนื่องจากเป็นการเปิดใช้งานค่าเริ่มต้น), npm-shrinkwrap เป็นการยกเลิก (ดังนั้นคุณต้องเปิดใช้งานเพราะไม่รวมค่าเริ่มต้นของฉัน) เหตุผลที่พวกเขาแนะนำแพ็คเกจล็อคคือตอนนี้ผู้ใช้มีวิธีประหยัดเพื่อจัดการกับการพึ่งพาเนื่องจากมันถูกเปิดใช้งานโดยค่าเริ่มต้นและ 2. ชื่อแสดงถึงสิ่งที่อยู่ใน oposite กับ "shrinkwrap" npm-shrinkwrap มีการตั้งค่าการพึ่งพาพิเศษบางอย่างซึ่งสิ่งที่แพ็กเกจล็อคไม่มีในขณะนี้ npm-shrinkwrap ล้าสมัยแล้ว
SeriousM

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

package-lock.json ก็ล่วงล้ำเช่นกัน ดังนั้นจึงสามารถทำให้เกิดข้อขัดแย้ง SCM ได้อย่างง่ายดายหากคุณเรียกว่า "npm i" ในขณะที่ควรสร้างการย่อขนาดให้ชัดเจนและจะไม่ทำให้เกิดความขัดแย้งในเซิร์ฟเวอร์ ci ใช่ฉันผิดที่นี่
norekhov

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

12

ฉันคิดว่าความคิดที่จะมี - บันทึกและลดขนาดแทปเกิดขึ้นตามค่าเริ่มต้น แต่หลีกเลี่ยงปัญหาที่อาจเกิดขึ้นเมื่อมีการหดตัวที่ไม่ต้องการ ดังนั้นพวกเขาเพิ่งตั้งชื่อไฟล์ใหม่เพื่อหลีกเลี่ยงความขัดแย้งใด ๆ มีคนจาก npm อธิบายให้ละเอียดยิ่งขึ้นที่นี่:

https://www.reddit.com/r/javascript/comments/6dgnnq/npm_v500_released_save_by_default_lockfile_better/di3mjuk/

คำพูดที่เกี่ยวข้อง:

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

ดังนั้นเราจึงเลือกชื่อใหม่ และเราเลือกชื่อใหม่ในทันที lockfile ใหม่นั้นใช้รหัสเดียวกันทั้งหมดในรูปแบบเดียวกันทั้งหมด

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