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 はつくれた。