อะไรคือความแตกต่างระหว่าง“ การติดตั้ง npm” และ“ npm ci”?


215

ฉันทำงานกับการรวมอย่างต่อเนื่องและค้นพบคำสั่งnpm ci

ฉันไม่สามารถคิดได้ว่าข้อดีของการใช้คำสั่งนี้สำหรับเวิร์กโฟลว์ของฉันคืออะไร

เร็วขึ้นไหม มันทำให้การทดสอบยากขึ้นโอเคและหลังจากนั้นหรือไม่

คำตอบ:


328

จากเอกสาร npm :

กล่าวโดยสรุปความแตกต่างหลักระหว่างการใช้การติดตั้ง npm และ npm ci คือ:

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

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

npm ci(ตั้งชื่อตามC ontinuous ฉัน ntegration) ติดตั้งการพึ่งพาโดยตรงจากpackage-lock.jsonและใช้package.jsonเพื่อตรวจสอบว่าไม่มีรุ่นที่ไม่ตรงกันเท่านั้น หากมีการอ้างอิงใด ๆ หายไปหรือมีรุ่นเข้ากันไม่ได้ก็จะโยนความผิดพลาด

ใช้npm installเพื่อเพิ่มการพึ่งพาใหม่และเพื่ออัปเดตการอ้างอิงในโครงการ โดยปกติแล้วคุณจะใช้มันในระหว่างการพัฒนาหลังจากดึงการเปลี่ยนแปลงที่อัปเดตรายการการอ้างอิง แต่อาจเป็นความคิดที่ดีที่จะใช้npm ciในกรณีนี้

ใช้npm ciถ้าคุณต้องการบิลด์ที่กำหนดค่าได้และทำซ้ำได้ ยกตัวอย่างเช่นในระหว่างการรวมอย่างต่อเนื่องงานอัตโนมัติ ฯลฯ npm installและเมื่อการติดตั้งการอ้างอิงเป็นครั้งแรกแทน

npm install

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

npm ci

  • ต้องมีอย่างน้อย NPM v5.7.1
  • จำเป็นต้องมีpackage-lock.jsonหรือnpm-shrinkwrap.jsonจะนำเสนอ
  • package.jsonโยนข้อผิดพลาดหากอ้างอิงจากทั้งสองไฟล์ไม่ตรงกับ
  • ลบnode_modulesและติดตั้งการอ้างอิงทั้งหมดในครั้งเดียว
  • มันไม่เคยเขียนไปหรือpackage.jsonpackage-lock.json

ขั้นตอนวิธี

ในขณะที่การnpm ciสร้างแผนภูมิการอ้างอิงทั้งจากpackage-lock.jsonหรือnpm-shrinkwrap.json, npm install การปรับปรุงเนื้อหาของnode_modulesโดยใช้วิธีดังต่อไปนี้ ( แหล่งที่มา ):

load the existing node_modules tree from disk
clone the tree
fetch the package.json and assorted metadata and add it to the clone
walk the clone and add any missing dependencies
  dependencies will be added as close to the top as is possible
  without breaking any other modules
compare the original tree with the cloned tree and make a list of
actions to take to convert one to the other
execute all of the actions, deepest first
  kinds of actions are install, update, remove and move

1
ฉันไม่รู้npm installจะเขียนถึง package.json คุณรู้หรือไม่ว่ามันเขียนอะไรได้บ้าง?
Veve

5
ดีที่อาจทำให้เข้าใจผิดเล็กน้อย ... มันจะเขียนถึง package.json เมื่อคุณใช้เพื่อติดตั้งอัปเดตหรือลบการอ้างอิง ฉันจะทำให้ชัดเจนขึ้นในข้อความขอบคุณ!
lucascaro

อัลกอริทึมนี้มีการบันทึกไว้ที่ใด นั่นคือแหล่งที่มาของคุณ?
Yngvar Kristiansen

1
@YngvarKristiansen อยู่ในเอกสาร npm เพิ่มลิงก์ไปยังส่วนเฉพาะสำหรับการอ้างอิง
lucascaro

4
npm install packageสามารถปรับเปลี่ยนทั้งสองอย่างpackage-lock.json และ package.jsonในขณะที่การnpm installขัดแย้งจะแก้ไขเท่านั้นpackage-lock.json
knobo

20

npm ciจะลบโฟลเดอร์ node_modules ที่มีอยู่ใด ๆ และพึ่งพาpackage-lock.jsonไฟล์เพื่อติดตั้งเวอร์ชันเฉพาะของแต่ละแพ็คเกจ มันเร็วกว่าการติดตั้ง NPM อย่างมีนัยสำคัญเพราะข้ามคุณสมบัติบางอย่าง การติดตั้งแบบ Clean state นั้นยอดเยี่ยมมากสำหรับ ci / cd pipelines และ docker builds! คุณยังสามารถใช้มันเพื่อติดตั้งทุกอย่างในคราวเดียวและไม่ใช่แพ็คเกจเฉพาะ


9

เอกสารที่คุณเชื่อมโยงมีข้อมูลสรุป:

กล่าวโดยสรุปความแตกต่างหลักระหว่างการใช้การติดตั้ง npm และ npm ci คือ:

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

2

คำสั่งนั้นคล้ายกันมากในการทำงาน แต่ความแตกต่างอยู่ในแนวทางที่ใช้ในการติดตั้งการอ้างอิงที่ระบุในไฟล์package.jsonและของคุณpackage-lock.json

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

ความแตกต่างอื่น ๆ คือสิ่งที่npm ciไม่เคยสัมผัสกับpackage*.jsonไฟล์ของคุณ มันจะหยุดการติดตั้งและแสดงข้อผิดพลาดหากรุ่นการพึ่งพาไม่ตรงกับในpackage.jsonและpackage-lock.jsonไฟล์

คุณสามารถอ่านคำอธิบายที่ดีมากจากเอกสารอย่างเป็นทางการที่นี่

นอกจากนี้คุณอาจต้องการที่จะอ่านเกี่ยวกับแพคเกจล็อคที่นี่


1

มันเป็นที่มีมูลค่าในใจว่าภาพโหนดแสงนักเทียบท่าเช่นอัลไพน์ไม่ได้มีการติดตั้ง Python ซึ่งเป็นพึ่งพาของซึ่งถูกใช้โดยnode-gypnpm ci

ฉันคิดว่ามันเป็นเรื่องที่ให้ความเห็นว่าในการnpm ciทำงานคุณจำเป็นต้องติดตั้ง Python ในแบบของคุณ

ข้อมูลเพิ่มเติมที่นี่นักเทียบท่าและ npm - gyp ERR! ไม่โอเค


0

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

คุณควรใช้มันในสถานการณ์ต่าง ๆ

npm installเหมาะสำหรับการพัฒนาและใน CI เมื่อคุณต้องการแคชnode_modulesไดเรกทอรี จะใช้เมื่อไหร่? คุณสามารถทำเช่นนี้หากคุณกำลังทำแพคเกจสำหรับคนอื่น ๆ ในการใช้งาน(คุณไม่ได้รวมnode_modulesในรุ่นดังกล่าว) เกี่ยวกับการแคชให้ระวังถ้าคุณวางแผนที่จะสนับสนุนการNode.jsจำรุ่นต่าง ๆที่node_modulesอาจต้องทำการติดตั้งใหม่เนื่องจากความแตกต่างระหว่างNode.jsข้อกำหนดของรันไทม์ LTSหากคุณต้องการที่จะติดรุ่นหนึ่งติดล่าสุด

npm ciควรใช้เมื่อคุณต้องการทดสอบและเผยแพร่แอปพลิเคชันการผลิต (ผลิตภัณฑ์ขั้นสุดท้ายไม่ควรใช้โดยแพ็คเกจอื่น) เนื่องจากเป็นสิ่งสำคัญที่คุณต้องทำการติดตั้งให้ปลอดภัยที่สุดการติดตั้งนี้จะใช้เวลานานกว่า ใบสมัครของคุณน่าเชื่อถือมากขึ้น(คุณรวมถึงnode_modulesในรุ่นดังกล่าว) ติดกับรุ่นของLTSNode.js

โบนัส: คุณสามารถผสมมันขึ้นอยู่กับความซับซ้อนที่คุณต้องการสร้าง ในสาขาคุณลักษณะในgitคุณสามารถแคชnode_modulesเพื่อเพิ่มประสิทธิภาพการทำงานของทีมของคุณและตามคำขอผสานและสาขาหลักขึ้นอยู่npm ciกับผลลัพธ์ที่กำหนด

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