ฉันทำงานกับการรวมอย่างต่อเนื่องและค้นพบคำสั่ง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.json
npm 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.json
package-lock.json
npm i packagename
) อาจมีการเขียนpackage.json
เพื่อเพิ่มหรืออัปเดตการอ้างอิงnpm i
) มันอาจจะเขียนถึงpackage-lock.json
เพื่อล็อครุ่นของการอ้างอิงบางอย่างถ้าพวกเขาไม่ได้อยู่ในไฟล์นี้npm ci
package-lock.json
หรือnpm-shrinkwrap.json
จะนำเสนอpackage.json
โยนข้อผิดพลาดหากอ้างอิงจากทั้งสองไฟล์ไม่ตรงกับnode_modules
และติดตั้งการอ้างอิงทั้งหมดในครั้งเดียวpackage.json
package-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-gyp
npm 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
ในรุ่นดังกล่าว) ติดกับรุ่นของLTS
Node.js
โบนัส: คุณสามารถผสมมันขึ้นอยู่กับความซับซ้อนที่คุณต้องการสร้าง ในสาขาคุณลักษณะในgit
คุณสามารถแคชnode_modules
เพื่อเพิ่มประสิทธิภาพการทำงานของทีมของคุณและตามคำขอผสานและสาขาหลักขึ้นอยู่npm ci
กับผลลัพธ์ที่กำหนด
npm install
จะเขียนถึง package.json คุณรู้หรือไม่ว่ามันเขียนอะไรได้บ้าง?