blenderアドオンにアップデート機能を追加してみよう。

これは昔からあるアップデート機能のモジュールらしいです。
Blender3.6で使えたので、4.0でも使えると思います。



■以下ハマったところを記述


・【注意点】プロパティの定義

ただ、サンプルで注意点があってこれはBlender2.7から2.8にAPIが変更になった際に有名な仕様変更だから分かる人はわかると思いますが、
アドオンプレファレンスに使うプロパティの定義が=ではなくて:になった事です。

っとうわけで、
下記をプロパティにすれば。

rna_uiItemR: property not found:

などのエラーは発生しません。

# addon updater preferences from `__init__`, be sure to copy all of them
auto_check_update : bpy.props.BoolProperty(
    name = "Auto-check for Update",
    description = "If enabled, auto-check for updates using an interval",
    default = False,
)

updater_intrval_months : bpy.props.IntProperty(
    name='Months',
    description = "Number of months between checking for updates",
    default=0,
    min=0
)
updater_intrval_days : bpy.props.IntProperty(
    name='Days',
    description = "Number of days between checking for updates",
    default=7,
    min=0,
)
updater_intrval_hours : bpy.props.IntProperty(
    name='Hours',
    description = "Number of hours between checking for updates",
    default=0,
    min=0,
    max=23
)
updater_intrval_minutes : bpy.props.IntProperty(
    name='Minutes',
    description = "Number of minutes between checking for updates",
    default=0,
    min=0,
    max=59
)



その他の設定はサイトの手順通りにすれば問題なくGITHUBから過去のバージョンまでゲットできます。

・タグに応じて過去のバージョンが出てくる


古い定義はテグ検索でてくる仕様なので、アドオンをアップデートしたら必ずタグも付けるようにしましょう。

プッシュに応じて出てきたらどうしようと思ったのですが、これは便利ですね。

■具体的な設定

・GITHUBの設定

GITHUBだと、
addon_updater_ops.py
の1356行あたりの設定をGITHUBの設定に応じて変更します。

私がメンテナンスしてるアドオンのGitHubの情報だと


  # Choose your own username, must match website (not needed for GitLab).
    updater.user = "Hydrocallis"

    # Choose your own repository, must match git name for GitHUb and Bitbucket,
    # for GitLab use project ID (numbers only).
    updater.repo = "Intellisense_for_Blender_Text_Editor"

    # updater.addon = # define at top of module, MUST be done first

    # Website for manual addon download, optional but recommended to set.
    updater.website = "https://github.com/Hydrocallis/Intellisense_for_Blender_Text_Editor"

といった感じで変更しました。

・競合回避のための設定

あと、パネルの情報も他のアドオンの競合しては駄目なので、変更する必要があります。

このアドオンはよく使われるモジュールなので設定はちゃんとしておきましょう。

これは75行にあり、

# to avoid clashes in operator registration.
updater.addon = "intellisense_updata"

としました。

この際、変にアンダーバーだったりハイフンなどを使ったらBlender側でバグるので他のアドオンと競合しない程度の名前変更にすればいいと思います。

・インポートの設定


アドオンのインポートは、__init__.pyの同層のフォルダに設置するだけです。
インポートは


form . import addon_updater_ops

で読み込めるはずです。

・ドロー関数に設定

読み込めたら、先程のプレファレンスの設定をした後、
def drawの関数に

addon_updater_ops.check_for_update_background(context)

を追加。

・レジスター関数に設定


最後に使用するオペレーターなどを読み込まないと行けないので、
アドオンプレファレンスが読み込まれる前のレジスター関数内のところで、

addon_updater_ops.register(bl_info)

を追加します。


・.gitignoreでいらないファイルは反映しないようにする

また、アドオンのメインフォルダにIntellisense_for_Blender_Text_Editor_updater_status
というフォルダを生成して中にJSONファイルでアップデート日時を管理してるようです。
ユーザーとしてはいいのですが、公開情報としてはいちいちアップデートの際に反映されて邪魔なので、gitignoreファイルに除外情報を入れておきましょう。

これで、gitには除外されてアドオン公開時には排除されます。

・ちなみに

/.gitignore
を入れるとこのファイル自体も除外対象になります。

その他、仮想環境の設定フォルダやキャッシュフォルダなど、さらす理由や差分がウザくなるだけなので除外対象にちゃんとしておきましょう。

/.gitignore
/.vscode
__pycache__/

上記の3つはいれといたほうがいい気がします。

■ここでレジスター関数の簡単な解説

・プロパティはregister()が実行されてないと存在しない

レジスター関数はBlenderがアドオンを読み込むときに使います。
われわれアドオン制作者が作った関数を読み込む専用の関数だと思って下さい。

慣例として、if __name__ == "__main__":の後に実行します。(なんでだったか忘れました。)

if __name__ == "__main__":
    register()

つまり、register()が実行されてないとその前にはまだ何も作ったものがBlenderには読み込まれてないので、読み込まれないもの(例えばシーンプロパティやパネルの変数やアドオンプレファレンスのプロパティなどの、ももろもろ)は存在しないわけです。

つまり、register()実行の後ならそれらは存在するわけで、その後なら存在が必要な関数を実行できるわけです。

・裏を返すと存在の際に事前に必要な関数はregister()の前に実行する

裏を返すとregister()内で必要な関数ができた場合は、register()の前に作って実行する必要があるとも言えます。


これ、blenderの重要な手順なので覚えて置いたほうが良いと思います。

■設置後の動作

ちなみに、実行はこんな感じです。


タグはGitHubのリリースから設定できこちらの情報を参照してるようです。