🥚

Denoのモジュールレジストリ nest.landの紹介

2021/03/20に公開

はじめに

Denoには、自作モジュールを公開するためのレジストリがいくつか存在します。

例)

この記事では、その中でも比較的使用率の高いと思われるnest.landについて紹介します。

この記事で紹介すること

この記事では以下のことについて説明します:

  • nest.landの概要
  • nest.landとeggsのセットアップ方法
  • eggsを使用してモジュールを公開する方法

環境について

この記事では、以下のバージョンを想定して記述しています。

項目 バージョン
Deno v1.8.1
eggs v0.3.4

nest.landってなに?

nest.landとは、ブロックチェーンベースのモジュールレジストリです。

一度、公開されたファイルが決して削除や変更されないということが保証されています。

deno.land/xとの比較

それぞれにメリット・デメリットがあるため、併用するか、用途に応じて使い分けるとよいのではないかと思います。

deno.land/x

  • メリット
    • denoland Organizationによって公式にメンテナンスされていること
    • (一度、Webhookさえ設定してしまえば) モジュールの新バージョンの公開が容易であること
  • デメリット
    • GitHubのWebhookの仕組みに大きく依存していること
    • 単一のGitHubリポジトリごとに、公開できるモジュール数は最大で3つまでという制限がある
    • 単一のGitHubアカウントまたはオーガニゼーションごとに、公開できるモジュール数は最大で15個までという制限がある

参考: https://github.com/denoland/deno_registry2#limits

nest.land

  • メリット
    • 公開できるモジュール数に制限はない
  • デメリット
    • モジュールを公開するには、CLIツール(eggs)の使い方を覚える必要があるため、deno.land/xと比較すると、若干ハードルが高い

セットアップ

アカウントを作成する

まず、はじめにAPIキーを生成する必要があります。

nest.landのホームページからアカウントを作成してください。

アカウントを作成すると、APIキーが発行されるので控えておいてください。

eggsのセットアップ

nest.landにモジュールを公開する際は、eggsというCLIツールを使用する必要があります。

インストール

以下のコマンドを実行すると、eggsをインストールすることができます:

$ deno install -Afq --unstable https://x.nest.land/eggs@0.3.4/eggs.ts

以下のコマンドを実行して、バージョンが表示されれば、無事にインストール成功です!

$ eggs --version
0.3.4

APIキーの登録

eggsを使用してモジュールを公開するには、アカウントを作成するにて生成したAPIキーをeggsに登録する必要があります。

そのためには、以下のコマンドを実行する必要があります:

$ eggs link <APIキー>

コマンドの実行後、~/.nest-api-keyにAPIキーが書き込まれまれていれば、登録に成功しています。

eggsの設定ファイルについて

eggsには2種類の設定ファイルが存在します:

  • egg.json/egg.yml
  • .eggignore

egg.json/egg.yml

eggsを使用してモジュールを公開するときの挙動を設定します。

nest.landにアップロードしたいモジュールごとにこのファイルを用意します。

以下のコマンドを実行すると、カレントディレクトリにegg.jsonまたはegg.ymlファイルが生成されます:

$ eggs init

コマンドを実行すると、いくつか質問を聞かれるので、答えてください。

質問に答え終わると、以下のようなファイルが生成されます:

{
  "$schema": "https://x.nest.land/eggs@0.3.4/src/schema.json",
  "name": "carol",
  "entry": "./mod.ts",
  "description": "Build cross-platform desktop apps with Deno, HTML, and Chrome",
  "homepage": "https://github.com/uki00a",
  "version": "v1.0.2",
  "files": [
    "./**/*.ts",
    "./**/*.js",
    "README.md"
  ],
  "ignore": [
    ".github",
    ".vscode",
    "Makefile",
    "examples",
    "testdata",
    "tools"
  ],
  "checkFormat": false,
  "checkTests": false,
  "checkInstallation": false,
  "check": true,
  "unlisted": false
}

設定項目

項目 説明 デフォルト値
name モジュール名
entry このモジュールのエントリポイントとなるファイルを指定します。 ./mod.ts
description このモジュールの説明を記載します。
homepage このモジュールのホームページ null
version このモジュールのバージョン(Semver形式)
unlisted trueを設定すると、ギャラリーページに表示されなくなります。 false
files nest.landにアップロードされるファイルの一覧(glob形式)
ignore nest.landにアップロードしないファイルの一覧(glob形式)
checkFormat trueを設定すると、モジュールの公開前にdeno fmt --checkが実行されます。
checkTest trueを設定すると、モジュールの公開前にdeno test -A --unstableが実行されます。
checkInstallation trueを設定すると、モジュールの公開前にこのモジュールがインストールできるかどうかチェックされます。
check trueを設定すると、上記checkFormat, checkTest, checkInstallationtrueを設定したときと同様の挙動をします。

.eggignore

モジュールの公開時に、nest.landへのアップロード対象から除外したいファイルの一覧を記述します。

このファイルは、.gitignoreと同様のフォーマットで記述します。

補足1: extendsキーワードについて

.eggignore内でextendsキーワードを使用すると、他の設定ファイルの内容を取り込むことができます。

例えば、以下のように記述すると、.gitignoreの内容を取り込むことができます。

extends .gitignore

補足2: 優先順位について

egg.json/egg.ymlignoreフィールドと、.eggignoreファイルが同時に指定された場合は、.eggignoreの内容が優先されるようです。

eggsを使用してモジュールを公開する

以下を前提に話を進めていきます:

nest.landへモジュールを公開したいときは、以下のコマンドを実行します:

$ eggs publish

公開されるモジュールのバージョンは、egg.json/egg.ymlversionフィールドで指定された値を元に決定されます。

ちなみに、--dry-runオプションを指定することで、ドライランを実行することもできます。(実際にモジュールが公開されることはありません)

$ eggs publish --dry-run

どのファイルがアップロードされるかを事前に確認することができるため、初めてのアップロード時は実行しておくとよいかもしれません。

新しいバージョンのモジュールを公開する

新しいバージョンのモジュールを公開したいときは、以下のいずれかの方法で行うことができます:

  • 事前にegg.json/egg.ymlversionフィールドを更新してからeggs publishを実行する。
  • eggs publishを実行する際に--versionオプションを指定する。
    • 例: eggs publish --version v1.0.4

GitHub Actionsを使用して、モジュールの公開を自動化する方法

公式ドキュメントにて、GitHub Actionsを使用して、モジュールのアップロードを自動化する方法が紹介されています。

例えば、次のような内容でGitリポジトリに.github/workflows/publish.ymlを用意します。

name: Publish this module to nest.land

on:
  release:
    types: [published]

jobs:
  publish-egg:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: denolib/setup-deno@master
        with:
          deno-version: 1.8.1
      - run: deno install -Af --unstable https://x.nest.land/eggs@0.3.4/eggs.ts
      - run: |
          export PATH="/home/runner/.deno/bin:$PATH"
          eggs link ${{ secrets.NESTAPIKEY }}
          eggs publish --yes

すると、GitHub上でリリースを公開する度に、自動的にnest.landへモジュールが公開されるようになります。

上記のGitHubアクションを動作させるためには、事前にNESTAPIKEYという名前のシークレットにnest.landのAPIキーを設定しておく必要があります。詳しくは、こちらのページを参照ください。

nest.landに公開されているモジュールの探し方

公式のギャラリーページから探すことができます。

おわりに

この記事では、nest.landとeggsの使用方法について解説しました。

eggsには、他にもeggs installeggs update等、便利なサブコマンドが提供されているため、興味のある方はぜひお試しください!

参考情報

Discussion