VScode の extension を作ろうとしていきなりつまづいた

VSCode のオレオレ extension を作りたいと思った。作りたいよね?

Your First Extension | Visual Studio Code Extension API

↑に従って開発を始めた。

global install はしたくない & 普段 pnpm を使っているので、コマンドを微修正しながら進めた。

pnpm init
pnpm install yo generator-code
pnpm yo code

prompt に対する回答は以下のようにした。

     _-----_     ╭──────────────────────────╮
    |       |    │   Welcome to the Visual  │
    |--(o)--|    │   Studio Code Extension  │
   `---------´   │        generator!        │
    ( _´U`_ )    ╰──────────────────────────╯
    /___A___\   /
     |  ~  |     
   __'.___.'__   
 ´   `  |° ´ Y ` 

? What type of extension do you want to create? New Extension (TypeScript)
? What's the name of your extension? code-block-input
? What's the identifier of your extension? code-block-input
? What's the description of your extension? 
? Initialize a git repository? Yes
? Which bundler to use? none
? Which package manager to use? pnpm

その後、Extension Development Host window を開いたのだが、目当ての Hello World が見つからない。 エラーらしきものはないし、QuickStart の一番最初からつまづいた。

console には Deprecation Warning がでているのみ。

(node:91877) [DEP0005] DeprecationWarning: Buffer() is deprecated due to security and usability issues. Please use the Buffer.alloc(), Buffer.allocUnsafe(), or Buffer.from() methods instead.
(Use `Code Helper (Plugin) --trace-deprecation ...` to show where the warning was created)

パッと思いつく要因は

  • pnpm を使う場合にバグがある
  • pnpm x TypeScript で開発する場合にバグがある
  • extension の名前を kebab-case にしているのがまずい

何度でも作り直しが効くので、何パターンかためしてみることにした。 (余談だが、実行したコマンドのメモをとっておくと、こういう時にコピペで済むので楽だ。)

  • pnpm x JavaScript, project 名を sample にしたら成功
  • pnpm x TypeScript, project 名を sample にしたら成功

これらが成功するということは、 どうやら kebab-case にしたのが原因?と思ったところで、

? Do you want to open the new folder with Visual Studio Code? Open with `code`

の設問が気になった。もしかしたら vscode の project root をどこにするかの問題なのでは?と思って検証したらビンゴ。

要は、

├── vscode-extensions  # ここで pnpm init などを実行
│   ├── sample  # `yo code` によって生成されたファイル 
│   ├── node_modules
│   ├── package.json
│   ├── pnpm-lock.yaml

F5 を押す時に extension の root (上の図なら sample/)を project root として開いていないと Helloworld が見つからない、という話だった模様。

package を global install していたら簡単に気づける問題だったが、生成された directory にも package.json が作られているので混乱した。

kebab-case でも 問題なく extension はつくれた。