🐤

URLを簡単に管理・共有できるCLIを作成した

2023/07/21に公開

背景

私が所属する会社では、多くのサービス(コーポレート,toB,toC,etc...)とそれぞれの環境(local,develop,staging,production,etc...)が存在します。

その結果、必要なURLを見つけるためには少し時間がかかることが多く他の開発者に聞かなければいけなかったりなどの問題がありました。

この問題を解決するためにCLIツール urloを開発しました(個人開発です)。

また、開発者間でURLを簡単に共有できるツールがあれば便利だと考えました。

https://github.com/ryo034/homebrew-urlo

urloとは?

urloは、URLのリストを管理し、開発者が効率よくURLを共有できるようにするCLIツールです。

これにより、必要なURLをすばやく見つけて開くことができ、開発者の生産性を向上させます。シンプルなものになるように設計しました。

urloの使い方

詳細はREADMEに書いてありますが、ざっくりとしたインストールから利用例までを記載します

インストール

> brew install ryo034/urlo/homebrew-urlo

具体例

# urlo インストール
> brew install ryo034/urlo/homebrew-urlo

# 登録されているURL一覧を表示します
> urlo list
No records found

# google,yahooというタイトルでURLを追加します
> urlo add google https://www.google.com
> urlo add yahoo https://www.yahoo.com

# listにgoogleが追加されています
> urlo list
google - https://www.google.com
yahoo  - https://www.yahoo.com

# selectでリスト一覧から選択してURLを開くことができます
> urlo select
? Select a Website:
  ▸ google
    yahoo

# 自身のURLを共有するにはリストを出力し別の開発者がsetかbulk-addで追加します
# json文字列でリストを出力しクリップボードにコピー
> urlo list -s
'[{title: "google", url: "https://www.google.com"},{title: "yahoo", url: "https://www.yahoo.com"}]' | pbcopy
# 出力されたリストを取り込む(上書きしない場合はbulk-add)
> urlo set -s "{set output json string}"

データの共有

セキュリティを考慮しなければいけないので、データベースのようなデータの共有はしないように設計しています。

そうなった場合に、簡単に共有するにはどうすれば良いか考えた時に、github上のjsonなどのファイルから直接読み込むことができればチームメンバー誰でも共有と管理をすることができると考えました。

urloではJson文字列でセットすることができるのでgithub上で管理されているJsonから直接セットすることができます。

> urlo set "$(curl -s https://raw.githubusercontent.com/ryo034/homebrew-urlo/main/example/data/urls.json)"

privateリポジトリは以下のような感じでtokenを設定すれば取得できます

> urlo set "$(curl -s -u username:token https://raw.githubusercontent.com/username/repo/branch/path/to/file.json)"

技術

使用したライブラリなどは以下になります

利用したどちらもREADMEやDocがとてもよく書かれており実装に困ることはありませんでした。

参考になる記事も多くあり、実装自体は数時間で完了しました。

https://dev.classmethod.jp/articles/survey-easy-terminal-installer-sample/
https://zenn.dev/tama8021/articles/22_0627_go_cobra_cli

具体の詳細の実装はリポジトリを参照してください

学んだこと

CLIの作成を通じていくつかの重要なことを学びました。
具体的な実装方法などはとても簡単で、しかも他に書いている方も多いのでそちらに譲ことにして、それ以外で学んだことを以下に書いていきます。

設計

開発者がURLのリストを簡単に管理・共有することを主な目的として設計されています。

最低限求める要件

  • URLをタイトルとURLで追加できる
  • jsonなどで一気に登録できる
  • リストの中からフィルタリングし、↓↑で選択できるようなUIを提供する

我々開発者が取り組む様々なタスクの中で、特定のリソースやサービスへのリンクを素早く取得し、そのリンクを共有する必要がしばしばあります。こうした作業の効率を高めるための設計をしています。

開発者は`add`コマンドを使用して新しいURLを簡単に追加でき、それに関連付けるための簡単なタイトルを付けることができます。
また、`-o`オプションを使えば、既存のURLを新しいものに更新したり、存在しない場合には新しいURLを追加することが可能です。
これにより、必要な情報を素早く取得・更新し、共有することが可能になります。

さらに、`set`コマンドを使えば、一度に全てのURLを上書きすることができます。
これは、大量のURLを一度に管理・更新する必要があるときや、新たなプロジェクトやタスクのための全く新しいURLのセットを作成するときに特に便利です。
上記で説明したgithub上で管理する際にsetコマンドが必要になってきます。

`select`コマンドを使用すればリストの中から1つを選択するUIを提供しているので、簡単に選択することができます。

初めてCLIを作るので何からはじめていいか分かりませんでしたが、解決したい課題と、実際のユースケースを想定して要件を洗い出すことで自ずと必要なコマンドが浮かび上がってきました。

リリース(CI/CD)

リリース作業はとても面倒なので可能な限り自動化しようとしています。
ただCLIのCI/CDは初めて作成したため、今回一番時間がかかった箇所はここかもしれません。

いくつか試行錯誤し、以下のような可能な限りシンプルな形になるようにしました。

  1. Increment Versionのワークフローpatch,minor,majorを選択して、選択したバージョンの箇所をインクリメントする
  2. Releaseのワークフローのworkflow_dispatchで最新のタグを取得し、そのバージョンでhomebrewにリリースする

1つのワークフローで1と2を結合して、インクリメントと同時にリリースするワークフローも考えました。

しかし、パッチバージョンを上げただけで、homebrewにリリースし大々的に公開する必要がないバージョンもあると思います。そのためインクリメントとリリースのワークフローを分離するようにしました。

READMEの書き方

リポジトリのREADMEは他の開発者がプロジェクトを理解し、使用するための重要な要素の1つです。
READMEはプロジェクトの目的、機能、使用方法などを明確に伝えることで利用者はスムーズに利用することができます。

CLIの作成自体が初めてだったので有名で普段使用しているCLIを参考にし作成しました。
参考にしたREADMEでは計測などもあり、とても詳細に書かれていてとても分かりやすいです。

オプションが多く全て記載されていないREADMEもありますが、今回はシンプルなCLIなのでオプションなども全てREADMEに記載しました

https://github.com/sharkdp/bat

https://github.com/AlDanial/cloc

特にshieldsがあると見た目を華やかになって良いと思いました(見た目は大事)!
ただし、ベタベタ貼りすぎるのも見た目が良くないかなと思い必要最低限だけつけています。

AIの利用

今回はChatGPTを利用してCLIを作成しました。

しかし最新情報ではないことから情報が古く、結局調べなければいけないことも多く、ほとんど自力で実装することになりました。

ただ、設計の部分に関しては今までの遺物の蓄積があるので、大いに助かりました。次回のCLIの作成があるなら、ChatGPTを利用して設計部分をもっと深掘りして、最初から綺麗な設計をできるようにしていきたいと思います。

以下に今回利用したChatGPTのchatを貼っておきます。

https://chat.openai.com/share/b6e61739-c8d2-46b9-b8de-403339bdd5fa

最後に

urloの作成を通じて、上記の学びを得ることができ、また具体的な課題解決のためのツールを作成することができました。私は実際にurloを使って作業の効率化を図っており、チームにも共有することができました。そのため作成した背景に記載した目的が達成されたと感じています。

URLをリスト形式で管理・共有するだけのとても簡単でシンプルなCLIでしたが、初めてのCLIの作成で学びが多かったプロジェクトでした!

次はRustに挑戦してみたいと思います💪

よかったなと思った方はgithubでstarやzennでのコメントをいただけると励みになります🙇

GitHub stars

Discussion