perbarui versi package.json secara otomatis

183

Sebelum saya melakukan rilis kecil dan menandainya, saya ingin memperbarui package.json untuk mencerminkan versi baru dari program.

Apakah ada cara untuk mengedit file package.jsonsecara otomatis?

Apakah menggunakan git pre-release hookbantuan?

tUrG0n
sumber
1
Mengapa Anda tidak membuat skrip shell yang mengedit package.json, melakukan dan kemudian menandainya?
gustavotkg
ya jadi kait pra-rilis akan memanggil script itu kan?
tUrG0n

Jawaban:

94

npm versionmungkin jawaban yang benar. Sekedar memberi alternatif saya rekomendasikan grunt-bump . Itu dikelola oleh salah satu orang dari angular.js.

Pemakaian:

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

Jika Anda menggunakan gerutuan, itu mungkin solusi paling sederhana.

zirirco
sumber
12
Dan jika Anda menggunakan gulpjs : gulp -bump :)
GabLeRoux
Saya memberi kode Vik untuk ini, yang menabrak npm, Bower, dll ... dalam satu gerakan: github.com/Wildhoney/Vik
Wildhoney
8
mengapa menggunakan pustaka eksternal ketika npm memiliki fungsi ini bawaan?
linuxdan
8
Apa manfaat menggunakan ini npm version?
Steve Bennett
3
@ConAntonakos Ya. Coba sesuatu seperti npm --no-git-tag-version version patch.
Tong Shen
165

Jawaban benar

Untuk melakukannya, cukup npm version patch=)

Jawaban lama saya

pre-releaseAwalnya tidak ada kait di git. Setidaknya, man githookstidak menunjukkannya.

Jika Anda menggunakan git-extra( https://github.com/visionmedia/git-extras ), misalnya, Anda dapat menggunakan pre-releasepengait yang diterapkan olehnya, seperti yang Anda lihat di https://github.com/visionmedia/ git-extras / blob / master / bin / git-release . Diperlukan hanya .git/hook/pre-release.shfile yang dapat dieksekusi yang mengedit package.jsonfile Anda . Melakukan, mendorong dan memberi tag akan dilakukan oleh git releaseperintah.

Jika Anda tidak menggunakan ekstensi apa pun untuk git, Anda dapat menulis skrip shell (saya akan menamainya git-release.sh) dan daripada Anda dapat alias git releasedengan sesuatu seperti:

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

Anda bisa, daripada, menggunakan git release 0.4yang akan mengeksekusi path/to/pre-release.sh 0.4. Script Anda dapat mengedit package.json, membuat tag, dan mendorongnya ke server.

gustavotkg
sumber
dapatkah Anda membagikan potongan kode seperti apa bentuk skrip? : D
tUrG0n
saya benar-benar menggunakan repo git-extra visionmedia. Tetapi git releasetidak memperbarui package.json yang sesuai ... github.com/visionmedia/git-extras/issues/150 : D
tUrG0n
Jadi, buat saja yang .git/hooks/pre-release.shberisi: echo -e "{\n\"version\": "$1"\n}" > package.jsondan coba gunakangit release $version
gustavotkg
5
seperti yang Dikomentari di sini npm version patch atau npm version 0.3.1 akan menyelesaikannya! Bisakah Anda memperbarui jawaban Anda? ty !!
tUrG0n
75

Inilah yang biasanya saya lakukan dengan proyek saya:

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

Baris pertama npm version patch,, akan meningkatkan versi tambalan sebanyak 1 (xx1 ke xx2) pada package.json. Kemudian Anda menambahkan semua file - termasuk package.jsonyang pada saat itu telah dimodifikasi. Kemudian, biasa git commitdan git push, dan akhirnya npm publishmenerbitkan modul.

Saya harap ini masuk akal ...

Merc.

Merc
sumber
9
Sejauh yang saya tahu, npm version patchapakah komitmen itu sendiri; Namun, untuk mendorong tag ke github, saya pikir Anda juga perlu melakukannya git push --tags.
ChrisV
@ChrisV benar - npm version patchmenabrak nomor versi dan segera melakukan perubahan
Dan Esparza
2
@ DanEsparza Ini mungkin hal pengaturan. npm version patchtidak melakukan apa pun untuk saya.
Mordred
@Mordred Hmmm ... mungkin. Saya tidak melihat apa pun di npm config docs tentang itu, tetapi mungkinkah Anda tidak memiliki git di jalur Anda atau sesuatu?
Dan Esparza
@DanEsparza git sudah pasti di jalur saat saya komit dari folder yang sama persis yang saya jalankan npm version.
Mordred
29

Untuk memberikan pendekatan yang lebih terkini.

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"
  }

Maka Anda menjalankannya:

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

Yang mana akan:

  1. ... jalankan tes ...

  2. ubah package.jsonversi Anda ke versi minor berikutnya (mis: 1.8.1 ke 1.9.0)

  3. dorong perubahan Anda

  4. buat rilis tag git baru dan

  5. publikasikan paket npm Anda.

--forceadalah untuk menunjukkan siapa bosnya! Samping lelucon lihat https://github.com/npm/npm/issues/8620

Jonatas Walker
sumber
3
Anda juga dapat menambahkan skrip seperti yang "deploy-minor": "npm version minor --force -m \"version %s\""perlu Anda ingat adalah npm run deploy-minor:)
Kristofor Carle
23

Sebagai tambahan, npm versionAnda dapat menggunakan --no-git-tag-versionflag jika Anda menginginkan versi bump tetapi tidak ada tag atau komit baru:

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

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

Ikat aku
sumber
17

Jika Anda menggunakan benang, Anda dapat menggunakannya

yarn version --patch

Ini akan menambah package.jsonversi dengan tambalan (0.0.x), komit, dan menandainya dengan formatv0.0.0

Anda juga dapat menabrak versi minor atau mayor dengan menggunakan --minoratau--major

Saat mendorong ke git pastikan Anda juga mendorong tag --follow-tags

git push --follow-tags

Anda juga dapat membuat skrip untuk itu

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

Cukup jalankan dengan mengetik yarn release-it

Eric Kim
sumber
11

Saya menggunakan husky dan git-branch-is :

Pada husky 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)",
    }
  }
}

Sebelum ke husky V1:

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

Baca lebih lanjut tentang versi npm

Webpack atau Vue.js

Jika Anda menggunakan webpack atau Vue.js, Anda dapat menampilkan ini di UI menggunakan versi Auto inject - plugin Webpack

NUXT

Di nuxt.config.js:

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

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

Di dalam Anda templatemisalnya di footer:

<p> All rights reserved © 2018 [v[AIV]{version}[/AIV]]</p>
Anima-t3d
sumber
Saya suka opsi husky ini yang terbaik, meskipun saya tidak berpikir itu berfungsi seperti sekarang. saya tidak berpikir 'postmerge' ada, "pre-push" mungkin merupakan opsi terbaik. dan hasil 'git-branch-is' tidak benar-benar berfungsi karena mereka salah dan pada dasarnya merusak seluruh pos (karena memeriksa baik master dan dev, itu akan salah pada salah satu dari mereka)
Phil
@Phil Anda masih dapat menggunakan postmerge, tetapi sekarang post-mergedi dalam husky: {hooks:{}}konfigurasi. Masalah apa yang Anda miliki git-branch-is?
Anima-t3d
itu hanya akan kesalahan bagi saya daripada menjalankan. Namun jangan khawatir, saya akhirnya memilih opsi ini: marketplace.visualstudio.com/...
Phil
1
@ Phil terima kasih telah menindaklanjuti. Saya baru saja mencoba dengan versi terbaru dan saya tidak memiliki kesalahan, mungkin ada yang salah dengan perintah post-merge Anda sendiri.
Anima-t3d
5

Saya ingin menambahkan kejelasan pada jawaban yang didapat pertanyaan ini.

Meskipun ada beberapa jawaban di sini yang menangani masalah dengan benar dan memberikan solusi, mereka bukan jawaban yang benar. Jawaban yang benar untuk pertanyaan ini adalah menggunakannpm version

Apakah ada cara untuk mengedit file package.json secara otomatis?

Ya, apa yang dapat Anda lakukan untuk mewujudkan ini adalah dengan menjalankan npm versionperintah ketika diperlukan, Anda dapat membaca lebih lanjut tentang hal ini di sini versi npm , tetapi penggunaan dasar akan npm version patchdan itu akan menambahkan urutan 3 digit pada package.jsonversi Anda (1.0. X )

Apakah menggunakan hook pre-release git membantu?

Anda dapat mengonfigurasi untuk menjalankan npm versionperintah pada kait pra-rilis, sesuai kebutuhan, tetapi itu tergantung apakah itu yang Anda butuhkan atau tidak di dalam pipa CD / CI Anda, tetapi tanpa npm versionperintah, git pre-releasekait tidak dapat melakukan apa pun "dengan mudah" denganpackage.json

Alasan mengapa npm versionjawaban yang benar adalah sebagai berikut:

  1. Jika pengguna menggunakan struktur folder di mana ia memiliki package.jsondia menggunakan npmjika dia menggunakan npmdia memiliki akses ke npm scripts.
  2. Jika dia memiliki akses ke npm scriptsdia memiliki akses ke npm versionperintah.
  3. Menggunakan perintah ini ia tidak perlu menginstal apa pun lagi di komputer atau pipa CD / CI yang dalam jangka panjang akan mengurangi upaya pemeliharaan untuk proyek tersebut, dan akan membantu dengan pengaturan

Jawaban lain di mana alat lain diusulkan tidak benar.

gulp-bump berfungsi tetapi membutuhkan paket tambahan lain yang dapat menciptakan masalah dalam jangka panjang (poin 3 dari jawaban saya)

grunt-bump berfungsi tetapi membutuhkan paket tambahan lain yang dapat menciptakan masalah dalam jangka panjang (poin 3 dari jawaban saya)

Alejandro Vales
sumber
2

Pertama, Anda perlu memahami aturan untuk meningkatkan nomor versi. Anda dapat membaca lebih lanjut tentang versi semantik di sini.

Setiap versi akan memiliki versi xyz di mana ia mendefinisikan untuk tujuan yang berbeda seperti yang ditunjukkan di bawah ini.

  1. x - mayor, naikkan ini ketika Anda memiliki perubahan besar dan ini adalah perbedaan besar dari perubahan yang terjadi.
  2. y - minor, lanjutkan ini ketika Anda memiliki fungsi atau peningkatan baru terjadi.
  3. z - tambal, naikkan ini saat bug Anda diperbaiki atau kembalikan perubahan pada versi sebelumnya.

Untuk menjalankan skrip, Anda dapat mendefinisikannya di package.json Anda.

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

Di terminal Anda, Anda hanya perlu menjalankan npm sesuai dengan kebutuhan Anda seperti

npm run buildpatch

Jika menjalankannya di git repo, versi git-tag-default adalah benar dan jika Anda tidak ingin melakukannya, Anda dapat menambahkan perintah di bawah ini ke dalam skrip Anda:

--no-git-tag-version

untuk misalnya: "npm --no-git-tag-version version major && ng build --prod"

Mnemo
sumber
0

Saya telah membuat alat yang dapat menyelesaikan versi semantik otomatis berdasarkan tag dalam pesan komit, yang dikenal sebagai tipe perubahan. Ini erat mengikuti Konvensi Pesan Komit Sudut bersama dengan Spesifikasi Versi Semantik.

Anda bisa menggunakan alat ini untuk secara otomatis mengubah versi di package.json menggunakan npm CLI (ini dijelaskan di sini ).

Selain itu, ia dapat membuat log log dari komit ini dan juga memiliki menu (dengan pemeriksa ejaan untuk pesan komit) untuk membuat komit berdasarkan pada jenis perubahan. Saya sangat merekomendasikan memeriksanya dan membaca dokumen untuk melihat segala sesuatu yang dapat diselesaikan dengan itu.

Saya menulis alat ini karena saya tidak dapat menemukan apa pun yang sesuai dengan kebutuhan saya untuk CICD Pipeline saya untuk mengotomatisasi versi semantik. Saya lebih suka fokus pada apa perubahan yang sebenarnya daripada apa versi seharusnya dan di situlah alat saya menghemat hari.

Untuk informasi lebih lanjut tentang alasan untuk alat ini, silakan lihat ini .

Daniel Eagle
sumber