ตรวจสอบและปรับปรุงแพ็คเกจหากจำเป็น


471

เราจำเป็นต้องรวมนักวิ่งทดสอบ Karma เข้ากับ TeamCity และเพื่อที่ฉันจะให้สคริปต์ขนาดเล็ก (PowerShell หรืออะไรก็ตาม) ที่จะ:

  1. รับหมายเลขรุ่นที่ต้องการจากไฟล์กำหนดค่าบางอย่าง (ฉันเดาว่าฉันสามารถใส่เป็นความคิดเห็นได้ในkarma.conf.js)

  2. ตรวจสอบว่ารุ่นนักวิ่งกรรมที่กำหนดไว้ติดตั้งใน repo ทั่วโลกของ NPM หรือไม่

  3. ถ้าไม่ใช่หรือเวอร์ชั่นที่ติดตั้งเก่ากว่าที่ต้องการ: เลือกและติดตั้งเวอร์ชั่นที่ถูกต้อง

  4. เรียกใช้มัน: karma start .\Scripts-Tests\karma.conf.js --reporters teamcity --single-run

ดังนั้นคำถามที่แท้จริงของฉันคือ: "จะตรวจสอบสคริปต์ได้อย่างไรหากติดตั้งแพ็คเกจรุ่นที่ต้องการ" คุณควรทำเช็คหรือว่าปลอดภัยที่จะโทรnpm -g installทุกครั้ง?

ฉันไม่ต้องการตรวจสอบและติดตั้งเวอร์ชันล่าสุดที่มีอยู่เสมอเพราะค่ากำหนดอื่น ๆ อาจเข้ากันไม่ได้

คำตอบ:


609

ในการตรวจสอบว่าโมดูลใด ๆ ในโครงการเป็น 'เก่า':

npm outdated

' ล้าสมัย ' จะตรวจสอบทุกโมดูลที่กำหนดไว้package.jsonและดูว่ามีรุ่นที่ใหม่กว่าในรีจิสทรี NPM หรือไม่

ตัวอย่างเช่น say xml2js 0.2.6(อยู่ในnode_modulesโครงการปัจจุบัน) ล้าสมัยเนื่องจากมีเวอร์ชันที่ใหม่กว่า (0.2.7) คุณจะเห็น:

xml2js@0.2.7 node_modules/xml2js current=0.2.6

หากต้องการอัปเดตการอ้างอิงทั้งหมดหากคุณมั่นใจว่านี่เป็นสิ่งที่ต้องการ:

npm update

หรือเพื่ออัปเดตการอ้างอิงเดี่ยวเช่นxml2js:

npm update xml2js

6
ระมัดระวังnpm updateโดยเฉพาะกับnpm update -g... มันไม่ได้เป็นสิ่งที่คนส่วนใหญ่คาดหวังว่าจะทำ! ดู: github.com/npm/npm/issues/6247และgist.github.com/othiym23/4ac31155da23962afd0e
jbandi

6
@jbandi ตั้งแต่ npm@2.6.1 npm -g updateปลอดภัยที่จะใช้อีกครั้ง github.com/npm/npm/issues/6247#issuecomment-92182814
Chuck Le Butt

7
โปรดทราบว่าการอัปเดต npm จะไม่อัปเดตไฟล์ package.json ตามที่ระบุโดยคำตอบจาก @Erik Olson
Ehtesham Hasan

5
As of npm@5.0.0, 'npm update' will change package.json to save the new version as the minimum required dependency docs.npmjs.com/cli/update.html
Sidney

368

npm outdatedจะระบุแพ็คเกจที่ควรอัปเดตและnpm update <package name>สามารถใช้อัปเดตแต่ละแพ็คเกจได้ แต่ก่อนที่จะ npm@5.0.0 npm update <package name>จะไม่อัปเดตเวอร์ชันใน package.json ของคุณซึ่งเป็นปัญหา

เวิร์กโฟลว์ที่ดีที่สุดคือ:

  1. ระบุแพ็คเกจล้าสมัย
  2. อัปเดตเวอร์ชันใน package.json ของคุณ
  3. เรียกใช้npm updateเพื่อติดตั้งเวอร์ชันล่าสุดของแต่ละแพ็คเกจ

ลองดูnpm-check-updatesเพื่อช่วยในเวิร์กโฟลว์นี้

  • ติดตั้งnpm-check-updates
  • เรียกใช้npm-check-updatesเพื่อแสดงรายการแพคเกจที่ล้าสมัย (โดยพื้นฐานแล้วเหมือนกับการใช้งานnpm outdated)
  • เรียกใช้npm-check-updates -uเพื่ออัปเดตทุกเวอร์ชันใน package.json ของคุณ (นี่คือซอสวิเศษ)
  • เรียกใช้npm updateตามปกติเพื่อติดตั้งแพ็คเกจใหม่ของคุณโดยอ้างอิงจาก package.json ที่อัปเดตแล้ว

3
npm outdatedจะแสดงแพ็คเกจทั้งหมด .. แม้แต่ในแพ็คเกจอื่น ๆ .. แต่สิ่งเหล่านั้นจะไม่ได้รับการอัพเดตด้วยโพรซีเดอร์นี้ดังนั้นจึงจะปรากฏขึ้นเสมอ .. ดังนั้นให้ใช้npm-check-updates(ตามที่คุณแนะนำจริง ๆ ) ซึ่งแสดงเฉพาะแพ็คเกจหลักจากpackage.json... นี่เกี่ยวข้อง
davidhq

ด้วยเส้นด้ายสิ่งนี้ง่ายกว่าเพียงพิมพ์ 'การอัพเกรดเส้นด้าย'
Christopher Grigg

17
ทำไมฉันต้องติดตั้งตัวจัดการการปรับปรุงเพื่อจัดการตัวจัดการแพคเกจของฉัน เราไม่เห็นด้วยหรือเปล่าว่านี่โง่ มันควรจะง่ายเหมือนnpm install --all-outdatedแต่มันไม่ใช่ ...
ADJenks

3
คุณสามารถเรียกใช้npm update --save package_nameเพื่อบันทึกการเปลี่ยนแปลงล่าสุดเป็น package.json
trungk18

เอริคคุณช่วยตอบคำถาม SO ที่เกี่ยวข้องนี้ได้ไหมเพราะมันยังสับสนอยู่บ้างสำหรับฉันความแตกต่างระหว่างทั้งสองคำสั่งนั่นคือnpm updatevs npm-check-updates?
João Pimentel Ferreira

146

นอกจากนี้ยังมีโมดูล "สด" ที่เรียกว่าnpm-check:

NPM ตรวจสอบ

ตรวจสอบการอ้างอิงที่ล้าสมัยไม่ถูกต้องและไม่ได้ใช้

ป้อนคำอธิบายรูปภาพที่นี่

นอกจากนี้ยังมีวิธีการโต้ตอบที่สะดวกในการอัปเดตการอ้างอิง


78

ขั้นตอนง่ายๆหนึ่งขั้นตอน:

$ npm i -g npm-check-updates && ncu -u && npm i

นั้นคือทั้งหมด. แพคเกจเวอร์ชันทั้งหมดในpackage.jsonจะเป็นเวอร์ชันหลักล่าสุด

แก้ไข:

เกิดอะไรขึ้นที่นี่

  1. การติดตั้งแพ็คเกจที่ตรวจสอบการอัพเดตสำหรับคุณ

  2. ใช้แพ็กเกจนี้เพื่ออัปเดตแพ็คเกจทั้งหมดในรุ่นของคุณpackage.json(-u ย่อมาจาก --updateAll)

  3. ติดตั้งแพ็คเกจเวอร์ชันใหม่ทั้งหมด


3
@imnickvaughn ncuหมายถึง node-check-updates และ-aเป็นตัวเลือก 'upgradeAll' ค้นหาตัวเลือกทั้งหมดได้ที่นี่: npmjs.com/package/npm-check-updates
Arian Acosta

และถ้าฉันต้องการที่จะทำในหนึ่งบรรทัดโดยไม่ต้องใช้แพคเกจอื่นเช่น ncu?
ADJenks

หรือไม่มีการติดตั้งทั่วโลกnpx -p npm-check-updates ncu -u
entozoon

68
  • ในการอัพเดตแพ็คเกจโลคัลเดียว:

    1. ก่อนอื่นให้ดูแพ็คเกจที่ล้าสมัยของคุณ:

      npm outdated

    2. จากนั้นอัพเดตแพ็คเกจหรือแพ็กเกจที่คุณต้องการด้วยตนเองดังนี้:

      npm update --save package_name

วิธีนี้ไม่จำเป็นต้องอัพเดตpackage.json ไฟล์โลคัลของคุณ

โปรดทราบว่านี่จะอัปเดตแพ็คเกจของคุณเป็นเวอร์ชันล่าสุด

  • หากคุณเขียนบางเวอร์ชันในpackage.jsonไฟล์ของคุณและทำ:

    npm update package_name

    ในกรณีนี้คุณจะได้รับเวอร์ชันที่เสถียรถัดไป (ต้องการ) เกี่ยวกับเวอร์ชันที่คุณเขียนไว้ในpackage.jsonไฟล์ของคุณ

และด้วยnpm list (package_name)คุณสามารถค้นหาแพ็คเกจปัจจุบันของท้องถิ่นของคุณได้


14

คำสั่ง NPM เพื่ออัปเดตหรือแก้ไขช่องโหว่ในไฟล์อ้างอิงบางรายการ

  • ใช้คำสั่งด้านล่างเพื่อตรวจสอบที่ล้าสมัยหรือช่องโหว่ในโมดูลโหนดของคุณ

    npm audit

  • หากพบช่องโหว่ใด ๆ ให้ใช้คำสั่งด้านล่างเพื่อแก้ไขปัญหาทั้งหมด

    npm audit fix

  • ถ้ามันไม่ได้ผลสำหรับคุณลอง

    npm audit fix -fคำสั่งนี้จะแก้ไขช่องโหว่เกือบทั้งหมด บางการพึ่งพาหรือ devDependencies ถูกล็อคในไฟล์package-lock.jsonดังนั้นเราจึงใช้-fflag เพื่อบังคับให้อัพเดท

  • หากคุณไม่ต้องการใช้การบังคับตรวจสอบแก้ไขคุณสามารถแก้ไขเวอร์ชันการอ้างอิงของคุณได้ด้วยตนเองโดยเปลี่ยนเป็นไฟล์package-lock.jsonและpackage.json จากนั้นเรียกใช้

npm update && npm upgrade



10

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

npm install $(npm outdated | cut -d' ' -f 1 | sed '1d' | xargs -I '$' echo '$@latest' | xargs echo)


เป็นคนดีนะขอบคุณ!
drKreso

นี่เป็นคำตอบที่ยอดเยี่ยมเพราะสามารถใส่เชลล์สคริปต์ใด ๆ เพื่อทำให้ขั้นตอนนี้เป็นแบบอัตโนมัติโดยไม่ต้องพึ่งการติดตั้งแพ็กเกจเพิ่มเติม
Jankapunkt

4

เมื่อติดตั้งแพ็กเกจ npm (ทั้งแบบโกลบอลหรือแบบโลคัล) คุณสามารถกำหนดเวอร์ชันเฉพาะโดยใช้@versionไวยากรณ์เพื่อกำหนดเวอร์ชันที่จะติดตั้ง

กล่าวอีกนัยหนึ่งการทำ: npm install -g karma@0.9.2 จะให้แน่ใจว่าติดตั้ง 0.9.2 เท่านั้นและจะไม่ติดตั้งใหม่หากมีอยู่แล้ว

ในฐานะที่เป็นคำแนะนำผมขอแนะนำให้หลีกเลี่ยงการติดตั้งทั่วโลกในทุก ๆ ที่ที่คุณสามารถทำได้ หลายคนไม่ทราบว่าหากการอ้างอิงกำหนดไฟล์ bin มันจะถูกติดตั้งใน. / node_modules/.bin/ บ่อยครั้งที่มันง่ายมากที่จะใช้โมดูลท้องถิ่นที่ติดตั้งซึ่งกำหนดไว้ในแพ็คเกจ.jsonของคุณ อันที่จริงสคริปต์ npm จะเพิ่ม. / node_modules/.bin เข้าสู่เส้นทางของคุณ

ตัวอย่างเช่นนี่คือ package.json ที่เมื่อฉันรันnpm install && npm testจะติดตั้งเวอร์ชันของกรรมที่กำหนดไว้ใน package.json ของฉันและใช้กรรมนั้น (ติดตั้งที่ node_modules / .bin / karma) เมื่อรันtestสคริปต์:

{
 "name": "myApp",
 "main": "app.js",
 "scripts": {
   "test": "karma test/*",
 },
 "dependencies": {...},
 "devDependencies": {
   "karma": "0.9.2"
 }
}

สิ่งนี้จะช่วยให้คุณได้รับประโยชน์จาก package.json ของคุณที่กำหนดเวอร์ชันของกรรมที่จะใช้และไม่ต้องกำหนดค่านั้นไว้ในกล่อง CI ของคุณ


ในtestสคริปต์คืออะไร คุณช่วยบอกเบาะแสให้ฉันทราบว่าคุณติดตั้งสคริปต์ได้อย่างไร
iLemming

1
ดูที่ package.json ภายใต้ "สคริปต์" ทรัพย์สินคุณสามารถกำหนดคุณสมบัติอื่น "ทดสอบ" npm testที่มีค่าเป็นคำสั่งที่คุณต้องการที่จะทำงานเมื่อคุณพิมพ์ เอกสาร npm ค่อนข้างดีที่นี่: npmjs.org/doc/scripts.html
addisonj

4

จากnpm@5.0.0+คุณสามารถทำได้:

npm update <package name>

นี่จะอัปเดตไฟล์โดยอัตโนมัติ package.jsonเราไม่จำเป็นต้องอัปเดตเวอร์ชันล่าสุดด้วยตนเองจากนั้นใช้npm update <package name>

คุณยังสามารถใช้พฤติกรรมเดิมได้

npm update --no-save

( อ้างอิง )


1

หากต้องการอัปเดตเพียงหนึ่งแพ็คเกจติดตั้ง NCU แล้วเรียกใช้แพคเกจนั้น นี่จะชนกับของจริงล่าสุด

npm install -g npm-check-updates

ncu -f your-intended-package-name -u

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