こんにちは。Sansan株式会社でエンジニアをしている伊藤です。
契約データベース「Contract One」の開発を担当しています。
Contract Oneの開発チームでは日々開発生産性向上について向き合っています。運用作業の自動化や開発体験の向上などを行なっていますが、その一環として行なった活動として「Denoで作るチーム開発生産性向上のためのCLIツール」というテーマでまとめてみます。12月に弊社で開催したTypeScriptのイベントで登壇した内容を詳細に紹介します。
課題
プロダクト開発では、プロダクションコード以外にも運用や開発効率向上のための周辺コードを書く場面があると思います。Contract Oneでも周辺コードが存在しており、各個人の有志によって作成・運用されていましたが、以下のような課題がありました。
- 専用のリポジトリで管理されているが、様々な言語 (Kotlin, Go, Ruby...) で書かれており利用するのに手間がかかる
- 利用に手間がかかるためにあまり共有されておらず、使っている人が限定的
- 機能を容易に追加できるツールになっていないため、新しく機能を追加しようとしても、各個人が1から作る必要がある
これらの課題に対処するためには、共通の実行環境を整備し、コードを再利用可能な形で整理する必要があります。私たちは、この課題を解決するためにDenoを活用したCLIツールの導入を進めました。
解決策
以下の要件を満たした基盤を作成することで解決できると考えました。
- 最低限の環境構築でコマンドラインから利用できること
- どのディレクトリからでもすぐに実行可能であること
- 機能追加が簡単で、作った機能をすぐに他の開発者に共有できる
理由は後述しますが、今回の要件にDenoがマッチしたため、Denoを使ってCLIツールを作成しました。
Denoの採用理由
Denoは、CLIツール開発において他のランタイムと比較しても多くの利点があります。以下にその理由を挙げます:
1. 標準機能の豊富さ
Denoは、開発に必要な基本的なツール(lintやformat、testなど)を標準で備えています。また、Deno標準ライブラリは公式チームによってメンテナンスされており、高い信頼性を持っています。CLIのための引数パースやCSVパース、UUIDなど、基本的な機能は標準ライブラリがあれば容易に実装可能です。
Node.jsでは、これらを実現するために複数のライブラリや設定ファイルが必要ですが、Denoではそれが不要です。その結果、依存関係を減らし、プロジェクト全体の管理が簡単になります。
2. Global Installation機能
Denoのglobal installation機能 を利用することで、コマンド一つでCLIツールをグローバルにインストールし、任意のコマンドとして利用できるようになります。便利なのが、ソースコードを変更しても再インストールが不要な点です。Contract Oneではモノレポ構成をとっており、CLIツールもリポジトリ内に配置しているため、普段のgit pullするだけでCLIツールをアップデートできます。
3. 学習コストの低さ
Contract OneではフロントエンドでTypeScriptを採用しているため、開発者全員がTypeScriptに慣れている点も採用理由の一つです。自動化などに開発者全員が向き合える環境を作れるという点でも重要です。
4. LTS support
JavaScriptランタイムはbunなどもありますが、Deno 2.1でLong term supportが追加され、破壊的変更やバグフィックスなどの面で比較的安心して利用できるようになりました。
デモ
実際にDenoを使用して構築したCLIツールのサンプルとして、以下のリポジトリを公開しています:
GitHub - itomise/deno-cli-app: CLI app built with Deno

CLIアプリについての簡単な説明です。コマンドを構築する部分の仕様は以下です。
- 手順通りにインストールすると自動でパスを通してくれて、設定したコマンド名でアプリを実行できる
- commandsディレクトリ配下のファイルが実行対象のファイルで、コマンドで指定するとそのファイルが実行される
- 引数なしでもプロンプト形式でコマンドを選んで実行できる。引数に明示的に指定もできるため、手早く実行したい場合に便利
他の開発者が新たなコマンドを作成する際には以下の点で使いやすさがあります。
- コマンドを追加したい場合はtsファイルをcommandsディレクトリ配下に配置するだけで良い。ファイルベースでルーティングされるため、引数なしでアプリを起動された時のコマンド一覧にも自動で追加される
- deno/daxのライブラリにより、tsの処理内でコマンドライン実行ができるため、denoの標準機能に加えてgcloudコマンド等を簡単に処理に繋ぎこめる
Contract One CLIでやっていること
CLIツールで実際に現状運用しているコードの例は以下です。
データ準備系
- XのデータをYの状態にする
- ユニークなサンプルPDFを生成する
運用系
- オプションの機能を有効化するスクリプト
- 突発的なデータ修正系のスクリプト
リリース作業
- 開発環境・本番環境へのリリース作業の自動化
AI生成系
- 自然言語からいい感じの変数名、クラス名を出してくれる
- 要件定義のテキストから各レイヤーの一通りのコードを生成してくれる
これらのツールにより、開発チームが自動化に積極的に取り組む環境を構築しました。また、作業の効率化だけでなく、チーム全体の文化として「自動化」を浸透させていきたいというテーマもあります。
今後の展望
ツールの機能拡張
より多くのユースケースに対応できるコマンドを作成していきます。
AIによる価値を開発生産性に反映していくためにも、様々なツールを簡単に繋ぎこめる環境としても整備していければと思っています。
CI/CDへの応用
Contract Oneでは、GitHub Actions上で簡単なコードを実行したりするのにTypeScriptを使っています。ローカルの実行だけでなく、CI上での実行についてもDenoの恩恵を受けやすいと思っているので、これらもDenoに置き換えたいと考えています。
最後に
以上、開発生産性向上へのアプローチとDenoについての紹介でした。参考になれば幸いです。最後まで読んでいただきありがとうございました!
Contract Oneでは現在、絶賛採用強化中です!少しでも興味がある方はFindyのリンクより「いいかも」をお待ちしております。冒頭にXのリンクもおいているので、DMでもカジュアルにお話ししましょう!