指定した値をファイルに埋め込むCLIのツール(emv)を作りました

指定した値をファイルに埋め込むemvというCLIのツールをGoで作りました。

ビルドツール自体にGitのタグなどを利用してバージョン番号を埋め込むといった方法が提供されているものも多いですが、それだとカバーできないようなパターンをカバーしたくて作っています。

利用方法

emv -c project/emv.json 1.0.2
Usage: emv [-c CONFIG] [-t TARGET] VALUE1 ...

Flags
  -c, --config string   Config file path. (default "emv.json")
  -t, --target string   The base directory to search for target files. If not specified, it is the same directory as the config file.
  -h, --help            Help.

設定ファイルに埋め込みのためのルールを記載し、そのルールに従って、CLIでのコマンドライン引数として指定されたものを埋め込みます。

例として下記のような設定を用意します。ファイル名はemv.jsonとしておきます。

{
  "values" : [
    { 
      "name" : "version"
    }
  ],
  "targets" : [
    {
      "files" : [
        "example.properties"
      ],
      "embeddeds" : [
        {
          "pattern" : "version=[0-9\\.]+",
          "replacement" : "version={{.version}}"
        }
      ]
    }
  ]
}

valuesで入力値(emvの引数として指定)の定義を行っています。
nameで入力値に対して名前(上記例だとversion)を付与しています。この名前を使って、replacementで入力値を参照することができます。

targetsで対象となるファイルや埋め込み内容を定義しています。
filesはターゲットとなるファイルです。相対パスとして指定した場合、デフォルトでは設定ファイルと同じディレクトリを基準とします。-tオプションで基準とするディレクトリを変更することができます。

embeddedsで埋め込むコンテンツを定義します。
patternは正規表現になります。patternreplacementの値で置き換えます。
replacementには、{{.name}}のように入力値を埋め込むことができます。Goのtext/templateを利用しています。

filesで指定しているexample.propertiesは下記のような内容です。

version=1.1.2

emv.jsonexample.propertiesが配置されているフォルダで実行します。
2.0.0を埋め込みます。

$ emv 2.0.0
Embedded values:
  version=2.0.0
Files: ([U] Updated, [-] None)
  [U] example.properties

example.propertiesは下記のようになりました。

version=2.0.0

入力値の一部を利用する

入力値はpatternで正規表現の名前付きキャプチャを利用すると、別の名前として切り出すことができます。

  "values" : [
    { 
      "name" : "version",
      "pattern" : "^(?P<major>[0-9]+)\\.(?P<minor>[0-9]+)\\.(?P<revision>[0-9]+)$"
    }
  ],

たとえば上記の設定で2.1.2と入力した場合、下記のような名前と値のペアになります。

  • version : 1.2.3
  • major : 1
  • minor : 2
  • revision : 3