🦕

Deno用モジュールバージョン管理ツールdeno-uddの使い方と設定の紹介

2021/07/17に公開

DenoはNode.js時代のpackage.jsonを廃し、直接URLにバージョンナンバーを仕込む形でのバージョン管理を導入しています。
スタイルガイド的には、モジュールの読み込みをdeps.tsというファイルに任せ、プロジェクト内ではそこから間接的にimportする形での管理が推奨されています。

このモジュールのバージョン管理を補助してくれるツール、UDDを紹介します。

https://github.com/hayd/deno-udd

Update Deno Dependenciesを略してUDDということのようです。

ところで、なんでメイン画像(↓)の竜脚類君が牛っぽい雰囲気なんでしょうかね?

地面に直接生えている草を食べるために長い首を上げ下ろしするのは明らかに無駄なので種の存続は危ういと思いますが…[1]

導入

deno.land/xにて公開されています。deno installでインストールしましょう。

❯ deno install -A -f -n udd https://deno.land/x/udd@0.5.0/main.ts
(略)
✅ Successfully installed udd
/Users/kawarimidoll/.deno/bin/udd

インストール先はデフォルトでは~/.deno/binです。こちらにPATHが通っていることを確認してください。

uddのみで実行するとヘルプが見られます。

❯ udd
usage: udd [-h] [--dry-run] [--test TEST] file [file ...]

udd: Update Deno Dependencies

Positional arguments:
  file      	files to update dependencies

Optional arguments:
 -h, --help 	show this help text
 --dry-run  	test what dependencies can be updated
 --test TEST	command to run after each dependency update e.g. "deno test"

使い方

ファイルを指定して実行することで、その中でimportしているモジュールのバージョンを調査し、一括で更新してくれます。

❯ # 基本
❯ udd deps.ts
❯ # 確認だけ
❯ udd deps.ts --dry-run
❯ # 複数指定
❯ udd main.ts util.ts
❯ # deps.tsが分散している場合
❯ udd ./**/deps.ts
❯ # 一括指定
❯ udd *.ts

--testオプションを付けると、テストが通ることを確認したうえで更新してくれます。

❯ udd deps.ts --test="deno test"

基本的には何も設定をせず動かせるので、インストール→実行がすぐ試せます。
また、もしこのツールを使用しなくなったとしても、これに関する負債が残らないというのも利点です。

対応先

記事執筆時点では、以下からimportされているモジュールが更新対象となっています。
Denoでよく使われるものはだいたい対応していそうです。

設定

上記の通り、基本動作に設定は不要ですが、いくつか便利な設定があるので紹介します。

semverの尊重

Node.jsのpackage.jsonのように、トークンをつけることでメジャーバージョンの固定などができます。
モジュールURLのハッシュ部に指定します。なかなか面白いアイデアだと思います。

  • ^ メジャーバージョンを固定する
    • メジャーバージョンが0ならマイナーバージョンを固定する
  • ~ メジャー・マイナーバージョンを固定する
    • メジャーバージョンが0ならマイナーバージョンは更新される
  • <[バージョン] 指定したバージョンより(semverで)低いバージョンに固定する
  • = 更新を行わない
deps.ts
// 設定例
import { rgb24 } from "https://deno.land/std@0.101.0/fmt/colors.ts#^";
import ky from "https://cdn.skypack.dev/ky@0.28.5?dts#=";

<は明示的に上限バージョンを指定する必要がありますが、それ以外はURL内に含まれるバージョン指定を参照します。

Velociraptorの利用

これは個人的な好みなのですが、Denoプロジェクト内で使用するコマンドはとりあえずVelociraptorにまとめたくなります。
Velociraptor自体の説明は以下の記事をご覧ください。
https://zenn.dev/kawarimidoll/articles/b6570176eaaaea

こんな感じの設定を追加します。

velociraptor.yml
scripts:
  deps:
    desc: Update dependencies with ensuring pass tests
    cmd: udd deps.ts --test="vr test"

  test:
    desc: Runs the tests
    cmd: deno test --reload --coverage=cov_profile
    gitHook: pre-push

これで、vr depsでテスト通過の確認をしつつモジュールの更新をできるようになります。

こちらの設定は自作テンプレートに含めています。
https://github.com/kawarimidoll/deno-dev-template

注意点

  • URL内にバージョン番号が含まれないと、UDDの確認対象外となります。
  • これ自体の更新が滞り気味のようです。最新機能がどんどん追加されていく類のツールではありませんが、更新が止まってしまうと、今後のDeno本体などの修正によって使えなくなる可能性も否定できません。

自動化

GitHub Actionsを使って自動化する方法を以下の記事で紹介しています。
https://zenn.dev/kawarimidoll/articles/c68204d248c107

まとめ

Denoのモジュールのバージョン管理ツールのUDDを紹介しました。

「テストしつつ更新」ができるので、モジュール更新の心理面・作業面の負荷を減らすことができるでしょう。結果的にプロジェクトの寿命も延びるのではないでしょうか。

この記事を書いている途中でドキュメントに不備を見つけたのでコントリビューションしました。

まだv0.5.0と若いツールなので、けっこうコントリビューションチャンスがありそうです。

始めやすく、使いやすく、捨てやすい感じのツールだと思うので、気になった方は使ってみてください。

脚注
  1. 近年では、そもそも竜脚類の首は持ち上げることができず、水平ちかくに保たれていたという説が有力らしいです ↩︎

Discussion