Visual Studio Code の拡張機能を開発してみよう

みなさん、Visual Studio Code使ってますか?

Visual Studio Code(以下VSCode)は、Microsoft が作ってるテキストエディタです。ここ数年で名前を聞くことがとても多くなったので、使ってる方は結構増えてきているのではないかと思います。
名前に Visual Studio と入っているので誤解されがちですが、WindowsだけでなくMacでも Linux でも動作します。

VSCode は拡張機能によって機能追加することができますが、この拡張機能はTypeScriptやJavaScriptで個人で開発してマーケットプレイスに追加することができます。

わたしも「multi-command」という複数の VSCode のコマンドを 1アクションで実行できるようにする拡張機能を公開しています。

今回、multi-command での機能追加にあわせて、新調した PC に VSCode の拡張機能の開発環境をセットアップし直したので、拡張機能の開発環境構築〜マーケットプレイス公開までの手順として備忘録を残しておきます。

環境

  • macOS Mojave 10.14.2
  • Visual Studio Code 1.25.1
  • yo 2.0.5
  • generator-code 1.1.44
  • vsce 1.54.0

手順

流れとしては下記になります。

  1. ツール群をインストールする
  2. yo で拡張機能のプロジェクトを作成する
  3. 拡張機能のコードを書く
  4. マーケットプレイスで公開する

詳細見ていきます。

1. ツール群をインストールする

まずは開発に必要なツール群をインストールしますが、すべてのツールは npm で管理されています。

先に npm のインストールが必要になりますのであらかじめインストールしておいてください。(たぶん yarn など他のパッケージマネージャでも可)

VSCode の拡張機能の開発で使うツールは、yo generator-code です。また、マーケットプレイスに拡張機能を公開する際に必要になる vsce も合わせてインストールしておきます。

  • yo
    Yeomanというツール. テンプレート(generator)からプロジェクトを作成するためのツール
  • genetor-code
    VSCode 拡張機能を開発するための yo の generator
  • vsce
    Visual Studio Code Extension Manager. VSCode 拡張機能管理ツール

2. yo で拡張機能のプロジェクトを作成する

yo を使って拡張機能の雛形を作成します。

下記を実行します。

実行すると、プロジェクトの設定を聞かれるので答えていきます。

問題なく実行できれば、ここで指定した名前のディレクトリができているはずです。

拡張機能の Hello World 的なものがすでにセットアップされた状態になっているはずなので、試しにこの拡張機能を動作させてみます。

VSCode でこの拡張機能のプロジェクトを開き、F5 でデバッグ実行できます。

F5 で「拡張機能開発ホスト」と書いた新しいウィンドウが開きます。
開発中の拡張機能が読み込まれた状態になっています。

この状態でコマンドパレットを開くと( mac の場合は cmd + shift + p) 、「Hello World」 というコマンドが追加されていて、実行すると右下に Hello World というポップアップが表示されるようになっています。

もし Hello World コマンドがコマンドパレットから実行できなかった場合、拡張機能が正しく読み込まれていない場合があります。F5 で拡張機能開発ホストを立ち上げた時に右下にエラーメッセージが表示されていると思いますので、対処しておきましょう。

わたしが遭遇したエラーは下記の 2つでした。

  • publisher プロパティは必須で、string 型でなければなりません。」
    後の章で公開する際に、マーケットプレイスに表示される公開した人の名前です。yo でテンプレート作成した時に設定されていなかったので、手動で設定する必要がありました。現段階では適当な文字列で良いので設定しておきましょう。
    プロジェクトのディレクトリにある package.json に設定を追加します。

  • 「拡張機能が Code 1.25.1 と互換性がありません。拡張機能に必要なバージョン: ^1.30.0。」
    yo で作成したプロジェクトで記載されている VSCode の動作バージョンが、mac でインストールしていたバージョンよりも新しいバージョンになっていました。こちらも package.json の動作バージョンを修正して対処しました。VSCodeを更新してバージョンを合わせても良いかと思います。

動作確認ができない状態で開発はできないので、この段階で Hello World 実行できるようにエラーをつぶしておきましょう。

3. 拡張機能のコードを書く

拡張機能のコードを書いていきます。コードは src/extension.ts にあります。初期状態では短いコードなので貼り付けますね。

拡張機能が読み込まれた時に activate が呼び出されるので、その中で自分が欲しい機能を実装していく流れになります。

雛形で行っているのは registerCommand でコマンドを追加し、コマンド実行時に showInformationMessage でポップアップを表示する感じです。

結構簡単に開発できそうな感じがしませんか?

拡張機能の作り方に関しての Tips を後の章で書いてますので、開発の際は参考にしてみてください。

4. マーケットプレイスで公開する

欲しい機能が実装できたらマーケットプレイスに公開して、他の人が使えるようにしてみましょう。

少し手順があるので順を追って説明していきます。

4-1. Azure DevOps に登録する

まずは Azure DevOps (以前の Visual Studio Team Services) に登録する必要があります。

既に登録していれば、この手順はスキップしてください。

Azure DevOps に登録するためには Microsoft アカウントが必要になります。すでにアカウントがあればそれを使えますし、無ければ新規に作成します。

Azure DevOps のページにアクセス し、「無料ではじめる」をクリックすれば Azure DevOps に登録が完了し、自動的に Azure DevOps にサインインします。

4-2. アクセストークンを作成する

Azure DevOps のページから、拡張機能公開用のアクセストークンを作成し、取得します。

このあたりの説明は公式が画像つきで詳細に解説してくれているので、公式の方も参照ください。

Visual Studio Code 公式の解説

  1. Azure DevOps へのサインインが完了したら、右上のアカウントのイニシャルが表示されているところをクリックし、Security を選択

  2. Personal access token -> New Token

  3. 管理用の名前を設定(Name欄)

  4. Organaization を All accessible organaizations に変更

  5. 有効期限を設定。最長で 1年まで設定できます。

  6. Scopes を Custom defined に設定

  7. Marketplace のスコープで、”Acuire” と “Manage” にチェック。
    Marketplace のスコープは初期状態では表示されていないので、下部の show all scope をクリックして表示させる必要があります。

  8. Create をクリックして作成

作成が完了したら画面にアクセストークンが表示されるので、それをコピーして保存しておきます。アクセストークンはこのタイミングでしか表示されません。

4-3. アクセストークンを使って publisher を作成する

あらかじめインストールしておいた vsce コマンドを使い、拡張機能の publisher を作成します。
この際、先程作成したアクセストークンを使って publisher と紐づけます。

vsce create-publisher publisher名 で publisher を作成できます。その際、Personal Access Token を聞かれますので、先程コピーしたアクセストークンを貼り付けます。

publisher はすでに他の人が登録していたら登録することはできませんので、その場合は別の名前にしましょう。

4-4. package.json を編集する

公開前に package.json を編集しておきます。

最低限、”publisher” の項目は先程作成した publisher の名前に合わせて置く必要があります。

他にも、バージョン番号やアイコンなどが設定できます。

設定できる項目は公式の Extension Manifest に説明がありますので、そちらを参照ください。

4-5. vsce コマンドで公開する

準備ができたら、再び vsce コマンドで公開します。

プロジェクトのディレクトリにて、vsce package でパッケージ作成、vsce publish でマーケットプレイスに公開できます。

vsce publish が成功すると最後に拡張機能のページの URL が表示されます。アクセスすると無事公開できていることがわかるかと思います。(反映まで少し時間がかかるみたいです。わたしの場合は数分後にアクセスしたら見れました)

公開できましたか?お疲れ様でした!

開発のTips

“multi-command” で開発する際に調べた拡張機能の実装方法なども書いておきます。

コマンドの登録は vscode.commands.registerCommand

Hello World 時点で既に実行されていますが、コマンドの登録には vscode.commands.registerCommand('コマンド名', 実行する処理) を使います。

登録したコマンド、他のコマンドと同様にキーバインドを割り当てることができるので、例えば Hello World であれば VSCode のキーバインドの設定 keybindings.json で下記のように記述すればキーバインドを割り当てて実行することができます。

ただし、registerCommandだけではコマンドパレットから登録したコマンドを呼び出すことができません

コマンドパレットからコマンドを呼び出せるようにするには package.json の contribute を使う

registerCommand で登録したコマンドをコマンドパレットから呼び出したい場合は package.json で設定を追加する必要があります。Hello World だと下記の部分ですね。

ここで registerCommand で登録したコマンドと、表示名を設定してあげることで、コマンドパレットから呼び出すことができます。

拡張機能内で他のコマンドを実行する

拡張機能内で、vscode.commands.executeCommand('コマンド名') とすると、他のコマンドを実行することができます。

他の拡張機能が持っているコマンドについては、VSCode の拡張機能の「コントリビューション」の項目で確認できます。

このあたり、別の記事にも書いたのでそちらも参照ください。

おわりに

拡張機能の実装方法自体はそれほどややこしくなく、開発環境を作るのも容易なのがわかっていただけると嬉しいです。

ちょっと公開するところが面倒なんですが、Azure DevOps の登録などは一度してしまえば良いので、この記事を参考に一度チャレンジしてみてください。

便利な拡張機能作ったらぜひ教えてください! -> りゅーたのTwitter


最後まで読んでいただきありがとうございます。 このブログを「いいな」と感じていただけましたら、Twiter にてフォローいただけるとうれしいです。ブログ更新情報などもお届けします。



この記事をシェアする




コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA