Deno の公式レジストリの登録方法が手動から自動になりました

Deno の公式レジストリの登録方法が変わりました! 本記事ではその登録方法について解説します。

(この記事は Deno の公式レジストリに自分の書いたモジュールを登録してみたい人向けの記事です。npm にモジュールを登録した経験がある人などが主な対象読者です。)

# Deno の公式レジストリとは

Deno の公式レジストリは https://deno.land/x にあります。(特に固有の名称などはありません。単にレジストリと呼ばれることが多いです。)

これまで、ここに自分の作ったモジュールを登録するには、公式ホームページのレポジトリにある JSON ファイルに PR を出して、
手動でマージしてもらうことが必要でした。

[<img width="945" alt="スクリーンショット 2020-08-09 14.16.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13825/97636b91-3491-ad2b-04db-2ef81cb8231c.png">](https://github.com/denoland/deno_website2/pull/146)

(旧来のワークフローでは手動のレビューとマージをしていました)

この若干面倒だった登録フローが、[8/3のアップデート](https://deno.land/posts/registry2)で、
PR を出す必要のない自動的なワークフローに置き換わりました。

本記事では、その登録方法を解説します。

# 新レジストリの概要

まず新レジストリに登録されるものは GitHub レポジトリの**タグのみ**になります。これまでは branch名 (master など) や commit hash などでも import 出来ていましたが、これらの import は出来なくなります。

```ts:OK
import { myFunc } from "https://deno.land/x/my_module@v1.0.0/my_func.ts";
```

```ts:NG
import { myFunc } from "https://deno.land/x/my_module@master/my_func.ts";
import { myFunc } from "https://deno.land/x/my_module@1e587a0/my_func.ts";
```

そしてタグの登録方法が少し特殊で、npm のようなコマンドによる登録ではなく、github から **Webhook で Deno レジストリの API を叩く**ことでタグが登録される仕組みになっています。

以下ではこの Webhook の登録方法を解説します。

# Webhook の登録方法

レジストリに登録したいレポジトリの Settings から Webhook のページに行き、以下のように Webhook を設定しましょう。

- Payload URL: `https://api.deno.land/webhook/gh/モジュール名` (モジュール名の部分は登録したいモジュール名に置き換える)
- Content type: `application/json`
- Events: `Let me select individual events.` を選び `Branch or tag creation` のみにチェック
- その他はデフォルト設定

この設定をすることで、タグを作った時に Deno レジストリのタグ登録用 API に POST リクエストが飛ぶようになります。

この状態で実際にタグを作ってみましょう

```
git tag v0.1.0
git push origin v0.1.0
```
Webhook がうまく飛ぶと、Webhook 設定ページで以下のように、リクエストとレスポンスのログを見ることが出来ます。

<img width="946" alt="スクリーンショット 2020-08-09 14.04.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13825/d2403edd-c61b-8987-25ec-6bea779e5711.png">

<img width="946" alt="スクリーンショット 2020-08-09 14.05.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13825/69ea2e3d-a731-4b2e-d9c8-1a5c64139f49.png">



この例では、筆者の [kt3k/deno_license_checker](https://github.com/kt3k/deno_license_checker) という github レポジトリを [deno.land/x/license_checker](https://deno.land/x/license_checker) として登録しています。

登録がうまくいくと、deno.land 上の当該ページ ( https://deno.land/x/モジュール名 ) 上で作ったタグのバージョンが追加されます。

<img width="1077" alt="スクリーンショット 2020-08-09 14.07.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13825/fa5772c1-ea5b-9fce-0135-0aaa3c1c127e.png">


# モジュール登録の注意点

モジュールの各タグはイミュータブルになるという原則があります。したがって、同じタグを2回以上登録して上書きするような事は出来ません。何かを変えたい場合は必ずバージョンを上げましょう。

また、当然ですが、モジュールの乗っ取りも出来ないようになっています。ある GitHub レポジトリに紐付いたモジュール名に別の GitHub レポジトリからタグ登録しようとしてもエラーになります。

### npm との違い

npm では `npm publish` というコマンドでパッケージのバージョンを登録する仕組みでしたが、これに相当するコマンドは用意されていません。Webhook を設定したレポジトリで、タグを切ってプッシュすることがイコール新しいバージョンを公開することになります。

なお npm の場合は publish する人の認証のために npm コマンドにログインすることが必要でした。Deno のレジストリではそのような認証の仕組みはありません。Deno のレジストリの場合は GitHub の特定のレポジトリとモジュールがリンクされる (かつそのリンクが変わることはない) ため GitHub 上での認証がモジュールの認証を兼ねていると言えます。

# まとめ

本記事では、Deno の新しいレジストリでのモジュールの登録方法を紹介しました。Webhook を設定してレジストリに publish するという仕組みは若干目新しいですが、慣れれば難しい設定ではありません。ぜひ Deno の新しいレジストリにモジュールを登録してみましょう 🦕


<!--
想定読者:
- Deno の module を公開したい人
- npm に自分の作ったパッケージを上げているレベルの人
-->