ほりひログ

所属組織の製品 (Azure とか) に関連する内容が多めだけど、個人の見解であって、所属組織を代表する公式情報ではないです。

VS code extension に初トライ!!

f:id:horihiro:20210307163813p:plain

初めての VS code extension 開発

Hello World extension しか作ったことがなかったので、普通に使うもの(自分が、ね)を想定してチャレンジ。
主に下の教科書と公式サイトを行ったり来たりしてた感じ。
# 今年の2月からは、本業 (VS code とは関係ないけども) で著者の方々に大変お世話になっています。 www.amazon.co.jp

作った VS code extension

denofunc (Azure Functions のカスタム ハンドラーdeno で作りデプロイする CLI ツール) のコマンドを、VS code のコマンド パレットから操作するもの。

基本的に denofunc のラッパーなので、できることはこれ (だけ) 。

  • プロジェクト フォルダーの初期化
  • テンプレートからの関数追加
  • Azure Functions へのデプロイ

# えぇ、ターミナルでできるんですけどね。

なお Tree View とか Webview といった、extensin 感あるやつは一切使っていない。

ハマりポイント

初めての VS code extension 開発で少しハマったポイントをご紹介。

通知は await しない方がよさげ

右下のやつ。 f:id:horihiro:20210307190121p:plain

通知を出すのは、vscode.window 名前空間の下記メソッドたち。

  • showInformationMessage
  • showWarningMessage
  • showErrorMessage

戻り値の型が Thenable なので、盲目的に await を付けて使っていたけど、それをやると当然 resolve するまで処理が返ってこない。

通知の振る舞いとしてはその挙動は違和感があったので、await なしの方がいい気がする。
モーダルなダイアログを出したければ、await して 第二引数に {modal: true} を入れるとよい。

GitHub のブランチ名は注意

README.md 内で画像などのリンクを相対パスで書くと (![](relative/path/to/image.jpg) みたいに) 、vsix パッケージの生成処理 (vsce packagevsce publish の実行時) 内で、 package.json 内の repository を使って絶対パスに書き直される。

気を付けないといけないのが、上記絶対パス内のブランチ名として、既定では master が使用される。
なので、何も考えずにパッケージを作ったり publish すると master ブランチにリンクされるが、最近は main ブランチで作ることが流行りっぽいので、ブランチ自体が存在せず画像のリンクが切れる。

この README.md を修正するためにバージョン アップするのは (patch とはいえ) あまりやりたくない作業なので、気を付けた方がいい。

ちなみに最近ソースコード上では、master から HEAD に変わった様子。

github.com

ただ、この PR は vsce の最新バージョン (2021/3/7 現在 1.85.1) にまだ含まれていない (タッチの差)。
なので、 vsce の最新バージョンではまだ master が既定なので --githubBranch オプションで GitHub リポジトリのブランチ名を指定することを強く推奨。

(3/12 追記)
----
修正バージョン 1.86.0 がリリースされてた。

www.npmjs.com f:id:horihiro:20210312080821p:plain
----

OutputChannel に出す文字に色が付けられない

OutputChannel は、ログなどを出せるパネル。

f:id:horihiro:20210307203129p:plain

通常、コマンドプロンプトbash などでは、標準出力/標準エラー出力にこういう色が付けられる。
f:id:horihiro:20210307192941p:plain

一方で VS code の OutputChannel はまだカラー対応していないらしい。探すと issue がいっぱい出てくるが例えばこれ。

github.com

上記と同じ出力をそのまま VS code extension から OutputChannel に出力すると、ANSI color code? escape code? がそのままでてくる。
f:id:horihiro:20210307193110p:plain
# 最初、何が出ているのか理解できなかった。

結局正規表現ANSI code を削除している。苦肉の策。

ついでのメモ

今回作った extension では child_processspawn を使って denofuncaz を実行している。
この時、spawn の引数に {shell: true} を渡してあげないと、指定したコマンド(denoaz)が見つからず、ENOENT が発生する。Windows (コマンド プロンプト) と WSL2 (bash) で確認。

最後に

公開した extension の Visual Studio Marketplace のページ、GitHub リポジトリーはこちら。

marketplace.visualstudio.com

github.com