あるSEのつぶやき・改

ITやシステム開発などの技術に関する話題を、取り上げたりしています。

Obsidianプラグインの作り方

はじめに

Obsidian プラグインの作り方を、備忘録として残しておきます。

今までに作成した Obsidian プラグインは、以下になります。

開発環境

Obsidian プラグインの開発には、以下が必要です。

  • Visual Studio Code
  • Node.js
  • TypeScript

開発用の Vault を作成します。ここでは、plugins という Vault 名にします。

Obsidian の表示言語を English に変更します。

現時点では、レビュアーの方もユーザーも英語を使っているようなので合わせます。

必要なリポジトリを git clone します。

$ cd plugins/.obsidian/plugins
$ git clone https://github.com/pjeby/hot-reload
$ git clone https://github.com/obsidianmd/obsidian-sample-plugin

hot-reload は Obsidian プラグイン開発専用プラグインで、プラグインの修正をすぐに Obsidian に反映します。

ただし、hot-reload はプラグインとして公開されていないため git clone で取得する必要があります。

obsidian-sample-plugin は、Obsidian プラグインのテンプレートです。

テンプレートを開発するプラグイン名に変更します。ここでは、 media-sync とします。

$ mv obsidian-sample-plugin media-sync

manifest.json を、自分が開発するプラグインの内容に書き換えます。

以下は Media Sync の例ですが、適宜書き換えてください。

{
    "id": "media-sync",
    "name": "Media Sync",
    "version": "0.0.1",
    "minAppVersion": "0.0.0",
    "description": "Downloads media files(eg. images, PDFs) from the URLs in documents and displays the content.",
    "author": "fnya",
    "authorUrl": "https://github.com/fnya",
    "isDesktopOnly": true
}

isDesktopOnly のデフォルトは false で、このままだとパソコンとモバイルの両方で動作するプラグインとなります。パソコンに限定したい場合は isDesktopOnlytrue にします。

package.json の必要箇所を修正します。

以下は Mesia Sync の例です。

{
    "name": "media-sync",
    "version": "0.0.1",
    "description": "Downloads media files(eg. images, PDFs) from the URLs in documents and displays the content.",
    "author": "fnya",
    "license": "MIT",
    "repository": {
        "type": "git",
        "url": "git+https://github.com/fnya/media-sync.git"
    },
}

プラグインに必要なライブラリをインストール後、起動します。

$ cd media-sync
$ npm install
$ npm run dev

Obsian で、Community plugins を有効にした後で、Hot ReloadMedia Sync を有効にします。

これで開発環境が整いました。

プラグインを開発する

実際のプラグイン開発は、下記の公式ドキュメントやフォーラムを参照しながら行います。

アイコンを使用する場合は、以下で使用可能なアイコンを調べることができます。

GitHub Actions でビルドを実行する

.github/workflows/release.yml を作成することで、GitHub でタグ作成時にビルドを実行できるようになります。

name: Release Obsidian plugin

on:
  push:
    tags:
      - "*"

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3

      - name: Use Node.js
        uses: actions/setup-node@v3
        with:
          node-version: "18.x"

      - name: Build plugin
        run: |
          npm install
          npm run build

      - name: Create release
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          tag="${GITHUB_REF#refs/tags/}"

          gh release create "$tag" \
            --title="$tag" \
            --draft \
            main.js manifest.json styles.css

GitHub Actions を実行するには、リポジトリで GitHub Actions に Read and write permissions の権限を付与する必要があります。

GitHub Actions 実行後に、リリースの Draft が自動で作成されます。

Draft のリリースを、Publish release することでリリースを作成します。

リリースに含まれる main.js, manifest.json, style.css がプラグイン申請時に必要な情報となります(style.css はオプション)。

プラグインを申請する

Obsidian プラグインの申請は、下記ドキュメントに従っていれば基本的に問題ありません。

以下に概要を記載します。

申請前に、下記の条件が満たされているか確認します。

  • GitHub のリポジトリで、下記ファイルが含まれていること
    • README.md
    • LICENSE
    • manifest.json
  • GitHub で下記ファイルを含むリリースが作成されていること
    • main.js
    • manifest.json
    • styles.css (オプション)

README.md には、機能だけでなく操作方法の説明も必要です。README.md がユーザーに公開される説明になるためです。

community-plugins.json を編集して、プラグイン申請の Pull request を作成します。

ドキュメントにあるように、申請内容を追記します。

{
  "id": "doggo-dictation",
  "name": "Doggo Dictation",
  "author": "John Dolittle",
  "description": "Transcribes dog speech into notes.",
  "repo": "drdolittle/doggo-dictation"
}

idcommunity-plugins.json に存在しない新しいものであることと、obsidian を含まない必要があります。

repo はプラグインのリポジトリで、https://github.com/を除いたものになります。

Media Syncの場合は、以下のようになりました。

分かりにくいですが、先頭の },, を付けないと Pull request のビルドで失敗します。

Commit message には、"Add [...] plugin" の形式で入力します。

下記は、 Remove Empty Folders というプラグインの場合になります。

Create pull request をクリックします。

次がわかりづらくてハマるのですが、Preview タブをクリック後、Community Plunin のリンクをクリックして Pull request を作成します。

この流れで Pull request を作成しないと、ビルドで失敗するのでご注意ください。

すると、下記のように Pull request が作成されるので、必要な内容を記入します。

[ ][x] と変更することで、チェックをつけることができます。

Pull request を作成し、ビルドが完了すれば申請完了です。

レビューで指摘が入った場合は対応を行います。

プラグインの承認までは、結構時間がかかります。

ドキュメントにも記載がありますが、気長に待ってください。2週間くらいかかったこともあります。

他の Pull request がマージされるとコンフリクトが発生するので、適宜解消してください。

実際に申請したプラグインは、以下になります。

タイトルが異なるものがありますが、これは Pull request 作成後に自動変換されています。

Pull request がマージされると、 Community plugins に表示されるようになります。

説明の部分が README.md になります。

プラグインのアップデート

プラグインをアップデートする場合は、修正内容をリポジトリに反映させて、タグを付けてからリリースを作成します。

申請は不要です。

おわりに

備忘録ですが、お役に立てば幸いです。