ทำไม“ npm install” เขียน package-lock.json ใหม่


613

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

ยกตัวอย่างเช่นแฟ้มล็อคมี typescript ระบุให้อยู่ในเวอร์ชัน2.1.6 จากนั้นหลังจากที่npm installคำสั่งรุ่นได้เปลี่ยนไปเป็น2.4.1 ที่ดูเหมือนจะเอาชนะวัตถุประสงค์ทั้งหมดของไฟล์ล็อค

ฉันพลาดอะไรไป ฉันจะได้รับ npm เพื่อเคารพไฟล์ล็อคของฉันได้อย่างไร?


4
นี่ไม่ได้ตอบคำถามของคุณดังนั้นหวังว่าความคิดเห็นจะโอเค แต่ลองดูที่ Yarn การสลับใช้เวลาน้อยกว่าหนึ่งชั่วโมงสำหรับเรา
KayakinKoder

4
ปัญหาเดียวกัน แต่ใช้เส้นด้ายgithub.com/yarnpkg/yarn/issues/570 (ให้คำแนะนำมาก)
Yves M.

2
ฉันมีปัญหาเดียวกัน ฉันได้รับการสร้างขึ้นใหม่เมื่อฉันทำงานpackage-lock.json npm installนี้มีกลิ่นเหมือนข้อผิดพลาด NPM คุณใช้รีจิสตรีของคุณเองหรือไม่?
HaNdTriX


@YvesM --no-saveป้องกันการเปลี่ยน lockfile แต่จะไม่มีผลกับการพึ่งพาระดับแรกที่อัปเกรดที่ OP กล่าวถึง
Ross Allen

คำตอบ:


423

อัปเดต 3:เช่นเดียวกับคำตอบอื่น ๆ ชี้ให้เห็นเช่นกันnpm ciคำสั่งได้รับการแนะนำใน npm 5.7.0 เป็นวิธีเพิ่มเติมเพื่อให้ได้บิลด์ที่รวดเร็วและทำซ้ำได้ในบริบท CI ดูเอกสารและบล็อก npmสำหรับข้อมูลเพิ่มเติม


การปรับปรุงที่ 2:ปัญหาที่จะปรับปรุงและชี้แจงเอกสารเป็นGitHub รุ่น #


Update 1:พฤติกรรมที่ถูกอธิบายไว้ด้านล่างได้รับการแก้ไขใน NPM 5.4.2: พฤติกรรมตั้งใจในปัจจุบันคือการระบุไว้ในปัญหา GitHub #


คำตอบเดิม:พฤติกรรมของpackage-lock.jsonก็เปลี่ยนNPM 5.1.0ตามที่กล่าวไว้ในฉบับที่ 16866 พฤติกรรมที่คุณสังเกตเห็นนั้นตั้งใจไว้แล้วโดย npm ตั้งแต่เวอร์ชัน 5.1.0

นั่นหมายความว่าpackage.jsonสามารถแทนที่เมื่อใดก็ตามที่เป็นรุ่นใหม่พบสำหรับการพึ่งพาในpackage-lock.json package.jsonหากคุณต้องการที่จะตอกตะปูอ้างอิงของคุณได้อย่างมีประสิทธิภาพขณะนี้คุณต้องระบุรุ่นโดยไม่มีคำนำหน้าเช่นคุณจะต้องเขียนพวกเขาเป็น1.2.0แทนหรือ~1.2.0 ^1.2.0จากนั้นการรวมกันของpackage.jsonและpackage-lock.jsonจะให้ผลงานสร้างซ้ำ เพื่อความชัดเจน: package-lock.jsonเพียงอย่างเดียวไม่ล็อคการพึ่งพาระดับรูทอีกต่อไป!

ไม่ว่าการตัดสินใจการออกแบบนี้เป็นสิ่งที่ดีหรือไม่ก็พิสูจน์มีการอภิปรายอย่างต่อเนื่องเป็นผลมาจากความสับสนนี้บน GitHub ในรุ่น # (ในสายตาของฉันมันเป็นการตัดสินใจที่น่าสงสัยอย่างน้อยชื่อlockก็ไม่จริงอีกต่อไป)

อีกด้านหนึ่งหมายเหตุ: นอกจากนี้ยังมีข้อ จำกัด สำหรับการลงทะเบียนที่ไม่สนับสนุนแพ็คเกจที่ไม่เปลี่ยนรูปแบบเช่นเมื่อคุณดึงแพ็คเกจโดยตรงจาก GitHub แทนที่จะเป็น npmjs.org ดูเอกสารประกอบของการล็อคแพคเกจสำหรับคำอธิบายเพิ่มเติม


43
แฮ็คnpm updateนั้นใช้ทำอะไร? : o ฉันมีความรู้สึกเดียวกันกับที่npm installอัพเดท แต่ฉันไม่ต้องการที่จะเชื่อ .. แต่ดูเหมือนว่ามันเป็นเรื่องน่าเศร้าจริง ๆ .. อย่างไรก็ตามยังมีตัวเลือกให้ใช้npm shrinkwrapในการล็อค deps แต่ชื่อแพคเกจล็อคไม่ถูกต้อง เพราะมันไม่หยุดและไม่ต้องพึ่งพาการล็อค ..
Jurosh

266
ช่างเป็นระเบียบ! ผู้จัดการบรรจุภัณฑ์ที่ใหญ่ที่สุดในโลกยังไม่มีเอกสารว่าควรใช้งานอย่างไร ทุกคนคาดเดาเกี่ยวกับสิ่งที่ควรทำและกลายเป็นสงครามแห่งความคิดเห็น การสนทนาเป็นสิ่งที่ดี แต่ควรจะเกิดขึ้นก่อนที่จะปล่อยสู่ป่า เมื่อถึงจุดหนึ่งบางคนจำเป็นต้องโทรออกครั้งสุดท้ายและจากนั้นจะสามารถดำเนินการจัดทำเอกสารและปล่อย PHP ได้รับการออกแบบโดยคณะกรรมการและ ad-hoc'd ร่วมกันและดูว่ามันเปิดออก ฉันเกลียดที่จะเห็นสิ่งเดียวกันเกิดขึ้นกับเครื่องมือที่สำคัญและใช้กันอย่างแพร่หลาย
Landon Poch

85
จากนั้นจุดประสงค์ของการใช้แพคเกจล็อคคืออะไร? ฉันคิดว่ามันจะสร้างสภาพแวดล้อมเดียวกันในพื้นที่ทำงานที่แตกต่างกัน แต่กลับกลายเป็นว่ามันไม่ได้ทำอะไรเลย
laltin

17
"จากนั้นการรวมกันของ package.json และ package-lock.json จะทำให้การสร้างซ้ำได้" "package-lock.json" มีบทบาทอะไรที่นี่? "package.json" เพียงอย่างเดียวไม่ได้ให้บิลด์ที่สร้างซ้ำได้หากไม่มีการใช้คำนำหน้าเวอร์ชันหรือไม่
Jānis Elmeris

12
@ JānisElmerisฉันคิดว่า package.json ไม่สามารถปิดการพึ่งพาลึก ๆ ...
Juan Mendes

165

ฉันพบว่าจะมีเวอร์ชันใหม่ของ npm 5.7.1พร้อมกับคำสั่งใหม่npm ciที่จะติดตั้งจากpackage-lock.jsonเท่านั้น

คำสั่ง npm ci ใหม่ติดตั้งจากไฟล์ล็อคของคุณเท่านั้น หาก package.json และไฟล์ล็อคของคุณไม่ซิงค์กันมันจะรายงานข้อผิดพลาด

มันทำงานได้โดยการทิ้ง node_modules ของคุณและสร้างมันใหม่ตั้งแต่เริ่มต้น

นอกเหนือจากการรับประกันว่าคุณจะได้รับสิ่งที่อยู่ในไฟล์ล็อคของคุณเท่านั้นมันเร็วกว่ามาก (2x-10x!) กว่าการติดตั้ง npm เมื่อคุณไม่ได้เริ่มต้นด้วย node_modules

ตามที่คุณอาจใช้ชื่อเราคาดหวังว่ามันจะเป็นประโยชน์อย่างยิ่งต่อสภาพแวดล้อมการรวมระบบอย่างต่อเนื่อง นอกจากนี้เรายังคาดหวังว่าผู้ที่ผลิตงานปรับใช้จากแท็ก git จะได้รับประโยชน์อย่างมาก


133
นี่ควรเป็นพฤติกรรมเริ่มต้นหากมีไฟล์ล็อกอยู่
ต้อง

13
ดังนั้นพวกเขาจึงเปลี่ยนวิธีการทำงานของ npm ฉันเพียงเพื่อนำมันกลับมาเป็น npm ci เดือนต่อมา?
Scott Flack

1
ฉันยังสับสนอยู่ เอกสารอธิบายว่า"ตรวจสอบให้แน่ใจว่าคุณมีแพ็คเกจล็อคและการติดตั้งล่าสุด: npm install"ก่อนที่จะรันคำสั่งnpm ciในโครงการนั้น ไม่npm installเขียนทับไฟล์ package-lock.json หรือไม่
adiga

1
AFAIK: @adiga - เริ่มต้นกับรุ่น 5.4 npm เท่านั้นการเปลี่ยนแปลงแฟ้มล็อคถ้าจำเป็นที่จะต้องทำเช่นนั้นเพื่อให้ตรงกับสเป็คใน packages.json ดังนั้นหากแพ็คเกจเคยพูดthatpackage: 1และล็อคพูดว่า..: 1.0.4dev สามารถแก้ไขเพื่อพูดthatpackage: 2- และนั่นจะบังคับให้ล็อกไฟล์เปลี่ยนเนื่องจาก1.0.4ไม่เข้ากันกับช่วงที่ระบุใหม่ หากไม่มีการเปลี่ยนแปลงpackages.jsonจะยังคงถูกล็อคในเวอร์ชันที่แน่นอนจนกว่าจะลบไฟล์ล็อค [หากไม่ล็อคอยู่และไม่เปลี่ยนแพ็คเกจ.
ToolmakerSteve

1
@ George จากข้อมูลที่ฉันได้อ่าน (สำหรับเวอร์ชันล่าสุดของ npm) และการทดสอบที่ จำกัด ของฉัน: ใช่ทั้งคู่
Venryx

95

ใช้การแนะนำใหม่

npm ci

npm ci ให้ประโยชน์สูงสุดแก่ทีมขนาดใหญ่ การให้ความสามารถแก่นักพัฒนาในการ“ ลงชื่อออก” ในแพ็คเกจล็อคส่งเสริมความร่วมมือที่มีประสิทธิภาพมากขึ้นในทีมขนาดใหญ่และความสามารถในการติดตั้งสิ่งที่อยู่ใน lockfile นั้นมีศักยภาพที่จะประหยัดได้ถึงหมื่นคนหากไม่ใช่นักพัฒนาหลายร้อยชั่วโมงต่อเดือน เพื่อใช้เวลามากขึ้นในการสร้างและจัดส่งสิ่งที่น่าอัศจรรย์

ขอแนะนำnpm ciการสร้างที่รวดเร็วและเชื่อถือได้มากขึ้น


3
ดูเหมือนว่าจะถูกต้องสำหรับฉัน ใครสามารถยืนยันได้บ้าง
phouse512

6
@ phouse512 สิ่งนี้ถูกต้อง เราสวยมากเพียงใช้npm ciและใช้เฉพาะnpm installถ้าการปรับปรุงหรือติดตั้งแพคเกจใหม่
Jacob Sievers

1
ความเห็นล่าสุด ฯลฯ นี่คือคำตอบที่ฉันจะไปด้วย น่าเสียดายที่พวกเขา coudl ไม่แก้ไข snafu ที่น่ากลัว แต่ถ้าข่าวประเสริฐใหม่คือ "npm ci" ก็โอเค ฉันสามารถปรับตัว
Svend

เสียดายที่มันมักจะลบที่มีอยู่node_modulesไดเรกทอรีและจะสร้างในพื้นที่แม้ที่เป็น symlink อย่างอื่นที่ว่างเปล่า แต่สิ่งที่สำคัญ :(
Joe Atzberger

2
@ToolmakerSteve อย่ากลั้นลมหายใจของคุณ! ฉันคิดว่าการลบเนื้อหาของไดเรกทอรีจะมีขนาดช้ากว่าการลบไดเรกทอรี คุณจะต้องระบุเนื้อหาแล้วออกชุดคำสั่งลบมากกว่าเพียงหนึ่งคำสั่งลบไปที่ O / S ด้วยปัญหาด้านประสิทธิภาพก่อนหน้านี้ที่ระดับ npm และการปรับปรุงโดยใช้npm ciฉันคาดหวังว่าพวกเขาจะลังเลที่จะแนะนำสิ่งที่สามารถลดประสิทธิภาพสำหรับกรณีการใช้งานที่ค่อนข้างแปลก คุณอาจต้องการตรวจสอบpnpm.js.orgแม้ว่าจะใช้การเชื่อมโยงอย่างหนักเพื่อลดการใช้ดิสก์
Caltor

64

คำตอบสั้น ๆ :

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

นี่คือสถานการณ์ที่อาจอธิบายสิ่งต่าง ๆ (ตรวจสอบกับ NPM 6.3.0)

คุณประกาศการพึ่งพาใน package.json เช่น:

"depA": "^1.0.0"

จากนั้นคุณทำnpm installซึ่งจะสร้าง package-lock.json ด้วย:

"depA": "1.0.0"

ไม่กี่วันต่อมามีการปล่อย "depA" เวอร์ชันย่อยที่ใหม่กว่าพูดว่า "1.1.0" ดังนั้นสิ่งต่อไปนี้จะเป็นจริง:

npm ci       # respects only package-lock.json and installs 1.0.0

npm install  # also, respects the package-lock version and keeps 1.0.0 installed 
             # (i.e. when package-lock.json exists, it overrules package.json)

ถัดไปคุณอัปเดต package.json ของคุณเป็น:

"depA": "^1.1.0"

จากนั้นรันใหม่อีกครั้ง:

npm ci      # will try to honor package-lock which says 1.0.0
            # but that does not satisfy package.json requirement of "^1.1.0" 
            # so it would throw an error 

npm install # installs "1.1.0" (as required by the updated package.json)
            # also rewrites package-lock.json version to "1.1.0"
            # (i.e. when package.json is modified, it overrules the package-lock.json)

4
นี่เป็นพฤติกรรมที่ตั้งใจไว้ของไฟล์ "ล็อค" เห็นได้ชัดว่าไม่ใช่กรณีที่มี NPM รุ่นเก่ากว่า
Blockost

1
จากนั้น npm จะติดตามการอัปเดตล่าสุดไปยัง package.json อย่างไร จะเกิดอะไรขึ้นเมื่อคุณย้าย package.json และ package-lock.json ไปยังคอมพิวเตอร์เครื่องอื่น npm ในคอมพิวเตอร์เครื่องใหม่รู้ได้อย่างไรว่าแพคเกจล็อคเป็นของแท้หรือได้รับการปรับปรุงเพื่อตัดสินใจว่าจำเป็นต้องอัพเดต package-lock.json หรือไม่
Lahiru Chandima

3
@LahiruChandima มันไม่ได้ติดตามการอัพเดทจริงๆ npm installจะใช้เวอร์ชันที่ล็อคไว้package-lock.jsonยกเว้นว่าจะไม่เป็นไปตามpackage.jsonที่ติดตั้ง package.json และสร้าง package-lock.json ใหม่อีกครั้ง หากคุณเปลี่ยนpackage.jsonวิธีการที่ล็อคแพ็กเกจที่มีอยู่ยังคงตอบสนองต่อการปรับปรุงpackage.jsonมันจะยังคงใช้มันpackage-lock
Ahmad Abdelghany

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

1
@ToolmakerSteve ฉันยังสงสัยในพฤติกรรมที่ @ carlin.scott รายงาน แต่ฉันเพิ่งทดสอบมันและในความเป็นจริงเขาก็ถูกต้อง ถ้ารุ่นภายในnode_modulessatisfies ช่วงในpackage.jsonและไม่มีpackage-lock.jsonไฟล์ NPM npm installจะไม่ปรับปรุงโมดูลเมื่อทำงาน ฉันเดาว่าใช้ได้เพราะคุณสามารถใช้npm update(หรือnpm-checkล่าสุด) เพื่ออัปเดตการอ้างอิงและพฤติกรรมนี้เร็วขึ้นสำหรับกรณีของใครบางคนที่เพิ่งเพิ่มหนึ่งรายการpackage.jsonและไม่ต้องการแพ็คเกจที่ไม่เกี่ยวข้องเพื่ออัปเดตตัวเองเป็นรุ่นล่าสุดที่ตรงกับ sem-ver พิสัย.
Venryx

19

ใช้คำสั่งแทนnpm cinpm install

"ci" หมายถึง "การรวมอย่างต่อเนื่อง"

มันจะติดตั้งการอ้างอิงโครงการขึ้นอยู่กับไฟล์ package-lock.json แทนการพึ่งพาไฟล์ lenient package.json

มันจะสร้างงานสร้างที่เหมือนกันให้กับเพื่อนร่วมทีมของคุณและยังเร็วกว่ามาก

คุณสามารถอ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ได้ในบล็อกโพสต์นี้: https://blog.npmjs.org/post/171556855892/introducing-npm-ci-for-faster-more-more


2
ciอ้างถึง "การผสานรวมอย่างต่อเนื่อง" ดังที่กล่าวไว้ในเอกสารและบล็อกโพสต์ประกาศคำสั่ง: blog.npmjs.org/post/171556855892/ …
Joe Atzberger

ขอบคุณโจ ฉันได้อัพเดตคำตอบของฉันด้วยชื่อที่ถูกต้องและเชื่อมโยงกับโพสต์บล็อก 😊 (สำหรับผู้ที่อ่านข้อความนี้ก่อนหน้านี้ฉันบอกว่ามันหมายถึง "การติดตั้งใหม่ทั้งหมด")
Daniel Tonon

"และมันก็เร็วกว่ามาก" - มันจะลบnode_modulesโฟลเดอร์และสร้างใหม่ตั้งแต่ต้น มันเร็วกว่านี้จริงเหรอ? ไม่npm installลบnode_modulesโฟลเดอร์เกินไป?
izogfif

ฉันคิดว่าความเร็วมาจาก npm โดยไม่จำเป็นต้องคำนวณแพ็คเกจที่จะดาวน์โหลด คิดว่ามันเหมือนnpm installมีการแก้ไขการอ้างอิงแพคเกจทั้งหมดเมื่อทำงาน npm ciเป็นเพียงรายการช้อปปิ้งของ "รับโมดูลที่แน่นอนเหล่านี้"
Daniel Tonon

8

ในอนาคตคุณจะสามารถใช้การ--from-lock-fileตั้งค่าสถานะ (หรือคล้ายกัน) เพื่อติดตั้งเฉพาะจากpackage-lock.jsonโดยไม่ต้องแก้ไข

สิ่งนี้จะเป็นประโยชน์สำหรับ CI และสภาพแวดล้อมอื่น ๆ ที่การสร้างแบบจำลองที่มีความสำคัญ

ดูhttps://github.com/npm/npm/issues/18286สำหรับการติดตามสถานที่


ฉันสงสัยมัน. ถ้าการพึ่งพาต่างกันสำหรับระบบปฏิบัติการที่แตกต่างกันคุณจะบังคับให้ติดตั้งบางสิ่งที่ไม่ทำงานได้อย่างไร
Yevgeniy Afanasyev

4
@YevgeniyAfanasyev แทนที่จะใช้ธงนั้นมันจะถูกนำไปใช้เพื่อnpm ciจัดการกับคำถามของคุณ
spex

8

ดูเหมือนว่าปัญหานี้ได้รับการแก้ไขใน npm v5.4.2

https://github.com/npm/npm/issues/17979

(เลื่อนลงไปที่ความคิดเห็นสุดท้ายในชุดข้อความ)

ปรับปรุง

แก้ไขจริงใน 5.6.0 มีข้อผิดพลาดข้ามแพลตฟอร์มใน 5.4.2 ที่ทำให้เกิดปัญหายังคงเกิดขึ้น

https://github.com/npm/npm/issues/18712

อัปเดต 2

ดูคำตอบของฉันที่นี่: https://stackoverflow.com/a/53680257/1611058

npm ci คือคำสั่งที่คุณควรใช้เมื่อติดตั้งโปรเจ็กต์ที่มีอยู่ตอนนี้


5
ผมใช้ 5.4.2 และจะยังคงมีผลในการปรับเปลี่ยนแพคเกจ lock.json npm iของฉันเมื่อ ตัวอย่างเช่นโมดูลfseventsจะถูกลบออกเมื่อฉันnpm iบนเครื่องที่ไม่รองรับfseventsและจากนั้นโมดูลจะถูกเพิ่มnpm iอีกครั้งเมื่ออีกครั้งบนเครื่องที่ทำ
hrdwdmrbl

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

@hrdwdmrbl ฉันเห็นเดียวกันfseventsลดลงในของฉันpackage-lock.jsonที่มีnpm@5.5ในขณะที่การทำงานร่วมกันกับ Mac OS X ร่วมสมทบ หากคุณยังไม่ได้เปิดปัญหาฉันจะ
อัล X

@hrdwdmrbl ฉันพบว่า (และหัวข้อยาวของปัญหาที่เกี่ยวข้อง) หลังจากที่ฉันออกความคิดเห็นของฉันและลืมที่จะกลับมาดังนั้นเพื่อปรับปรุงความคิดเห็นของฉัน ขอบคุณที่รับเงินคืน ทุกอย่างปกติดี.
อัล X

4

คุณอาจมีสิ่งที่ชอบ:

"typescript":"~2.1.6"

ในpackage.jsonnpm ของคุณที่อัปเดตเป็นรุ่นรองล่าสุดในกรณีของคุณ2.4.1

แก้ไข: คำถามจาก OP

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

ตอบ:

สิ่งนี้มีไว้เพื่อล็อคทรีการพึ่งพาทั้งหมดของคุณ สมมติว่าต้องtypescript v2.4.1 widget ~v1.0.0เมื่อคุณติดตั้ง NPM widget v1.0.0คว้ามัน ต่อมาเมื่อเพื่อนนักพัฒนาของคุณ (หรือ CI สร้าง) ไม่ NPM ติดตั้งและได้รับtypescript v2.4.1แต่ได้รับการปรับปรุงwidget widget v1.0.1ตอนนี้โมดูลโหนดของคุณไม่ซิงค์กัน นี่คือสิ่งที่package-lock.jsonป้องกัน

หรือมากกว่าโดยทั่วไป:

เป็นตัวอย่างให้พิจารณา

แพ็คเกจ A:

{"name": "A", "version": "0.1.0", "dependencies": {"B": "<0.1.0"}}

แพ็คเกจ B:

{"name": "B", "version": "0.0.1", "dependencies": {"C": "<0.1.0"}}

และแพคเกจ C:

{"name": "C", "version": "0.0.1"}

หากสิ่งเหล่านี้เป็น A, B และ C เท่านั้นที่มีอยู่ในรีจิสทรีดังนั้นการติดตั้ง NPM ปกติ A จะติดตั้ง

A@0.1.0 - B@0.0.1 - C@0.0.1

อย่างไรก็ตามหากเผยแพร่ B@0.2.2 จะมีการติดตั้ง NPM ใหม่ A:

A@0.1.0 - B@0.0.2 - C@0.0.1 โดยสมมติว่าเวอร์ชันใหม่ไม่ได้แก้ไขการขึ้นต่อกันของ B แน่นอนว่าเวอร์ชันใหม่ของ B อาจรวมเวอร์ชัน C ใหม่และการอ้างอิงใหม่จำนวนเท่าใดก็ได้ หากการเปลี่ยนแปลงดังกล่าวไม่เป็นที่พึงปรารถนาผู้เขียน A สามารถระบุการพึ่งพาใน B@0.0.1 อย่างไรก็ตามถ้าผู้เขียนของ A และผู้เขียน B ไม่ใช่คนเดียวกันไม่มีทางที่ผู้เขียนของ A จะบอกว่าเขาหรือเธอไม่ต้องการดึงในเวอร์ชัน C ที่เผยแพร่ใหม่เมื่อ B ไม่ได้เปลี่ยนแปลงเลย


OP คำถามที่ 2: ให้ฉันดูว่าฉันเข้าใจถูกต้องหรือไม่ สิ่งที่คุณพูดคือไฟล์ล็อคระบุรุ่นของการอ้างอิงรอง แต่ยังต้องอาศัยการจับคู่แบบคลุมเครือของ package.json เพื่อกำหนดการพึ่งพาระดับบนสุด ถูกต้องหรือไม่

คำตอบ: package.jsonเลขที่แพคเกจล็อคล็อคต้นไม้แพคเกจรวมทั้งแพคเกจรากที่อธิบายไว้ใน หากtypescriptถูกล็อค2.4.1ในของคุณpackage-lock.jsonมันควรจะเป็นเช่นนั้นจนกว่ามันจะเปลี่ยนไป และช่วยให้การพูดในวันพรุ่งนี้รุ่นรุ่นtypescript 2.4.2ถ้าผมชำระเงินสาขาของคุณและรันnpm install, NPM 2.4.1จะเคารพแฟ้มล็อคและติดตั้ง

เพิ่มเติมเกี่ยวกับpackage-lock.json:

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

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

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

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

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

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

https://docs.npmjs.com/files/package-lock.json


29
แต่นั่นไม่ได้อธิบายว่าทำไม "การติดตั้ง npm" จะเปลี่ยนไฟล์ล็อค ไฟล์ล็อคไม่ได้หมายถึงการสร้างบิลด์ที่ทำซ้ำได้หรือไม่ ถ้าเป็นเช่นนั้นไม่ว่าค่า semver จะยังคงใช้เวอร์ชัน 2.1.6 เดียวกัน
Viper Bailey

3
และนั่นคือสิ่งที่ฉันพูด ไฟล์ล็อคแพ็คเกจของฉันบอกว่า typescript@2.1.6 แต่เมื่อฉันรันการติดตั้ง npm รายการจะถูกแทนที่ด้วย typescript@2.4.1
Viper Bailey

5
ฉันพบปัญหาเดียวกันนี้แล้ว ใน CI / CD ของเราการpackage-lock.jsonดึงลงมาจากนั้นเราก็เรียกใช้npm installแต่package-lock.jsonไฟล์ถูกแก้ไขและเราต้องทำการรีเซ็ตก่อนที่เราจะสามารถดึงการเปลี่ยนแปลงถัดไปได้
BayssMekanique

15
ฉันไม่เข้าใจ นี่เป็นไฟล์ "ล็อค" อย่างไรหากการติดตั้งในภายหลังอาจยังคงอัพเกรดอยู่!
Ross Allen

5
ฉันคิดว่าพวกเขาเริ่มต้นด้วยความคิดที่จะให้ไฟล์นี้เป็น "ข้อมูล" และ "ล็อค" จากนั้นจึงตัดสินใจว่าจะเป็นไฟล์ "ข้อมูล" เท่านั้น ชื่อที่ดีกว่าน่าจะเป็น "package-info.json" ฉันชอบที่จะมี "npm install -lock" ซึ่งจะติดตั้งจาก "package-lock.json" และไม่สนใจ "package.json"
Jeremy Chone

2

อาจเป็นไปได้ว่าคุณควรใช้สิ่งนี้

npm ci

แทนที่จะใช้npm install หากคุณไม่ต้องการเปลี่ยนรุ่นแพ็คเกจของคุณ

ตามเอกสารอย่างเป็นทางการทั้งnpm installและnpm ciติดตั้งการอ้างอิงที่จำเป็นสำหรับโครงการ

ข้อแตกต่างที่สำคัญคือnpm installติดตั้งแพ็คเกจที่ใช้packge.jsonเป็นข้อมูลอ้างอิงหรือไม่ ในกรณีที่npm ciมีการติดตั้งแพคเกจที่ใช้package-lock.jsonเป็นข้อมูลอ้างอิงให้แน่ใจว่าทุกครั้งที่มีการติดตั้งแพคเกจที่แน่นอน


1

มีปัญหาแบบเปิดสำหรับสิ่งนี้ในหน้า github ของพวกเขา: https://github.com/npm/npm/issues/18712

ปัญหานี้รุนแรงที่สุดเมื่อนักพัฒนาใช้ระบบปฏิบัติการที่แตกต่างกัน


การเขียนซ้ำในแพคเกจล็อคมีจุดมุ่งหมายปัญหาไม่ได้เกิดจากสิ่งนี้
Z. Khullah

0

แก้ไข: ชื่อ "ล็อค" เป็นเรื่องยุ่งยาก NPM ของมันพยายามที่จะไล่ตามด้วยเส้นด้าย มันไม่ใช่ไฟล์ที่ถูกล็อค แต่อย่างใด package.jsonเป็นไฟล์ที่ใช้งานคงที่ที่ครั้งหนึ่งเคย "ติดตั้ง" จะสร้างโฟลเดอร์ node_modules package-lock.jsonต้นไม้และต้นไม้ที่จะถูกเขียนใน ดังนั้นคุณจะเห็นว่ามันเป็นอีกวิธีหนึ่งในการ - เวอร์ชันการพึ่งพาจะถูกดึงจากpackage.jsonเช่นเคยและpackage-lock.jsonควรถูกเรียกpackage-tree.json

(หวังว่านี่ทำให้คำตอบของฉันชัดเจนขึ้นหลังจาก downvotes มากมาย)


คำตอบแบบง่าย ๆ : package.jsonมีการพึ่งพาของคุณตามปกติในขณะที่package-lock.jsonเป็น "ต้นไม้ node_modules ที่ทำซ้ำได้และที่สำคัญกว่านั้น" (นำมาจากเอกสาร npm เอง )

สำหรับชื่อที่ยุ่งยากนั้น NPM ของมันพยายามที่จะไล่ตามเส้นด้าย


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