GitHub Releaseを使ってRevitアドインの更新を検知する【RevitAPI】

はじめに


AMDlab BIMソフトウェアエンジニアの河野(twitter@tatsukikouno)です。
キャッチアップ画像はリモートワークを手伝ってくれている猫のゲンジです。

今回は、GitHub Releaseをチェックして自動でRevitアドイン用のモジュールを置き換えるサンプルプログラムを作成してみたので、その紹介記事になります。
どちらかというと開発者目線の内容になりますが、一助になれば幸いです。

ソースコード全文はGitHubをご参照ください。
なお、本プログラムにはDLLファイルの自動ダウンロードと配置機能が含まれていますが、検証は行っておらず、悪意あるコードが含まれているDLLファイルをRevitが実行してしまう恐れがあります。
ご利用はあくまで自己責任でお願いいたします。

ストーリー


あなたが現在利用しているアドインのバージョンはv1.0.0.0です。
開発者が何かしらの変更を加えたv2.0.0.0を作成し、GitHub Releaseにアップロードしました。
アドイン起動時、現在バージョンより新しいバージョンがGitHub Releaseに見つかるので、それをダウンロードし、現在のv1.0.0.0と置き換えます。

なお、GitHub Releaseに紐づけられているTagをバージョンとして認識しています。

手順1:UpdateCheckerを用意する


GitHub Releaseの状態をチェックするクラスUpdateCheckerを用意します。

コンストラクタでHttpClientとGitHub APIのURL、アクセストークンを受け取り、 GetLatestVersionAsync() で最新バージョンのチェックを行うクラスです。

対象リポジトリがpublicの場合、アクセストークンはなくても最新リリース情報を取得できます。
対象リポジトリがprivateの場合、アクセストークンを使用して認証する必要があります。

なお、 _httpClient.SendAsync(request) についている .ConfigureAwait(false); の記述が気になるかもしれませんが、Revit起動時の OnStartup() 内で非同期メソッドを実行する上での工夫になります。

 

手順2:削除予定の古いバージョンのモジュールがあれば削除する


古いバージョンは、後述する手順4で {deleteFileName}.dll にリネームされます。
このタイミングで削除してしまいます。

 

手順3:いい感じに前処理をしてから、UpdateCheckerで最新バージョンをチェックする


非同期処理を同期的に実行するため、  GetLatestVersionAsync().GetAwaiter().GetResult()  と記述しています。
ただし、非同期処理を同期的に待機すると呼び出し元のスレッドがブロックされることがあるため、 GetLatestVersionAsync() 内のawait部分で .ConfigureAwait(false)としています。

手順4:現在のバージョンより新しいバージョンが見つかったら、ダウンロードして配置する


Revit起動中、アドインのDLLを削除できないのは有名ですが、実はリネームは可能です。
現在のモジュールを {deleteFileName}.dll にリネームして、ダウンロードした新しいモジュールを配置します。
次回Revit起動時、手順1で古いモジュールを削除されます。

おわりに


今回は触れませんでしたが、GitHub Actionsを利用することでGitHub Releaseへのデプロイも自動化できます。
そうすれば、開発者はpushするだけで利用者に更新を通知できることになり、大変便利そうです。

サーバーを用意しなくてよいのも、中小規模なプロジェクトが多いRevitアドインで気軽に採用できてよさそうです。


AMDlabでは、開発に力を貸していただけるエンジニアさんを大募集しております。
少しでもご興味をお持ちいただけましたら、カジュアルにお話するだけでも大丈夫ですのでお気軽にご連絡ください!
中途求人ページ: https://www.amd-lab.com/recruit-list/mid-career

カジュアル面談がエントリーフォームからできるようになりました。
採用種別を「カジュアル面談(オンライン)」にして必要事項を記載の上送信してください!
エントリーフォーム: https://www.amd-lab.com/entry

 

 

ARTICLES