npm การติดตั้งและการอัพเดท - อะไรคือความแตกต่าง


519

อะไรคือความแตกต่างระหว่างจริงnpm installและnpm update? ฉันควรใช้อันไหน

คำตอบ:


654

ความแตกต่างระหว่างการติดตั้ง npmและการจัดการอัพเดตของเวอร์ชันแพ็กเกจที่ระบุในpackage.json :

{
  "name":          "my-project",
  "version":       "1.0",                             // install   update
  "dependencies":  {                                  // ------------------
    "already-installed-versionless-module":  "*",     // ignores   "1.0" -> "1.1"
    "already-installed-semver-module":       "^1.4.3" // ignores   "1.4.3" -> "1.5.2"
    "already-installed-versioned-module":    "3.4.1"  // ignores   ignores
    "not-yet-installed-versionless-module":  "*",     // installs  installs
    "not-yet-installed-semver-module":       "^4.2.1" // installs  installs
    "not-yet-installed-versioned-module":    "2.7.8"  // installs  installs
  }
}

สรุป : ข้อแตกต่างใหญ่เพียงอย่างเดียวคือโมดูลที่ติดตั้งไว้แล้วพร้อมการกำหนดเวอร์ชันแบบฟัซซี่ ...

  • ถูกละเลยโดย npm install
  • ได้รับการปรับปรุงโดย npm update

นอกจากนี้ : installและupdateโดยค่าเริ่มต้นหมายเลขอ้างอิง devDependencies ที่แตกต่างกัน

  • npm installจะติดตั้ง / อัปเดต devDependencies ยกเว้นว่า--productionมีการเพิ่มการตั้งค่าสถานะ
  • npm updateจะไม่สนใจ devDependencies ยกเว้นว่า--devมีการเพิ่มค่าสถานะ

ทำไมต้องใช้งานnpm installเลย?

เพราะจะมากขึ้นเมื่อคุณมองไปนอกเหนือจากการจัดการการอ้างอิงของคุณnpm install package.jsonอย่างที่คุณเห็นในการติดตั้ง npmคุณสามารถ ...

  • ติดตั้งโหนดโมดูลด้วยตนเอง
  • ตั้งให้เป็นโกลบอล (ซึ่งวางไว้ในเชลล์PATH) ใช้npm install -g <name>
  • ติดตั้งรุ่นที่อธิบายไว้โดยแท็ก git
  • ติดตั้งจาก URL คอมไพล์
  • บังคับให้ติดตั้งใหม่ด้วย --force

20
แล้วมันเกี่ยวกับ~1.3อะไร?
Offirmo

6
เกิดอะไรขึ้นถ้ารุ่นเป็น ^ 5.0.9? และเป็นไปได้หรือไม่ที่จะnpm install --save somePackageประหยัด * เพื่อการพึ่งพา?
KwiZ

5
ฉันยังทราบว่าสคริปต์เช่นpostinstallทำงานในการติดตั้ง แต่ไม่ใช่ในการปรับปรุง
Michael Marvick

2
หากinstallและupdateทำงานแตกต่างกันใน URL git, แท็ก git ฯลฯ ที่ระบุไว้ในpackage.jsonนั้นจะเป็นการดีหากเพิ่มกรณีเหล่านั้นลงในตัวอย่าง
joeytwiddle

2
@Offirmo ตัวหนอนในเวอร์ชันเลือนหมายถึง "การปรับปรุงการปล่อยเล็กน้อยล่าสุด (bugfix) แพคเกจนี้" รุ่นรองเป็นตัวเลขสุดท้ายในรุ่นเช่น1.3.0 -> 1.3.1นี้จะคล้ายกับ^1.3.0ที่การปรับปรุงรุ่นใหญ่คือ^ 1.3.0 -> 1.4.0
Boyan Kushlev

82

npm ติดตั้งติดตั้งโมดูลทั้งหมดที่ระบุไว้ในpackage.jsonไฟล์และการอ้างอิงของพวกเขา

การอัพเดต npm จะอัพเดตแพ็กเกจทั้งหมดในnode_modulesไดเร็กทอรีและการพึ่งพา

npm install expressติดตั้งเพียงโมดูลด่วนและการอ้างอิง

npm update express express updates module (เริ่มต้นด้วย npm@2.x จะไม่อัปเดตการอ้างอิง)

ดังนั้นการอัปเดตจึงมีไว้สำหรับเมื่อคุณมีโมดูลอยู่แล้วและต้องการรับรุ่นใหม่


5
หากคุณไม่ได้ระบุเวอร์ชันเฉพาะในไฟล์ package.json การติดตั้ง npm จะได้รับโมดูลรุ่นล่าสุด นี่คือการอัปเดตชนิดหนึ่ง
saeed

11
ดังนั้นสิ่งที่ฉันควรใช้npm installหรือnpm update? หรือในคำอื่น ๆ ตอนนี้ฉันใช้npm installและดูเหมือนว่าจะทำปรับปรุงได้เป็นอย่างดีมีเหตุผลว่าทำไมฉันควรที่เคยใช้ใด ๆnpm update?
Borek Bernard

4
ดังนั้นupdateจะอัปเดตเป็นเวอร์ชันล่าสุดเสมอโดยไม่คำนึงถึง package.json ในขณะที่installจะเคารพเวอร์ชันที่ให้ใน package.json
Borek Bernard

1
updateติดตั้ง (หรืออัปเดตเป็น) โมดูลรุ่นล่าสุด installติดตั้งโมดูลรุ่นล่าสุดหากไม่มีโมดูลนั้นจะเก็บรุ่นปัจจุบันไว้
tenphi

11
@Borek npm updateจะอัปเดตเป็นเวอร์ชั่นล่าสุดโดยอิงตามแพ็คเกจของคุณ หากคุณมี "express": "3.x" และคุณใช้เวอร์ชัน 3.1.0 แท็กนั้นจะอัปเดตเป็นแท็ก 3.x ล่าสุด หากมีรุ่น 4.x จะไม่ติดตั้งรุ่นล่าสุด
gcochard

47

ในกรณีส่วนใหญ่สิ่งนี้จะติดตั้งโมดูลรุ่นล่าสุดที่เผยแพร่เมื่อ npm

npm install express --save

หรือดีกว่าในการอัพเกรดโมดูลเป็นรุ่นล่าสุดใช้:

npm install express@latest --save --force

--save: แพคเกจจะปรากฏในการอ้างอิงของคุณ

ข้อมูลเพิ่มเติม: ติดตั้ง npm


11
npm install express@latest --save --forceเป็นสิ่งที่ฉันต้องการ
ThomasReggi

2
ในกรณีส่วนใหญ่? กรณีอื่น ๆ ?
Dmitri Zaitsev

9

มีการพูดถึงความแตกต่างมากมาย นี่คืออีกหนึ่ง:

เล่นที่ด้านบนของไดเรกทอรีต้นทางของคุณจะเรียกใช้สคริปต์ต่างๆ:npm install , , , ขึ้นอยู่กับสิ่งที่สคริปต์เหล่านี้ทำ a อาจทำงานได้มากกว่าการติดตั้งการพึ่งพาprepublishpreinstallinstallpostinstallnpm install

ฉันเพิ่งมีกรณีใช้ที่prepublishจะโทรmakeและMakefileได้รับการออกแบบมาเพื่อดึงการอ้างอิงถ้าpackage.jsonมีการปรับปรุง การโทรnpm installจากภายในMakefileจะนำไปสู่การเรียกซ้ำแบบไม่สิ้นสุดในขณะที่การโทรnpm updateทำงานได้ดีการติดตั้งการอ้างอิงทั้งหมดเพื่อให้บิลด์สามารถดำเนินการต่อได้แม้ว่าจะmakeถูกเรียกโดยตรง


1
หนึ่งความหมายก็คือว่าถ้าคุณปรับปรุงตัวอย่างเช่นคุณredisโมดูลและother_moduleต้องใช้รุ่นเก่าredis, npm install other_moduleจะรับประกันได้ว่าother_moduleจะใช้รุ่นเก่า มันอาจเพิ่มother_module/node_modules/redisถ้าจำเป็น
jlukanta

4

npm update: ติดตั้งและอัพเดตด้วยโมดูลโหนดล่าสุดซึ่งอยู่ใน package.json

npm install: ติดตั้งโมดูลโหนดที่กำหนดไว้ใน package.json (โดยไม่ต้องอัพเดต)


การใช้ npm เวอร์ชั่น 6.9.0 ฉันสังเกตพฤติกรรมดังต่อไปนี้: npm updateจะละเว้นการพึ่งพาจำนวนpackage-lock.jsonมาก จะมีแพคเกจที่จำเป็นทั้งหมดที่มีอยู่และpackage-lock.jsonถูกต้องฉันมักจะมีการดำเนินการหลังจากที่เหมาะสมnpm install npm update
Manfred
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.