ฉันทำงานกับการรวมอย่างต่อเนื่องและค้นพบคำสั่งnpm ci
ฉันไม่สามารถคิดได้ว่าข้อดีของการใช้คำสั่งนี้สำหรับเวิร์กโฟลว์ของฉันคืออะไร
เร็วขึ้นไหม มันทำให้การทดสอบยากขึ้นโอเคและหลังจากนั้นหรือไม่
ฉันทำงานกับการรวมอย่างต่อเนื่องและค้นพบคำสั่งnpm ci
ฉันไม่สามารถคิดได้ว่าข้อดีของการใช้คำสั่งนี้สำหรับเวิร์กโฟลว์ของฉันคืออะไร
เร็วขึ้นไหม มันทำให้การทดสอบยากขึ้นโอเคและหลังจากนั้นหรือไม่
คำตอบ:
จากเอกสาร 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 installnpm-shrinkwrap.jsonและpackage-lock.json(ตามลำดับ)node_modulesจะติดตั้งการอ้างอิงที่ขาดหายไปในpackage.jsonpackage-lock.jsonnpm i packagename) อาจมีการเขียนpackage.jsonเพื่อเพิ่มหรืออัปเดตการอ้างอิงnpm i) มันอาจจะเขียนถึงpackage-lock.jsonเพื่อล็อครุ่นของการอ้างอิงบางอย่างถ้าพวกเขาไม่ได้อยู่ในไฟล์นี้npm cipackage-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
npm install packageสามารถปรับเปลี่ยนทั้งสองอย่างpackage-lock.json และ package.jsonในขณะที่การnpm installขัดแย้งจะแก้ไขเท่านั้นpackage-lock.json
npm ciจะลบโฟลเดอร์ node_modules ที่มีอยู่ใด ๆ และพึ่งพาpackage-lock.jsonไฟล์เพื่อติดตั้งเวอร์ชันเฉพาะของแต่ละแพ็คเกจ มันเร็วกว่าการติดตั้ง NPM อย่างมีนัยสำคัญเพราะข้ามคุณสมบัติบางอย่าง การติดตั้งแบบ Clean state นั้นยอดเยี่ยมมากสำหรับ ci / cd pipelines และ docker builds! คุณยังสามารถใช้มันเพื่อติดตั้งทุกอย่างในคราวเดียวและไม่ใช่แพ็คเกจเฉพาะ
เอกสารที่คุณเชื่อมโยงมีข้อมูลสรุป:
กล่าวโดยสรุปความแตกต่างหลักระหว่างการใช้การติดตั้ง npm และ npm ci คือ:
- โปรเจ็กต์ต้องมี package-lock.json หรือ npm-shrinkwrap.json ที่มีอยู่
- หากการอ้างอิงในการล็อกแพ็กเกจไม่ตรงกับที่อยู่ใน package.json npm ci จะออกจากพร้อมข้อผิดพลาดแทนที่จะอัพเดตการล็อกแพ็กเกจ
- npm ci สามารถติดตั้งโปรเจ็กต์ได้ทีละโครงการเท่านั้น: ไม่สามารถเพิ่มการพึ่งพาแต่ละรายการได้ด้วยคำสั่งนี้
- หาก node_modules มีอยู่แล้วจะถูกลบโดยอัตโนมัติก่อนที่จะเริ่มต้นการติดตั้ง npm ci
- มันจะไม่เขียนถึง package.json หรือแพ็คเกจล็อค: การติดตั้งนั้นเป็นน้ำแข็ง
คำสั่งนั้นคล้ายกันมากในการทำงาน แต่ความแตกต่างอยู่ในแนวทางที่ใช้ในการติดตั้งการอ้างอิงที่ระบุในไฟล์package.jsonและของคุณpackage-lock.json
npm ciทำการติดตั้งใหม่ทั้งหมดของแอพของคุณในขณะที่npm installอาจข้ามการติดตั้งบางอย่างหากมีอยู่แล้วในระบบ ปัญหาอาจเกิดขึ้นหากเวอร์ชันที่ติดตั้งไว้แล้วในระบบไม่ใช่สิ่งที่คุณpackage.jsonตั้งใจจะติดตั้งนั่นคือเวอร์ชันที่ติดตั้งนั้นแตกต่างจากเวอร์ชัน ' จำเป็น '
ความแตกต่างอื่น ๆ คือสิ่งที่npm ciไม่เคยสัมผัสกับpackage*.jsonไฟล์ของคุณ มันจะหยุดการติดตั้งและแสดงข้อผิดพลาดหากรุ่นการพึ่งพาไม่ตรงกับในpackage.jsonและpackage-lock.jsonไฟล์
มันเป็นที่มีมูลค่าในใจว่าภาพโหนดแสงนักเทียบท่าเช่นอัลไพน์ไม่ได้มีการติดตั้ง Python ซึ่งเป็นพึ่งพาของซึ่งถูกใช้โดยnode-gypnpm ci
ฉันคิดว่ามันเป็นเรื่องที่ให้ความเห็นว่าในการnpm ciทำงานคุณจำเป็นต้องติดตั้ง Python ในแบบของคุณ
ข้อมูลเพิ่มเติมที่นี่นักเทียบท่าและ npm - gyp ERR! ไม่โอเค
คุณควรใช้มันในสถานการณ์ต่าง ๆ
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กับผลลัพธ์ที่กำหนด
npm installจะเขียนถึง package.json คุณรู้หรือไม่ว่ามันเขียนอะไรได้บ้าง?