指定した値をファイルに埋め込む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
は正規表現になります。pattern
をreplacement
の値で置き換えます。
replacement
には、{{.name}}
のように入力値を埋め込むことができます。Goのtext/templateを利用しています。
files
で指定しているexample.properties
は下記のような内容です。
version=1.1.2
emv.json
とexample.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
Redmine View Customize Plugin のコード例を整理しました
Redmine Advent Calendar 2021 - Adventar の7日目の記事になります。
View customizeのコード例を雑多に置いていたプロジェクトを整理しました。
View customizeとRedmineのバージョンが上がっていくにつれ、
- もっと簡潔に書けるようになっている
- Redmine自体に機能として用意されたので利用する意味がなくなった
ということがあったので、2021年9月頃から少しずつ整理をはじめ、最近その整理が一通り完了しました。
やったことは下記になります。
- View customizeとRedmineともに最新のバージョンを対象にコードを書き直し
- 既にRedmine自体に存在するものは削除
- 全ての例に画面キャプチャ(アニメーションの方がわかりやすい場合はアニメーションGIF)を用意
- 英語+日本語で書くように(といっても文章は少なめで💦)
また、トップページに注意事項等も明記するようにしました。
- 「このプロジェクトはView customizeのコードの書き方やコード例に関する質問をする場所で、コード作成を依頼する場所ではありません」
- 連続して同じようなものを教えて欲しい&作って欲しい的なのが来てしまい、どうやら自分でまったくコード試してなさそうだな、、ってのがあったので、念のためです💦
- View customizeをいろんな人に使って欲しいと思っていて、出来るだけサポートしたいので、試してわからないことは気兼ねなくお尋ねください。
- 「このプロジェクトではPull Requestを受け付けていません」
- 他の方に作成していただいたスクリプトを確認し、また、今後もメンテナンスしていくのは今の時点だと困難だな、、と判断したためです。
コミニティでメンテナンスしていくような仕組みが作れたらと思ったこともありますが、今の時点では気楽にやれる方法をとりたいと思います。- コミニティでやるならば、コード登録は自由で、それに対して他の人が自由にコメントできるようなものが良いなぁと思っているので、やるならば別の場所を用意するなど考えたいなと。
- 他の方に作成していただいたスクリプトを確認し、また、今後もメンテナンスしていくのは今の時点だと困難だな、、と判断したためです。
- 「GitHubスポンサーとしてのプロジェクト支援を受け付けています」
- もしもこれが役立って何かしたいってときにはぜひ!
古いコードについて
昔のものは下記に移動しています。
移動したことによって、他のサイトからのリンク切れが発生していると思います。
古いのを探していただくより、新しく書き直したものをみてもらった方が良いと思いますので、リンク切れしている場合はトップページから探していただけると幸いです。
今後について
引き続き問い合わせがあったり、自分で試したものは残していけるようにしたいと思っています。
Tips的なものも書いていって、ここを見てね!って感じで済ませられるものが増やせたらなと。
Redmine issue assign notice plugin の v2.0.0 をリリースしました
チケットの担当者が変わったときに、SlackやRocket.Chat、Teamsなどに通知するプラグイン、Redmine issue assign notice pluginのv2.0.0をリリースしました。
Redmineのtrunk(r21289)でも動作するようにしています。
Redmine: View customize plugin の v3.0.0 をリリースしました
View customize plugin の v3.0.0 をリリースしました。
下記2つの対応を行っています。
- Zeitwerk が有効になった場合に動作しない箇所の修正
ViewCustomize.context
にプロジェクトのIDを追加
Zeitwerk が有効になった場合に動作しない箇所の修正
Redmineのtrunkに最近入った下記対応でView customizeが動かなくなっていたので、動くように修正しました。
ファーエンドテクノロジーの前田さんからIssue、石川さんからPull Requestをいただきました。ありがとうございます。
Zeitwerk が有効になったことで、クラスのロードの仕組みが変わり、ロードに失敗していました。
なお、修正後のものは、Zeitwerk が有効になる前でも動きます。(元々の書き方があまり良くなく、Zeitwerkによってロードに失敗するようになった)
ViewCustomize.context
にプロジェクトのIDを追加
プロジェクトが1つしかない場合、プロジェクトのセレクトボックスがチケット編集画面で表示されないため、プロジェクトIDを簡単に取得する方法がありませんでした。
あまり使うことない(プロジェクトのidentifierは既に提供しており、たいていそちらで事足りる)のですが、プロジェクトIDの方がサンプルとして説明しやすいことがあったので、今回追加することにしました。
ViewCustomize.context.project.id
で取得できます。
社内勉強会で「今からでも遅くないDBマイグレーション」というタイトルで発表しました
社内勉強会で「今からでも遅くないDBマイグレーション」というタイトルで、FlywayとSchemaSpyの紹介をしました。
FlywayはCLIツール&SQLで書くので、DBマイグレーションやっていなかったプロジェクトに途中から入れる時も敷居がとても低いと思います。 SchemaSpyはDB定義(特にリレーションシップ)を確認するのにとても便利なドキュメント生成ツールなのですが、これがなんでGitHubでスターが2K程度しかついていないのか理解できないくらいに便利です。