Aktualisieren Sie die package.json-Version automatisch

180

Bevor ich eine kleine Version mache und sie tagge, möchte ich die package.json aktualisieren, um die neue Version des Programms widerzuspiegeln.

Gibt es eine Möglichkeit, die Datei package.jsonautomatisch zu bearbeiten ?

Würde ich eine git pre-release hookHilfe benutzen ?

tUrG0n
quelle
1
Warum erstellen Sie kein Shell-Skript, das package.json bearbeitet, festschreibt und dann markiert?
Gustavotkg
Ja, der Pre-Release-Hook würde dieses Skript aufrufen, oder?
tUrG0n

Antworten:

93

npm versionist wahrscheinlich die richtige Antwort. Nur um eine Alternative zu geben, empfehle ich Grunt-Bump . Es wird von einem der Jungs von angle.js gepflegt.

Verwendung:

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

Wenn Sie trotzdem grunzen, ist dies möglicherweise die einfachste Lösung.

Zemirco
quelle
11
Und wenn Sie Gulpjs verwenden : Gulp-Bump :)
GabLeRoux
Ich habe Vik dafür codiert, was auf einen Schlag npm, Bower usw. stößt: github.com/Wildhoney/Vik
Wildhoney
8
Warum externe Bibliotheken verwenden, wenn in npm diese Funktionalität integriert ist?
Linuxdan
8
Was ist der Vorteil dieser Verwendung npm version?
Steve Bennett
3
@ ConAntonakos Ja. Versuchen Sie etwas wie npm --no-git-tag-version version patch.
Tong Shen
163

Richtige Antwort

Dazu einfach npm version patch=)

Meine alte Antwort

Es gibt pre-releaseursprünglich keinen Haken in git. Zumindest zeigt man githookses nicht.

Wenn Sie beispielsweise git-extra( https://github.com/visionmedia/git-extras ) verwenden, können Sie einen pre-releasevon ihm implementierten Hook verwenden, wie Sie unter https://github.com/visionmedia/ sehen können. Git-Extras / Blob / Master / Bin / Git-Release . Es wird nur eine .git/hook/pre-release.shausführbare Datei benötigt, die Ihre package.jsonDatei bearbeitet . Das Festschreiben, Drücken und Markieren erfolgt über den git releaseBefehl.

Wenn Sie keine Erweiterung für verwenden git, können Sie ein Shell-Skript schreiben (ich werde es benennen git-release.sh) und dann einen Alias ​​für git releaseFolgendes erstellen:

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

Sie können dann verwenden, git release 0.4was ausgeführt wird path/to/pre-release.sh 0.4. Ihr Skript kann package.jsondas Tag bearbeiten , erstellen und auf den Server übertragen.

gustavotkg
quelle
Könnten Sie einen Code-Ausschnitt davon teilen, wie das Skript aussehen würde? : D
tUrG0n
1
Überprüfen Sie diesen Link aus github.com/visionmedia/git-extras/blob/master/bin/git-release
gustavotkg
Ich benutze tatsächlich Visionmedias Git-Extra-Repo. Aber git releaseaktualisiert den package.json entsprechend ... github.com/visionmedia/git-extras/issues/150 : D
tUrG0n
Also, erstellen Sie einfach .git/hooks/pre-release.shmit: echo -e "{\n\"version\": "$1"\n}" > package.jsonund versuchen Sie es mitgit release $version
gustavotkg
5
wie hier kommentiert npm version patchoder npm version 0.3.1 wird es lösen! Könnten Sie Ihre Antwort entsprechend aktualisieren? ty !!
tUrG0n
75

Das mache ich normalerweise mit meinen Projekten:

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

In der ersten Zeile npm version patchwird die Patch-Version um 1 (xx1 bis xx2) Zoll erhöht package.json. Anschließend fügen Sie alle Dateien hinzu - einschließlich package.jsonder Dateien, die zu diesem Zeitpunkt geändert wurden. Dann das übliche git commitund git pushschließlich npm publishdas Modul veröffentlichen.

Ich hoffe das macht Sinn...

Merc.

Merc
quelle
9
Soweit ich das beurteilen kann, npm version patchbegeht sich das Commit selbst; Um das Tag auf Github zu verschieben, müssen Sie dies jedoch auch tun git push --tags.
ChrisV
@ ChrisV ist korrekt - npm version patchstößt die Versionsnummer an und
Dan Esparza
2
@ DanEsparza Dies könnte eine Einstellung sein. npm version patchlegt nichts für mich fest.
Mordred
@ Mordred Hmmm ... möglicherweise. Ich sehe nichts in den npm-Konfigurationsdokumenten darüber, aber könnte es sein, dass Sie keinen Git in Ihrem Pfad haben oder so?
Dan Esparza
@DanEsparza git ist definitiv im Pfad, da ich genau denselben Ordner festschreibe, den ich ausführe npm version.
Mordred
28

Um einen aktuelleren Ansatz zu geben.

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

Dann führen Sie es aus:

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

Welches wird:

  1. ... Tests durchführen ...

  2. Ändern Sie Ihre package.jsonzu einer nächsten Nebenversion (zB: 1.8.1 bis 1.9.0)

  3. Schieben Sie Ihre Änderungen

  4. Erstellen Sie eine neue Git-Tag-Version und

  5. Veröffentlichen Sie Ihr npm-Paket.

--forceist zu zeigen, wer der Boss ist! Witze beiseite siehe https://github.com/npm/npm/issues/8620

Jonatas Walker
quelle
3
Sie können auch ein Skript hinzufügen, "deploy-minor": "npm version minor --force -m \"version %s\""so dass Sie sich nur an npm run deploy-minor:) erinnern müssen
Kristofor Carle
22

Als Ergänzung npm versionkönnen Sie das --no-git-tag-versionFlag verwenden, wenn Sie einen Versions-Bump, aber kein Tag oder ein neues Commit wünschen:

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

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

Tieme
quelle
17

Wenn Sie Garn verwenden, können Sie verwenden

yarn version --patch

Dadurch wird die package.jsonVersion um Patches erhöht (0.0.x), festgeschrieben und mit dem Format versehenv0.0.0

Ebenso können Sie kleinere oder größere Versionen mit verwenden --minor oder--major

Stellen Sie beim Drücken auf Git sicher, dass Sie auch die Tags mit drücken --follow-tags

git push --follow-tags

Sie können auch ein Skript dafür erstellen

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

Führen Sie es einfach durch Eingabe aus yarn release-it

Eric Kim
quelle
10

Ich benutze Husky und Git-Branch- Is :

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

Vor Husky V1:

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

Lesen Sie mehr über die npm-Version

Webpack oder Vue.js.

Wenn Sie webpack oder Vue.js verwenden, können Sie dies in der Benutzeroberfläche mithilfe der automatischen Injektionsversion - Webpack-Plugin anzeigen

NUXT

In nuxt.config.js:

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

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

In Ihrem templatezum Beispiel in der Fußzeile:

<p> All rights reserved © 2018 [v[AIV]{version}[/AIV]]</p>
Anima-t3d
quelle
Ich mag diese Husky-Option am besten, obwohl ich nicht denke, dass sie so funktioniert, wie sie ist. Ich glaube nicht, dass 'Postmerge' existiert, "Pre-Push" ist wahrscheinlich die beste Option. und die 'git-branch-is'-Ergebnisse funktionieren nicht wirklich, da sie fehlerhaft sind und im Grunde den gesamten Beitrag zum Absturz bringen (da sowohl Master als auch Entwickler überprüft werden, tritt bei einem von ihnen ein Fehler auf)
Phil
@Phil Sie können weiterhin verwenden postmerge, aber es befindet sich jetzt post-mergein der husky: {hooks:{}}Konfiguration. Mit welchem ​​Problem haben Sie git-branch-is?
Anima-t3d
es würde nur für mich fehlerhaft sein, anstatt zu rennen. Keine Sorge, am Ende habe ich mich für diese Option entschieden: marketplace.visualstudio.com/…
Phil
1
@Phil danke für das Follow-up. Ich habe es gerade mit der aktualisierten Version versucht und habe keine Fehler. Vielleicht stimmt etwas mit Ihrem Post-Merge-Befehl nicht.
Anima-t3d
5

Ich möchte den Antworten auf diese Frage etwas Klarheit verleihen.

Auch wenn es hier einige Antworten gibt, die das Problem richtig angehen und eine Lösung bieten, sind sie nicht die richtigen. Die richtige Antwort auf diese Frage ist zu verwendennpm version

Gibt es eine Möglichkeit, die Datei package.json automatisch zu bearbeiten?

Ja, was Sie tun können, um dies zu erreichen, ist, den npm versionBefehl bei Bedarf auszuführen. Sie können hier mehr darüber lesen. Npm-Version , aber die Basisverwendung wäre npm version patchund es würde die 3. Ziffernreihenfolge zu Ihrer package.jsonVersion hinzufügen (1.0. X ).

Würde die Verwendung eines Git-Pre-Release-Hakens helfen?

Sie können konfigurieren, dass der npm versionBefehl nach Bedarf auf dem Pre-Release-Hook ausgeführt wird. Dies hängt jedoch davon ab, ob Sie dies in Ihrer CD / CI-Pipe benötigen oder nicht. Ohne den npm versionBefehl kann ein git pre-releaseHook jedoch nichts "leichtes" ausführen. mit dempackage.json

Der Grund npm versionfür die richtige Antwort ist folgender:

  1. Wenn der Benutzer eine Ordnerstruktur verwendet, in der er eine hat, die package.jsoner verwendet, npmwenn er sie verwendet npm, hat er Zugriff auf die npm scripts.
  2. Wenn er Zugang zu hat npm scripts, hat er Zugang zunpm version Befehl.
  3. Mit diesem Befehl muss er nichts mehr in seinem Computer oder seiner CD / CI-Pipe installieren, was langfristig den Wartbarkeitsaufwand für das Projekt verringert und bei der Einrichtung hilft

Die anderen Antworten, in denen andere Tools vorgeschlagen werden, sind falsch.

gulp-bump funktioniert, erfordert aber ein weiteres zusätzliches Paket, das langfristig zu Problemen führen kann (Punkt 3 meiner Antwort)

grunt-bump funktioniert, erfordert aber ein weiteres zusätzliches Paket, das langfristig zu Problemen führen kann (Punkt 3 meiner Antwort)

Alejandro Vales
quelle
2

Zunächst müssen Sie die Regeln für die Aktualisierung der Versionsnummer verstehen. Sie können mehr über die semantische Version lesen hier.

Jede Version hat eine xyz-Version, in der sie für verschiedene Zwecke definiert wird (siehe unten).

  1. x - major, dies ist der Fall, wenn Sie größere Änderungen vorgenommen haben und eine große Diskrepanz zwischen den aufgetretenen Änderungen besteht.
  2. y - Moll, dies ist der Fall, wenn neue Funktionen oder Verbesserungen aufgetreten sind.
  3. z - Patch, dies, wenn Sie Fehler behoben haben oder Änderungen an früheren Versionen rückgängig machen.

Um die Skripte auszuführen, können Sie sie in Ihrer package.json definieren.

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

In Ihrem Terminal müssen Sie nur npm entsprechend Ihren Anforderungen wie ausführen

npm run buildpatch

Wenn Sie es in git repo ausführen, ist die Standardversion von git-tag true. Wenn Sie dies nicht möchten, können Sie den folgenden Befehl in Ihre Skripte einfügen:

--no-git-tag-version

für zB: "npm --no-git-tag-version version major && ng build --prod"

Mnemo
quelle
0

Ich habe ein Tool erstellt , das eine automatische semantische Versionierung basierend auf den Tags in Festschreibungsnachrichten durchführen kann, die als Änderungstypen bezeichnet werden. Dies folgt eng der Angular Commit Message Convention zusammen mit der Semantic Versioning Specification.

Mit diesem Tool können Sie die Version in package.json mithilfe der npm-CLI automatisch ändern (dies wird hier beschrieben ).

Darüber hinaus kann es aus diesen Commits ein Änderungsprotokoll erstellen und verfügt über ein Menü (mit einer Rechtschreibprüfung für Commit-Nachrichten) zum Erstellen von Commits basierend auf dem Änderungstyp. Ich empfehle dringend, es auszuprobieren und in den Dokumenten zu lesen, um alles zu sehen, was damit erreicht werden kann.

Ich habe das Tool geschrieben, weil ich nichts gefunden habe, das meinen Anforderungen an meine CICD-Pipeline zur Automatisierung der semantischen Versionierung entsprach. Ich möchte mich lieber auf die tatsächlichen Änderungen konzentrieren als auf die Version, und dort spart mein Tool den Tag.

Weitere Informationen zu den Gründen für das Tool finden Sie hier .

Daniel Eagle
quelle