VSCodeから直接コードを共有できる拡張機能 Harigami for VSCodeを作った
先日、Qiitaで紹介したWebサービス「Harigami」のVSCode拡張を作成したので、開発でハマった部分を含め、共有します。
Harigamiとは
Harigamiは、ログインや新規登録不要で、ソースコードを共有できるWebサービスです。
トップページの入力フォームに共有したいソースコードを入力し、言語を選んで送信します。 すぐにURLが発行され、モーダルに表示されるので、それをコピーして共有します。
そのままTwitterやLINEで共有することもできます。
詳しくはこちらの記事をご覧ください。
ログイン不要/最短15秒でソースコードを共有できるWebアプリ「Harigami」を作った
HarigamiのVSCode拡張
今回紹介するHarigami for VSCodeは、Harigamiのコード共有機能を、Visual Studio Codeから利用可能にしたものです。 操作はとても簡単で、以下の動画のように、VSCodeでコードを書き、コマンドパレットから「Harigami for VSCode」を選択して実行するだけです。
すぐにURLが発行され、ポップアップに表示されるので、それをコピーして共有することができます。 共有時に、ブラウザでHarigamiを開く必要がありません。
拡張機能開発の流れ
VSCodeの拡張機能の開発は簡単でした。 おおまかな流れは以下のようなものです。
generatorをインストールする
npm install -g yo generator-code
下記コマンドで雛形を生成。対話形式で初期設定を行う
yo code
生成されたextension.tsを編集して開発する
package.jsonを編集する
vsce publishでMarketplaceに公開する
基本的には下記の1コマンドで公開できる(かんたん)
vsce publish
vsce publish
のあとに、「major」「minor」「patch」を指定することにより、バージョンを上げてくれる- majorは「1.0.0」、minorは「0.1.0」、patchは「0.0.1」の単位でバージョンを更新する
- 公開から数分以内でMarketplaceに反映される
Harigami for VSCodeの仕組み
Harigami for VSCodeは、VSCodeでアクティブなエディタの内容を取得して、Harigamiに送信します。
VS Code APIの、window.activeTextEditor.document.getText()
で、アクティブなエディタに記述されているテキストを取得できます。
また、window.activeTextEditor.document.languageId
で、言語の情報を取得できます。
取得できる言語のIdは「python」のように、言語名の先頭が小文字になっているものがほとんどです。
そのため、表記がHarigamiに登録されているものと異なる場合には、修正してHarigami側の言語名に置き換えるようにしました。
取得したテキストと言語情報を、Node.jsのrequest
モジュールを利用してHarigamiに送信します。
Harigamiのサーバーサイドに、専用のAPIを用意し、そこにPOST Requestを送信しています。
APIは、Harigamiのサーバーサイドで発行したURLを返します。ユーザーはそのURLを利用してコードを共有することができます。
ハマったところ
基本的にローカルの環境では、難しいことはありませんでした。 VS Code APIは使いやすく、デバッグも簡単に行えるので、スムーズに開発ができました。
個人的にハマったのは、Marketplaceに公開した後に、vscode extension develop running the contributed command: 'extension.submit2harigami' failed.
というエラーが発生し、利用できなくなることでした。開発環境で同様のエラーは発生せず、本番環境のみ、エラーが発生しました。
本番環境でデバッグ機能は使えないため、window.showInformationMessage()
という、ポップアップに任意のメッセージを表示するAPIを利用し、printデバッグのようにして原因を特定しました。
エラーの原因は、単純で、package.jsにdependencies
を書き忘れていたことでした。package.jsには、devDependencies
という項目があり、こちらには依存関係を記述していましたが、dependencies
は空になっていました。よって、ここにdevDependencies
と同様の依存関係を記述することにより、エラーが解消されました。