1. kotamat

    Posted

    kotamat
Changes in title
+npm versionのように簡単にgitのタグを使ってセマンティックにバージョンアップをするワンライナー
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,79 @@
+OSSや多人数でのプロジェクト開発をしているときに必要になってくるのは、プロジェクト自体のセマンティックなバージョン管理かと思います。
+特にインストール型のプロジェクトでは、現在のユーザのバージョンと比較して、インストールさせるべきか、させる場合はどういうメッセージを出すかなどを判断するのに、メジャーバージョンやマイナーバージョン、パッチバージョンなどのバージョンを比較しているかと思います。
+
+npmであれば、`npm version`を使うと、Node.jsをもちいたパッケージのバージョンアップを簡単にできる様になっているかと思います。
+ただ、そういった機能が備わっていない言語の管理やパッケージ管理ツールを使っていないプロジェクトなどでは独自にセマンティックバージョンを管理する必要があり、それを毎回最新のタグをみて更新するのは面倒かと思うので、ワンライナーで簡単に管理できるようにしました。
+
+# 導入方法
+
+まず、下記のシェルスクリプトをどこかに配置します。
+著者はzshを使っているので、`~/.zsh/version_up.sh`に設定しています。
+
+```zsh
+#!/bin/sh
+version=`awk '{print $1}' < /dev/stdin`
+command=$1
+major=`echo $version | awk -F '.' '{print $1}'`
+minor=`echo $version | awk -F '.' '{print $2}'`
+bugfix=`echo $version | awk -F '.' '{print $3}'`
+build=`echo $version | awk -F '.' '{print $4}'`
+
+if [ -z "$version" ]; then
+ echo "USAGE: echo 1.0.0 | version_up.sh [major|minor|bugfix|build]"
+ exit 1
+fi
+
+if [ "$command" = '' ]; then
+ if [ -n "$build" ]; then
+ build=`expr $build + 1`
+ elif [ -n "$bugfix" ]; then
+ bugfix=`expr $bugfix + 1`
+ fi
+elif [ "$command" = 'major' ]; then
+ major=`expr $major + 1`
+ minor=0
+ bugfix=0
+ build=0
+elif [ "$command" = 'minor' ]; then
+ minor=`expr $minor + 1`
+ bugfix=0
+ build=0
+elif [ "$command" = 'bugfix' ]; then
+ bugfix=`expr $bugfix + 1`
+ build=0
+elif [ "$command" = 'build' ]; then
+ build=`expr $build + 1`
+fi
+
+if [ "$command" = "major" -o "$command" = 'minor' -o "$command" = 'bugfix' ]; then
+ if [ -n "$build" ]; then
+ build=0
+ fi
+fi
+
+if [ -n "$build" ]; then
+ echo ${major}.${minor}.${bugfix}.${build}
+else
+ echo ${major}.${minor}.${bugfix}
+fi
+```
+次に`~/.zshrc`内部に下記スクリプトを記載します。
+
+```zsh
+alias vup="git tag -l | tail -n 1 | sed 's/[^0-9\.]//g' | ~/.zsh/version_up.sh" # version up string
+```
+
+最後に下記のコマンドで実行するだけです。
+
+```terminal
+$ git tag -l
+v1.6.1
+$ vup major
+2.0.0.0
+$ vup minor
+1.7.0.0
+$ vup bugfix
+1.6.2.0
+```
+
+あとはこの出力されたバージョンを使ってタグを生成してもいいし、何かしらのファイルに出力するのでもいいと思います。