2019の19日目として書いております。いうcliツールにinspireされて、tffmtmdというmarkdown内のhclソースコードをfmtするツールを作りました。processerのmoduleの使い方を見て、「ちょっといじれば、これGoだけじゃなくMarkdown内のなんのコードでもfmtできるな??」となり、勢い余ってパクってしまいました。fmtコマンドのソース(Goで書かれている)の構造やOSSツールをリリースする際のお作法について学べたので、そこらへんをまとめていこうかなと思います。Goでのmd内のソースコードの扱い方MarkdownのASTを扱う場合、blackfridayを使用して、*blackfriday.NodeのWalkメソッドにNodeVisitor型を満たす関数を渡して再帰的に実行させることで実現するのが一番簡単そうです。Qiitaをご参照ください。以下のように、本家ではGoのCodeBlockを検知しているところを、HCLを検知してhclのsyntaxcheckをした後にformatをかけています。fmtってどんなソースで構成されているんやろ、みたいな知的好奇心がツール作成のモチベーションの大きな部分だったので読んでみました。diags}とってもシンプルな作りですね。diags}あら、❸のhclwrite.Formatしているだけかと思ったら、まず❷でhclsyntaxのチェックをしているのか。check前のコメントを読んでみる。undo.ファイルはHCLのネイティブシンタックスとしてパースできるように、formatする前になっているべきで、やらないとformatterは元にユーザーが戻しづらい劇的な変化を起こしちゃう。checkもformatもtffmtmdの処理に入れ込むことにしました。Qiita)で教わってから現場で実践はしてきましたが、自分の開発したツールに書いていくのは初めてでした。可読性も上がるし、テストも追加しやすいのでこれはマストでやったほうが良いと思います。その際、gotestsなんかで雛形をgenerateして、そこから作っていくと楽にかけるかなと思います。Coverageが一目で見えることで、ツールとして安心して選びやすくなると思います。codecov.ioなんかを使用して、カバレッジをバッジ画像でREADMEにつけておくのが良さそうです。(これもgofmtmdからの受け売り。その他にGolangCIやCircleCIやgodocのバッジをつけておくととても可愛いし、ユーザーが安心して選びやすいと思う。)設定方法の詳細はこちらを参考にしてください。デプロイ自動化ツールです。直近のtagに対して、goreleaserコマンドを打つだけで.goreleaser.ymlファイルで指定したOSや環境に対応したバイナリをリリースしてくれます。(githubなら、tagではなく最新のコミットに紐付ける--snapshotふらぐもある)なんて便利なんだ。詳しい設定方法は公式チュートリアルをご参照ください!最後にほぼほぼgofmtmdの受け売りだし簡易なツール作成でしたが、ほぼ初めてのパブリックな自家製ツールだったので、非常に勉強になることが多かったです。あとはお仕事ではBitbucketを使っていることが多い(たまにGitlab)ので、久々にGithub使うと周辺ツールも相まって快適すぎてやばい。今回の記事では、本当はterraformソースからUMLをジェネるツールか、terraform-qiita-providerをGoで書く話を書くつもりでしたが、諸所ゴタゴタしている関係で今日までに完成させることができませんでした。それらのツールが完成したら、また諸々まとめてアウトプットしようと思っています。その際にも今回学べたことが大きく活きる気がしています。upLoginユーザーは見つかりませんでした。