atualize a versão package.json automaticamente

183

Antes de fazer um lançamento pequeno e marcá-lo, gostaria de atualizar o package.json para refletir a nova versão do programa.

Existe uma maneira de editar o arquivo package.jsonautomaticamente?

Usando uma git pre-release hookajuda?

tUrG0n
fonte
1
Por que você não cria um shell script que edita package.json, confirma e depois o marca?
Gustavotkg 31/10/12
Sim, então o gancho de pré-lançamento invocaria esse script, certo?
tUrG0n

Respostas:

94

npm versionprovavelmente é a resposta correta. Só para dar uma alternativa, eu recomendo o grunhido . É mantido por um dos caras do 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

Se você estiver usando o grunhido de qualquer maneira, pode ser a solução mais simples.

zemirco
fonte
12
E se você estiver usando gulpjs : trago-galo :)
GabLeRoux
I codificado Vik para isso, o que eleva npm, Bower, etc ... em uma só penada: github.com/Wildhoney/Vik
Wildhoney
8
por que usar bibliotecas externas quando o npm tem essa funcionalidade incorporada?
Linuxdan 9/12/2015
8
Qual é o benefício de usá-los npm version?
21316 Steve Bennett
3
@ConAntonakos Sim. Tente algo parecido npm --no-git-tag-version version patch.
Tong Shen
165

Resposta correta

Para fazer isso, apenas npm version patch=)

Minha antiga resposta

Não há pre-releasegancho originalmente em git. Pelo menos, man githooksnão mostra isso.

Se você estiver usando git-extra( https://github.com/visionmedia/git-extras ), por exemplo, poderá usar um pre-releasegancho implementado por ele, como você pode ver em https://github.com/visionmedia/ git-extras / blob / master / bin / git-release . É necessário apenas um .git/hook/pre-release.sharquivo executável que edite seu package.jsonarquivo. A confirmação, envio e marcação serão feitos pelo git releasecomando.

Se você não estiver usando nenhuma extensão git, poderá escrever um shell script (eu o nomeio git-release.sh) e, em seguida, aliasá-lo git releasecom algo como:

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

Você pode, então, usar o git release 0.4que será executado path/to/pre-release.sh 0.4. Seu script pode editar package.json, criar a tag e enviá-la ao servidor.

gustavotkg
fonte
você poderia compartilhar um trecho de código de como seria o script? : D
tUrG0n
Na verdade, eu uso o repositório git-extra do visionmedia. Mas git releasenão atualiza o package.json de acordo ... github.com/visionmedia/git-extras/issues/150 : D
tUrG0n
Então, basta criar .git/hooks/pre-release.shcontendo: echo -e "{\n\"version\": "$1"\n}" > package.jsone tente usargit release $version
gustavotkg
5
como comentado aqui npm version patch ou npm version 0.3.1 vai resolvê-lo! Você poderia atualizar sua resposta de acordo? ty !!
tUrG0n
75

Isto é o que eu normalmente faço com meus projetos:

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

A primeira linha npm version patch,, aumentará a versão do patch em 1 (xx1 a xx2) em package.json. Em seguida, você adiciona todos os arquivos - incluindo os package.jsonque foram modificados naquele momento. Em seguida, o habitual git commite git push, e, finalmente, npm publishpublicar o módulo.

Espero que isto faça sentido...

Merc.

Merc
fonte
9
Tanto quanto posso dizer, npm version patcho próprio commit; no entanto, para enviar a tag para o github, acho que você também precisa git push --tags.
ChrisV
@ChrisV está correto - npm version patchbate o número da versão e imediatamente confirma a alteração
Dan Esparza
2
@DanEsparza Isso pode ser uma coisa de configuração. npm version patchnão comete nada para mim.
Mordred #
@Mordred Hmmm ... possivelmente. Não vejo nada nos documentos de configuração do npm sobre isso, mas será que você não tem o git no caminho ou algo assim?
21815 Dan Esparza
O @DanEsparza git está definitivamente no caminho, pois eu confirmo exatamente da mesma pasta que corro npm version.
Mordred
29

Para fornecer uma abordagem mais atualizada.

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

Então você o executa:

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

Qual irá:

  1. ... executar testes ...

  2. mude package.jsonpara uma próxima versão secundária (por exemplo: 1.8.1 a 1.9.0)

  3. empurre suas mudanças

  4. crie uma nova versão da tag git e

  5. publique seu pacote npm.

--forceé mostrar quem é o chefe! Piadas à parte, consulte https://github.com/npm/npm/issues/8620

Jonatas Walker
fonte
3
Você também pode adicionar um script como "deploy-minor": "npm version minor --force -m \"version %s\""isso tudo que você precisa lembrar é npm run deploy-minor:)
Kristofor Carle
23

Como complemento, npm versionvocê pode usar o --no-git-tag-versionsinalizador se desejar um aumento de versão, mas nenhuma tag ou uma nova confirmação:

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

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

Me amarre
fonte
17

Se você estiver usando fio, você pode usar

yarn version --patch

Isso incrementará a package.jsonversão por correção (0.0.x), confirmação e marcação com o formatov0.0.0

Da mesma forma, você pode encontrar a versão secundária ou secundária usando --minorou--major

Ao pressionar para o git, certifique-se de também enviar as tags com --follow-tags

git push --follow-tags

Você também pode criar um script para ele

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

Basta executá-lo digitando yarn release-it

Eric Kim
fonte
11

Estou usando husky e git-branch-is :

A partir do 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 da V1 rouca:

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

Leia mais sobre a versão npm

Webpack ou Vue.js

Se você estiver usando o webpack ou o Vue.js, poderá exibi-lo na interface do usuário usando a versão Injetar automaticamente - plugin Webpack

NUXT

Em nuxt.config.js:

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

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

Dentro do seu templatepor exemplo no rodapé:

<p> All rights reserved © 2018 [v[AIV]{version}[/AIV]]</p>
Anima-t3d
fonte
Eu gosto mais dessa opção rouca, embora eu não ache que funcione mais. Eu não acho que exista "pós-fusão", "pré-envio" é provavelmente a melhor opção. e os resultados 'git-branch-is' realmente não funcionam, pois eles apresentam erros e basicamente interrompem toda a postagem (uma vez que está verificando o mestre e o desenvolvedor, ocorrerá um erro)
Phil
@ Phil Você ainda pode usar postmerge, mas agora está post-mergedentro da husky: {hooks:{}}configuração. Que problema você tem git-branch-is?
Anima-t3d 8/09/19
seria apenas um erro para mim em vez de executar. Não se preocupe, porém, acabei optando por esta opção: marketplace.visualstudio.com/…
Phil #
1
@ Phil obrigado pelo acompanhamento. Eu apenas tentei com a versão atualizada e não tenho erros, talvez algo esteja errado com o seu próprio comando pós-mesclagem.
Anima-t3d 9/09/19
5

Quero acrescentar um pouco de clareza às respostas que esta pergunta obteve.

Mesmo pensando que existem algumas respostas aqui que abordam adequadamente o problema e fornecem uma solução, elas não são as corretas. A resposta correta para esta pergunta é usarnpm version

Existe uma maneira de editar o arquivo package.json automaticamente?

Sim, o que você pode fazer para que isso aconteça é executar o npm versioncomando quando necessário, você pode ler mais sobre ele aqui na versão npm , mas o uso básico seria npm version patche incluiria a ordem do terceiro dígito em sua package.jsonversão (1.0. X )

Usar um gancho de pré-lançamento do git ajudaria?

Você pode configurar para executar o npm versioncomando no gancho de pré-lançamento, conforme necessário, mas isso depende se é disso que você precisa ou não no seu canal de CD / CI, mas sem o npm versioncomando, um git pre-releasegancho não pode fazer nada "facilmente" com opackage.json

A razão pela qual npm versioné a resposta correta é a seguinte:

  1. Se o usuário estiver usando uma estrutura de pastas na qual package.jsonele está usando, npmse estiver usando, npmele terá acesso ao npm scripts.
  2. Se ele tem acesso, npm scriptsele tem acesso ao npm versioncomando.
  3. Usando esse comando, ele não precisa instalar mais nada em seu computador ou canal de CD / CI, o que a longo prazo reduzirá o esforço de manutenção do projeto e ajudará na instalação.

As outras respostas nas quais outras ferramentas são propostas estão incorretas.

gulp-bump funciona, mas requer outro pacote extra que pode criar problemas a longo prazo (ponto 3 da minha resposta)

grunt-bump funciona, mas requer outro pacote extra que pode criar problemas a longo prazo (ponto 3 da minha resposta)

Alejandro Vales
fonte
2

Primeiro, você precisa entender as regras para atualizar o número da versão. Você pode ler mais sobre a versão semântica aqui.

Cada versão terá a versão xyz, onde será definida para finalidades diferentes, como mostrado abaixo.

  1. x - major, faça isso quando houver grandes alterações e ocorrer uma grande discrepância de alterações.
  2. y - menor, faça isso quando ocorrer uma nova funcionalidade ou aprimoramento.
  3. z - patch, faça isso quando você tiver erros corrigidos ou reverter alterações na versão anterior.

Para executar os scripts, você pode defini-lo em seu package.json.

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

No seu terminal, você só precisa executar o npm de acordo com suas necessidades, como

npm run buildpatch

Se executá-lo no git repo, a versão padrão do git-tag é verdadeira e, se você não quiser, pode adicionar o comando abaixo nos seus scripts:

--no-git-tag-version

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

Mnemo
fonte
0

Eu criei uma ferramenta que pode realizar o controle de versão semântico automático com base nas tags nas mensagens de confirmação, conhecidas como tipos de alteração. Isso segue de perto a Convenção de Mensagem de Compromisso Angular, juntamente com a Especificação de Versão Semântica.

Você pode usar esta ferramenta para alterar automaticamente a versão no package.json usando a CLI do npm (isso é descrito aqui ).

Além disso, ele pode criar um log de alterações a partir dessas confirmações e também possui um menu (com um verificador ortográfico para mensagens de confirmação) para criar confirmações com base no tipo de alteração. Eu recomendo conferir e ler os documentos para ver tudo o que pode ser realizado com ele.

Eu escrevi a ferramenta porque não consegui encontrar nada que atendesse às minhas necessidades para o meu CICD Pipeline para automatizar o controle de versão semântico. Prefiro me concentrar no que são as mudanças reais do que na versão e é aí que minha ferramenta salva o dia.

Para mais informações sobre a justificativa da ferramenta, consulte isso .

Daniel Eagle
fonte