⚒️

Markdown形式の入力からファイル/ディレクトリを生成するCLI/Goパッケージ

2022/05/20に公開

どんなものなの?

*, -, +, # のいずれかとインデントを使ってファイル・ディレクトリの配置をMarkdownで表現します。そのMarkdownを入力としてCLIに読み取らせると、カレントディレクトリにファイル・ディレクトリが生成されるというものです(以降からCLIに絞って説明します)。
また、こちらがそのCLIです。

サンプルのMarkdownを出力してみる

このCLIには、インストールしてすぐに試せるようにサンプルのMarkdownを標準出力に出力する機能があります。では、実際に実行してみます。

$ gtree template
- gtree
        - cmd
                - gtree
                        - main.go
        - testdata
                - sample1.md
                - sample2.md
        - makefile
        - tree.go

Dryrunを実行してみる

サンプルのMarkdownを出力することが出来ました。それでは、ファイル・ディレクトリを生成してみましょう!、、その前に、どう生成されるか確かめたいと思うかもしれません。このCLIにはdry-runモードもあるので、まずその機能を使ってみます。

$ gtree template | gtree mkdir --dry-run
gtree
├── cmd
│   └── gtree
│       └── main.go
├── testdata
│   ├── sample1.md
│   └── sample2.md
├── makefile
└── tree.go

9 directories, 0 files

このように出力されます。dry-runなので、実際にファイル・ディレクトリは生成されません。また、不正な名前(e.g. 名前に/が含まれる)がある場合はエラーとして検知します。
ちなみに、このtree出力機能は、「Markdown形式の入力からtreeを出力するCLI/Web」で使用している処理を一部流用しています。

ファイル・ディレクトリを生成してみる

上で実行したDryrun結果の最終行に、9 directories, 0 filesと見えますね?
お気づきかもしれませんが、デフォルトの挙動としてディレクトリしか生成してくれません。ではファイルを生成するにはどうするかというと、-eフラグを使います。

$ gtree template | gtree mkdir --dry-run -e .go -e .md -e makefile
gtree
├── cmd
│   └── gtree
│       └── main.go
├── testdata
│   ├── sample1.md
│   └── sample2.md
├── makefile
└── tree.go

4 directories, 5 files

出力の最終行が4 directories, 5 filesと変わりました。これで.go, .md, makefileがファイルとして認識されることがわかりました。
これだけだと少し分かりづらいかもしれないので以下にイメージを載せておきます。

(dry-runモードの出力は色をつけるようにしました。自然っぽい色で気に入っています。)

それでは、準備が整ったのでファイル・ディレクトリを生成します。

$ tree gtree
gtree [error opening dir]

0 directories, 0 files
$ gtree template | gtree mkdir -e .go -e .md -e makefile
$ tree gtree
gtree
├── cmd
│   └── gtree
│       └── main.go
├── makefile
├── testdata
│   ├── sample1.md
│   └── sample2.md
└── tree.go

3 directories, 5 files

まず、tree gtree でディレクトリが存在していないことを確認しています。
そして、gtree template | gtree mkdir -e .go -e .md -e makefileでファイル・ディレクトリを生成しています。
最後に、tree gtreeで、実際に生成された状態を確認しています。

最後の出力イメージ

ここまでで具体的な使い方を見てきました。

どんなときに使えるの?

うまい使い方を思いついていないのが正直なところです。強いて言えば、プロジェクトのテンプレートとなるディレクトリ構成があれば、その構成の再現が楽かつミスなく出来るかな、、程度です。
あとはAnsibleやほかの構成管理ツールを使って、複数あるリモート環境に同一のファイル・ディレクトリを生成するといったことも可能かもしれません。

どうやってインストールするの?

インストール方法は、以下の3つを用意しています。

  • go install
    • Go1.18以上が必要です。
    • go install github.com/ddddddO/gtree/cmd/gtree@latest
  • Homebrew
    • brew install ddddddO/tap/gtree
  • binary download
    • こちらから、ダウンロードしてパスを通してお使いください。

Appendix

Goパッケージとしても、この記事で紹介した機能を使うことができます。詳細については、リポジトリのREADMEを参照ください。
https://github.com/ddddddO/gtree

Discussion