231 votes

Versioning automatique des applications

Est-il possible d'incrémenter automatiquement un numéro de version mineure à chaque fois qu'une application Go est compilée ?

Je voudrais définir un numéro de version dans mon programme, avec une section d'auto-incrémentation :

$ myapp -version
MyApp version 0.5.132

Étant 0.5 le numéro de version que j'ai défini, et 132 une valeur qui s'incrémente automatiquement à chaque fois que le binaire est compilé.

Est-ce possible en Go ?

11voto

Kimia Zhu Points 61

Pour utiliser le multi -ldflags :

$ go build -ldflags "-X name1=value1 -X name2=value2" -o path/to/output

0voto

Mark Points 312

Dans le prolongement des autres réponses, avec les versions récentes de go, il est également possible d'écrire un buildid dans une section ELF - bien que cela ne soit pas aussi facilement lisible depuis le programme.

J'écris la même valeur dans les deux, en utilisant quelque chose comme ce qui suit :

BuildInfo:= "BUILD #x, branch @ rev built yymmdd hh:mm:ss"
// note the nested quotes "''" required to get a string with 
// spaces passed correctly to the underlying tool
ldFl := fmt.Sprintf("-X 'main.buildId=%s' -s -w '-buildid=%s'", BuildInfo, BuildInfo)
args := []string{
    "build",
    "-ldflags", ldFl,
    "-trimpath",
    "-gcflags", "-dwarf=false",
}
buildpath:="path/to/my/cmd"
args=append(args,buildpath)
buildCmd:=exec.Command("go", args...)

Je l'utilise avec mage un outil de construction écrit en go. Vous n'avez pas besoin des drapeaux supplémentaires ci-dessus, mais je les ai choisis pour enlever autant d'informations que possible des binaires de sortie.

(hors sujet : Mage demande un peu plus de travail initial que quelque chose comme Make, mais est beaucoup plus facile à étendre/maintenir qu'un système de construction basé sur make - de plus, vous n'avez pas à changer de vitesse mentale entre go et une autre syntaxe).

-1voto

lazy1 Points 3691

Je ne pense pas que ce soit possible en go.

Vous pouvez peut-être avoir une version.go qui contient un Build et votre script de compilation l'incrémentera avant de l'exécuter. go build ? (par un astucieux one liner perl/sed/awk).

-1voto

jimt Points 7028

Pas avec la propre chaîne d'outils de Go. Vous devrez accrocher un script dans votre configuration de construction quelque part qui pourrait le faire.

Vous pouvez en écrire un dans Go lui-même. Voici comment je m'y prendrais :

  • Une fois que vous commencez un cycle de construction, accrochez cet outil quelque part.
  • Utilisez les paquets d'analyse de la source pour créer une AST de votre main.go .
  • Parcourez-le et trouvez une variable ou une constante spécifique que vous avez réservée pour les informations sur la version.
  • Extrait la valeur de la version, l'analyse en nombres entiers et l'incrémente si nécessaire.
  • Réécrivez les modifications à l'AST.
  • Réécrire l'intégralité de l'AST dans le fichier en tant que code source (c'est ce que fait gofmt).
  • Quittez ce petit outil et poursuivez le processus de construction.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X