actualizar la versión package.json automáticamente

183

Antes de hacer un pequeño lanzamiento y etiquetarlo, me gustaría actualizar el package.json para reflejar la nueva versión del programa.

¿Hay alguna manera de editar el archivo package.jsonautomáticamente?

¿Usaría una git pre-release hookayuda?

tUrG0n
fuente
1
¿Por qué no crea un script de shell que edita package.json, se compromete y luego lo etiqueta?
gustavotkg
sí, entonces el gancho de prelanzamiento invocaría ese script ¿verdad?
tUrG0n

Respuestas:

94

npm versionEs probablemente la respuesta correcta. Solo para dar una alternativa, recomiendo grunt-bump . Es mantenido por uno de los chicos de angular.js.

Uso:

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

Si de todos modos está usando gruñido, podría ser la solución más simple.

zemirco
fuente
12
Y si estás usando gulpjs : gulp-bump :)
GabLeRoux
Codifiqué a Vik para esto, que golpea npm, Bower, etc ... de una sola vez: github.com/Wildhoney/Vik
Wildhoney
8
¿Por qué usar bibliotecas externas cuando npm tiene esta funcionalidad incorporada?
linuxdan
8
¿Cuál es el beneficio de usar esto npm version?
Steve Bennett
3
@ConAntonakos Sí. Intenta algo como npm --no-git-tag-version version patch.
Tong Shen
165

Respuesta correcta

Para hacerlo, solo npm version patch=)

Mi vieja respuesta

No hay pre-releasegancho originalmente en git. Al menos, man githooksno lo muestra.

Si está usando git-extra( https://github.com/visionmedia/git-extras ), por ejemplo, puede usar un pre-releasegancho implementado por él, como puede ver en https://github.com/visionmedia/ git-extras / blob / master / bin / git-release . Solo se necesita un .git/hook/pre-release.sharchivo ejecutable que edite su package.jsonarchivo. El git releasecomando confirmará, empujará y etiquetará .

Si no está usando ninguna extensión para git, puede escribir un script de shell (lo nombraré git-release.sh) y luego puede usar un alias git releasecon algo como:

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

Puede, que, usar git release 0.4cual ejecutará path/to/pre-release.sh 0.4. Su secuencia de comandos puede editar package.json, crear la etiqueta y enviarla al servidor.

gustavotkg
fuente
¿podría compartir un fragmento de código de cómo se vería el script? : D
tUrG0n
De hecho, uso el repositorio git-extra de visionmedia. Pero git releaseno actualiza el package.json en consecuencia ... github.com/visionmedia/git-extras/issues/150 : D
tUrG0n
Entonces, solo crea que .git/hooks/pre-release.shcontenga: echo -e "{\n\"version\": "$1"\n}" > package.jsone intenta usargit release $version
gustavotkg el
55
como se comentó aquí npm version patch o npm version 0.3.1 lo resolverá! ¿Podría actualizar su respuesta en consecuencia? ty !!
tUrG0n
75

Esto es lo que normalmente hago con mis proyectos:

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

La primera línea, npm version patchaumentará la versión del parche en 1 (xx1 a xx2) en package.json. Luego agrega todos los archivos, incluido el package.jsonque en ese momento se ha modificado. Luego, lo habitual git commity git push, y finalmente npm publishpublicar el módulo.

Espero que esto tenga sentido...

Merc.

Merc
fuente
9
Por lo que puedo decir, npm version patchel compromiso en sí mismo; sin embargo, para empujar la etiqueta a github, creo que también debes hacerlo git push --tags.
ChrisV
@ChrisV es correcto: npm version patchtopa el número de versión e inmediatamente confirma el cambio
Dan Esparza
2
@DanEsparza Esto podría ser algo de configuración. npm version patchNo comete nada por mí.
Mordred
@Mordred Hmmm ... posiblemente. No veo nada en los documentos de configuración de npm sobre eso, pero ¿podría ser que no tienes git en tu camino o algo así?
Dan Esparza
@DanEsparza git definitivamente está en el camino ya que me comprometo desde la misma carpeta que ejecuto npm version.
Mordred
29

Para dar un enfoque más actualizado.

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

Entonces lo ejecutas:

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

Que lo hará:

  1. ... ejecuta pruebas ...

  2. cambie su package.jsona una próxima versión menor (por ejemplo: 1.8.1 a 1.9.0)

  3. empuja tus cambios

  4. crear una nueva versión de etiqueta git y

  5. publica tu paquete npm.

--forcees mostrar quién es el jefe! Bromas a un lado ver https://github.com/npm/npm/issues/8620

Jonatas Walker
fuente
3
También puede agregar un script como "deploy-minor": "npm version minor --force -m \"version %s\""para que todo lo que necesite recordar sea npm run deploy-minor:)
Kristofor Carle
23

Como complemento npm version, puede usar el --no-git-tag-versionindicador si desea un aumento de versión pero sin etiqueta o una nueva confirmación:

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

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

Tieme
fuente
17

Si usa hilo, puede usar

yarn version --patch

Esto incrementará la package.jsonversión por parche (0.0.x), confirmación y la etiquetará con formatov0.0.0

Del mismo modo, puede topar versiones menores o mayores utilizando --minoro--major

Al presionar para git, asegúrese de presionar también las etiquetas con --follow-tags

git push --follow-tags

También puedes crear un script para ello

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

Simplemente ejecútalo escribiendo yarn release-it

Eric Kim
fuente
11

Estoy usando husky y git-branch-is :

A partir de 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)",
    }
  }
}

Antes de Husky V1:

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

Leer más sobre la versión npm

Webpack o Vue.js

Si está utilizando webpack o Vue.js, puede mostrar esto en la interfaz de usuario utilizando la versión de inyección automática: complemento de Webpack

NUXT

En nuxt.config.js:

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

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

Dentro de su templatepor ejemplo en el pie de página:

<p> All rights reserved © 2018 [v[AIV]{version}[/AIV]]</p>
Anima-t3d
fuente
Me gusta más esta opción ronca, aunque ya no creo que funcione como es. No creo que exista 'postmerge', "pre-push" es probablemente la mejor opción. y los resultados de 'git-branch-is' realmente no funcionan ya que se equivocan y básicamente bloquean toda la publicación (ya que está comprobando tanto master como dev, se equivocará en uno de ellos)
Phil
@ Phil Todavía puede usar postmerge, pero ahora está post-mergedentro de la husky: {hooks:{}}configuración. ¿Qué problema tienes con git-branch-is?
Anima-t3d
simplemente me daría un error en lugar de ejecutarlo. Sin embargo, no se preocupe, terminé con esta opción: marketplace.visualstudio.com/…
Phil
1
@ Phil gracias por seguirnos. Acabo de probar con la versión actualizada y no tengo errores, tal vez algo está mal con su propio comando post-fusión.
Anima-t3d
5

Quiero agregar algo de claridad a las respuestas que recibió esta pregunta.

Aunque aquí hay algunas respuestas que abordan adecuadamente el problema y brindan una solución, no son las correctas. La respuesta correcta a esta pregunta es usarnpm version

¿Hay alguna manera de editar el archivo package.json automáticamente?

Sí, lo que puede hacer para que esto suceda es ejecutar el npm versioncomando cuando sea necesario, puede leer más sobre esto aquí versión npm , pero el uso base sería npm version patchy agregaría el orden de 3 dígitos en su package.jsonversión (1.0. X )

¿Usaría un gancho de prelanzamiento git?

Puede configurar para ejecutar el npm versioncomando en el gancho de prelanzamiento, según lo necesite, pero eso depende de si eso es lo que necesita o no en su tubería de CD / CI, pero sin el npm versioncomando un git pre-releasegancho no puede hacer nada "fácilmente" con elpackage.json

La razón por npm versionla cual es la respuesta correcta es la siguiente:

  1. Si el usuario está usando una estructura de carpetas en la que tiene un archivo package.jsonque está usando, npmsi está usando npm, tiene acceso al npm scripts.
  2. Si tiene acceso a npm scriptsél tiene acceso a lanpm version comando.
  3. Al usar este comando, no necesita instalar nada más en su computadora o tubería de CD / CI que a largo plazo reducirá el esfuerzo de mantenimiento para el proyecto y ayudará con la configuración

Las otras respuestas en las que se proponen otras herramientas son incorrectas.

gulp-bump funciona pero requiere otro paquete adicional que podría crear problemas a largo plazo (punto 3 de mi respuesta)

grunt-bump funciona pero requiere otro paquete adicional que podría crear problemas a largo plazo (punto 3 de mi respuesta)

Alejandro Vales
fuente
2

Primero, debe comprender las reglas para actualizar el número de versión. Puedes leer más sobre la versión semántica aquí.

Cada versión tendrá una versión xyz donde se define para diferentes propósitos como se muestra a continuación.

  1. x - mayor, sube esto cuando tienes cambios importantes y es una gran discrepancia de cambios ocurridos.
  2. y - menor, sube esto cuando tiene una nueva funcionalidad o mejora.
  3. z - parche, suba esto cuando tenga errores corregidos o revierta los cambios en la versión anterior.

Para ejecutar los scripts, puede definirlo en su package.json.

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

En su terminal, solo necesita ejecutar npm según sus necesidades como

npm run buildpatch

Si lo ejecuta en git repo, la versión predeterminada de git-tag-true es verdadera y si no desea hacerlo, puede agregar el siguiente comando en sus scripts:

--no-git-tag-version

por ejemplo: "npm --no-git-tag-version version major && ng build --prod"

Mnemo
fuente
0

He creado una herramienta que puede realizar versiones semánticas automáticas basadas en las etiquetas en los mensajes de confirmación, conocidos como tipos de cambio. Esto sigue de cerca la Convención de mensajes de confirmación angular junto con la Especificación de versiones semánticas.

Puede usar esta herramienta para cambiar automáticamente la versión en el package.json usando la CLI de npm (esto se describe aquí ).

Además, puede crear un registro de cambios a partir de estas confirmaciones y también tiene un menú (con un corrector ortográfico para mensajes de confirmación) para crear confirmaciones basadas en el tipo de cambio. Recomiendo consultarlo y leer documentos para ver todo lo que se puede lograr con él.

Escribí la herramienta porque no pude encontrar nada que se adaptara a mis necesidades para que mi CICD Pipeline automatizara las versiones semánticas. Prefiero centrarme en cuáles son los cambios reales en lugar de cuál debería ser la versión y ahí es donde mi herramienta salva el día.

Para obtener más información sobre la justificación de la herramienta, consulte esto .

Daniel Eagle
fuente