อัปเดต package.json รุ่นอัตโนมัติ


183

ก่อนที่ฉันจะปล่อยเล็ก ๆ และติดแท็กฉันต้องการอัปเดต package.json เพื่อให้สอดคล้องกับโปรแกรมเวอร์ชั่นใหม่

มีวิธีแก้ไขไฟล์package.jsonโดยอัตโนมัติหรือไม่?

จะใช้ความgit pre-release hookช่วยเหลือหรือไม่?


1
ทำไมคุณไม่สร้างเชลล์สคริปต์ที่แก้ไข package.json ให้คอมมิทแล้วติดแท็กมัน?
gustavotkg

ใช่แล้วฮุกก่อนเปิดตัวจะเรียกใช้สคริปต์นั้นใช่ไหม
tUrG0n

คำตอบ:


94

npm versionอาจเป็นคำตอบที่ถูกต้อง เพียงเพื่อให้ทางเลือกหนึ่งที่ผมขอแนะนำให้ทำเสียงฮึดฮัดชน มันได้รับการดูแลโดยหนึ่งในคนจาก angular.js

การใช้งาน:

grunt bump
>> Version bumped to 0.0.2

grunt bump:patch
>> Version bumped to 0.0.3

grunt bump:minor
>> Version bumped to 0.1.0

grunt bump
>> Version bumped to 0.1.1

grunt bump:major
>> Version bumped to 1.0.0

หากคุณใช้เสียงฮึดฮัดแสดงความไม่พอใจมันอาจเป็นทางออกที่ง่ายที่สุด


12
และถ้าคุณใช้gulpjs : gulp-bump :)
GabLeRoux

ฉันเขียนรหัส Vik สำหรับเรื่องนี้ซึ่งกระแทก npm, Bower และอื่น ๆ ... ในบัดดลหนึ่ง: github.com/Wildhoney/Vik
Wildhoney

8
เหตุใดจึงต้องใช้ไลบรารีภายนอกเมื่อ npm มีฟังก์ชันนี้ในตัว
linuxdan

8
การใช้สิ่งเหล่านี้มีประโยชน์npm versionอย่างไร
Steve Bennett

3
@ConAntonakos ใช่ npm --no-git-tag-version version patchลองสิ่งที่ต้องการ
Tong Shen

165

คำตอบที่ถูกต้อง

ในการทำเช่นนั้นเพียงแค่npm version patch=)

คำตอบเก่าของฉัน

ไม่มีเป็นเบ็ดแรกในpre-release gitอย่างน้อยman githooksก็ไม่แสดงเลย

หากคุณกำลังใช้งานgit-extra( https://github.com/visionmedia/git-extras ) ตัวอย่างเช่นคุณสามารถใช้pre-releaseเบ็ดที่ใช้งานได้ซึ่งคุณสามารถดูได้ที่https://github.com/visionmedia/ Git-พิเศษ มันต้องการเพียง.git/hook/pre-release.shไฟล์ปฏิบัติการที่แก้ไขpackage.jsonไฟล์ของคุณ การคอมมิตการผลักและการแท็กจะกระทำโดยgit releaseคำสั่ง

หากคุณไม่ได้ใช้ส่วนขยายใด ๆgitคุณสามารถเขียนเชลล์สคริป (ฉันจะตั้งชื่อมันgit-release.sh) และกว่าที่คุณจะสามารถตั้งชื่อแทนได้git releaseด้วย:

git config --global alias.release '!sh path/to/pre-release.sh $1'

คุณสามารถกว่าการใช้งานที่จะดำเนินการgit release 0.4 path/to/pre-release.sh 0.4สคริปต์ของคุณสามารถแก้ไขpackage.jsonสร้างแท็กและส่งไปยังเซิร์ฟเวอร์


คุณสามารถแบ่งปันข้อมูลโค้ดของสคริปต์ที่มีลักษณะอย่างไร : D
tUrG0n

1
ตรวจสอบลิงค์นี้ออกgithub.com/visionmedia/git-extras/blob/master/bin/git-release
gustavotkg

ฉันใช้ repo คอมไพล์พิเศษของ visionmedia แต่git releaseไม่ได้อัปเดต package.json ตามลำดับ ... github.com/visionmedia/git-extras/issues/150 : D
tUrG0n

ดังนั้นเพียงแค่สร้าง.git/hooks/pre-release.shที่มี: echo -e "{\n\"version\": "$1"\n}" > package.jsonและลองใช้git release $version
gustavotkg

5
เป็นความเห็นที่นี่ npm version patchหรือnpm version 0.3.1 จะแก้มัน! คุณช่วยอัพเดตคำตอบของคุณได้ไหม? TY !!
tUrG0n

75

นี่คือสิ่งที่ฉันทำตามปกติกับโครงการของฉัน:

npm version patch
git add *;
git commit -m "Commit message"
git push
npm publish

บรรทัดแรกnpm version patchจะเพิ่มรุ่นแพทช์โดยที่ 1 (xx1 เพื่อ xx2) package.jsonใน จากนั้นคุณเพิ่มไฟล์ทั้งหมด - รวมถึงไฟล์package.jsonที่จุดนั้นถูกแก้ไข จากนั้นเป็นปกติgit commitและgit pushและในที่สุดก็npm publishจะเผยแพร่โมดูล

ฉันหวังว่ามันจะสมเหตุสมผล ...

Merc


9
เท่าที่ฉันสามารถบอกได้npm version patchกระทำตัวเอง; แต่จะผลักดันแท็กเพื่อ GitHub git push --tagsผมคิดว่าคุณยังจำเป็นที่จะต้อง
ChrisV

@ChrisV ถูกต้อง - npm version patchกระแทกหมายเลขรุ่นและยอมรับการเปลี่ยนแปลงทันที
Dan Esparza

2
@DanEsparza นี่อาจเป็นเรื่องการตั้งค่า npm version patchไม่ได้ทำอะไรเพื่อฉัน
Mordred

@Mordred Hmmm ... เป็นไปได้ ฉันไม่เห็นอะไรเลยในเอกสารการกำหนดค่าnpmเกี่ยวกับสิ่งนั้น แต่เป็นไปได้ไหมที่คุณไม่มีคอมไพล์ในเส้นทางหรืออะไร?
Dan Esparza

คอมไพล์ @DanEsparza npm versionแน่นอนในเส้นทางที่ผมกระทำจากโฟลเดอร์เดียวกันแน่นอนฉันวิ่ง
Mordred

29

เพื่อให้แนวทางที่เป็นปัจจุบันมากขึ้น

package.json

  "scripts": {
    "eslint": "eslint index.js",
    "pretest": "npm install",
    "test": "npm run eslint",
    "preversion": "npm run test",
    "version": "",
    "postversion": "git push && git push --tags && npm publish"
  }

จากนั้นคุณเรียกใช้:

npm version minor --force -m "Some message to commit"

ซึ่งจะ:

  1. ... ทำการทดสอบ ...

  2. เปลี่ยนpackage.jsonเป็นรุ่นรองถัดไป (เช่น: 1.8.1 เป็น 1.9.0)

  3. ผลักดันการเปลี่ยนแปลงของคุณ

  4. สร้างแท็ก git ใหม่และ

  5. เผยแพร่แพ็คเกจ npm ของคุณ

--forceคือการแสดงว่าใครเป็นเจ้านาย! เรื่องตลกโปรดดูhttps://github.com/npm/npm/issues/8620


3
นอกจากนี้คุณยังสามารถเพิ่มสคริปต์เช่นเดียวกับที่"deploy-minor": "npm version minor --force -m \"version %s\""คุณต้องจำไว้คือnpm run deploy-minor:)
Kristofor Carle

23

นอกจากนี้npm versionคุณยังสามารถใช้การ--no-git-tag-versionตั้งค่าสถานะหากคุณต้องการรุ่นชน แต่ไม่มีแท็กหรือการมอบหมายใหม่:

npm --no-git-tag-version version patch

https://docs.npmjs.com/cli/version


17

หากคุณใช้เส้นด้ายคุณสามารถใช้

yarn version --patch

การดำเนินการนี้จะเพิ่มpackage.jsonรุ่นด้วยการแก้ไข(0.0.x)กระทำและติดแท็กด้วยรูปแบบv0.0.0

ในทำนองเดียวกันคุณสามารถชนรุ่นรองหรือรุ่นใหญ่โดยใช้--minorหรือ--major

เมื่อผลักไปยังคอมไพล์ให้แน่ใจว่าคุณกดแท็กด้วย --follow-tags

git push --follow-tags

คุณยังสามารถสร้างสคริปต์ได้

    "release-it": "yarn version --patch && git push --follow-tags"

เพียงเรียกใช้โดยพิมพ์ yarn release-it


11

ฉันใช้แหบแห้งและgit-branch- คือ :

ณ วันที่ v1 +:

// package.json
{
  "husky": {
    "hooks": {
      "post-merge": "(git-branch-is master && npm version minor || 
  (git-branch-is dev && npm --no-git-tag-version version patch)",
    }
  }
}

ก่อนที่จะฮัสกี้ V1:

"scripts": {
  ...
  "postmerge": "(git-branch-is master && npm version minor || 
  (git-branch-is dev && npm --no-git-tag-version version patch)",
  ...
},

อ่านเพิ่มเติมเกี่ยวกับรุ่น npm

Webpack หรือ Vue.js

หากคุณใช้ webpack หรือ Vue.js คุณสามารถแสดงสิ่งนี้ได้ใน UI โดยใช้เวอร์ชัน auto inject - ปลั๊กอิน Webpack

NUXT

ในnuxt.config.js:

var WebpackAutoInject = require('webpack-auto-inject-version');

module.exports = {
  build: {
    plugins: [
      new WebpackAutoInject({
        // options
        // example:
        components: {
          InjectAsComment: false
        },
      }),
    ]
  },
}

ภายในtemplateตัวอย่างในส่วนท้ายของคุณ:

<p> All rights reserved © 2018 [v[AIV]{version}[/AIV]]</p>

ฉันชอบตัวเลือกที่แหบแห้งดีที่สุดแม้ว่าฉันจะไม่คิดว่ามันจะทำงานได้ดีกว่านี้อีกแล้ว ฉันไม่คิดว่ามี 'postmerge' อยู่แล้ว "pre-push" น่าจะเป็นตัวเลือกที่ดีที่สุด และ 'Git-สาขาคือ' ผลไม่ได้จริงๆการทำงานข้อผิดพลาดเนื่องจากพวกเขาออกมาและพื้นผิดพลาดโพสต์ทั้งหมด (ตั้งแต่มันตรวจสอบทั้งหลักและ dev ก็จะเกิดข้อผิดพลาดจากที่หนึ่งของพวกเขา)
ฟิล

@Phil คุณยังสามารถใช้งานpostmergeได้ แต่ตอนนี้post-mergeอยู่ในการกำหนดค่าhusky: {hooks:{}}แล้ว สิ่งใดที่คุณมีปัญหากับgit-branch-is?
Anima-t3d

มันจะผิดพลาดสำหรับฉันแทนที่จะวิ่ง ไม่ต้องกังวลแม้ว่าฉันได้จบลงไปกับตัวเลือกนี้: marketplace.visualstudio.com/...
ฟิล

1
@Phil ขอบคุณสำหรับการติดตาม ฉันเพิ่งลองรุ่นที่อัปเดตแล้วและไม่มีข้อผิดพลาดอาจมีบางอย่างผิดปกติกับคำสั่ง post-merge ของคุณเอง
Anima-t3d

5

ฉันต้องการเพิ่มความชัดเจนให้กับคำตอบที่คำถามนี้ได้รับ

ถึงแม้จะคิดว่ามีคำตอบบางส่วนที่สามารถแก้ปัญหาได้อย่างถูกต้องและจัดหาวิธีแก้ปัญหา แต่ก็ไม่ใช่คำตอบที่ถูกต้อง คำตอบที่ถูกต้องสำหรับคำถามนี้คือการใช้npm version

มีวิธีแก้ไขไฟล์ package.json โดยอัตโนมัติหรือไม่?

ใช่สิ่งที่คุณสามารถทำได้เพื่อให้สิ่งนี้เกิดขึ้นคือการเรียกใช้npm versionคำสั่งเมื่อจำเป็นคุณสามารถอ่านเพิ่มเติมได้ที่นี่เวอร์ชัน npmแต่การใช้งานพื้นฐานจะเป็นnpm version patchและจะเพิ่มลำดับที่ 3 ในpackage.jsonรุ่นของคุณ(1.0. X )

จะใช้ตะขอปล่อยก่อนคอมไพล์หรือไม่?

คุณสามารถกำหนดค่าให้เรียกใช้npm versionคำสั่งบนตะขอ pre-release ได้ตามต้องการ แต่นั่นก็ขึ้นอยู่กับว่าคุณต้องการหรือไม่ในไพพ์ CD / CI ของคุณ แต่ถ้าไม่มีnpm versionคำสั่งgit pre-releasehook จะไม่สามารถทำอะไรได้อย่างง่ายดาย กับpackage.json

สาเหตุที่npm versionเป็นคำตอบที่ถูกต้องคือ:

  1. หากผู้ใช้โดยใช้โครงสร้างโฟลเดอร์ที่เขามีpackage.jsonเขาใช้npmถ้าเขาใช้เขามีการเข้าถึงnpmnpm scripts
  2. หากเขามีสิทธิ์เข้าถึงnpm scriptsเขาจะสามารถเข้าถึงnpm versionคำสั่งได้
  3. การใช้คำสั่งนี้เขาไม่จำเป็นต้องติดตั้งอะไรเพิ่มเติมในคอมพิวเตอร์หรือไปป์ CD / CI ซึ่งในระยะยาวจะลดความพยายามในการบำรุงรักษาสำหรับโครงการและจะช่วยในการตั้งค่า

คำตอบอื่น ๆ ที่มีการเสนอเครื่องมืออื่น ๆ ไม่ถูกต้อง

gulp-bump ทำงานได้ แต่ต้องใช้แพ็คเกจเพิ่มเติมซึ่งสามารถสร้างปัญหาในระยะยาว (จุดที่ 3 ของคำตอบของฉัน)

grunt-bump ทำงานได้ แต่ต้องใช้แพ็คเกจเพิ่มเติมซึ่งสามารถสร้างปัญหาในระยะยาว (จุดที่ 3 ของคำตอบของฉัน)


2

ก่อนอื่นคุณต้องเข้าใจกฎสำหรับการอัปเกรดหมายเลขเวอร์ชัน คุณสามารถอ่านเพิ่มเติมเกี่ยวกับรุ่นความหมายได้ที่นี่

แต่ละรุ่นจะมีรุ่น xyz ที่กำหนดไว้เพื่อวัตถุประสงค์ที่แตกต่างกันดังแสดงด้านล่าง

  1. x - สำคัญเพิ่มขึ้นเมื่อคุณมีการเปลี่ยนแปลงที่สำคัญและมันเป็นความแตกต่างอย่างมากของการเปลี่ยนแปลงที่เกิดขึ้น
  2. y - เล็กน้อยเพิ่มขึ้นเมื่อคุณมีฟังก์ชั่นใหม่หรือการปรับปรุงเกิดขึ้น
  3. z - patch, เพิ่มค่านี้เมื่อคุณมีข้อผิดพลาดคงที่หรือยกเลิกการเปลี่ยนแปลงในเวอร์ชันก่อนหน้า

ในการรันสคริปต์คุณสามารถกำหนดได้ใน package.json ของคุณ

"script": {
    "buildmajor": "npm version major && ng build --prod",
    "buildminor": "npm version minor && ng build --prod",
    "buildpatch": "npm version patch && ng build --prod"
}

ในเทอร์มินัลของคุณคุณเพียงแค่เรียกใช้ npm ตามความต้องการของคุณเช่น

npm run buildpatch

หากรันใน git repo ค่าเริ่มต้น git-tag-version จะเป็นจริงและหากคุณไม่ต้องการทำเช่นนั้นคุณสามารถเพิ่มคำสั่งด้านล่างลงในสคริปต์ของคุณ:

--no-git-tag-version

สำหรับเช่น: "npm --no-git-tag-version version major && ng build --prod"


0

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

คุณสามารถใช้เครื่องมือนี้เพื่อเปลี่ยนเวอร์ชั่นใน package.json โดยอัตโนมัติโดยใช้ npm CLI (อธิบายไว้ที่นี่ )

นอกจากนี้มันสามารถสร้างการเปลี่ยนแปลงจากการกระทำเหล่านี้และยังมีเมนู (พร้อมเครื่องตรวจการสะกดคำสำหรับการส่งข้อความ) สำหรับการสร้างการกระทำตามประเภทการเปลี่ยนแปลง ฉันขอแนะนำให้ตรวจสอบและอ่านเอกสารเพื่อดูทุกสิ่งที่สามารถทำได้

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

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับเหตุผลสำหรับเครื่องมือโปรดเห็นนี้

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