VSC拡張機能プロジェクトの準備

概要
VSCの拡張機能を開発するためのDevContainer環境を準備する手順を記録する。
参考リンク
公式ページ

初期コンテナ作成
- 開発用フォルダ作成
- VSCでフォルダを開く
- VSCの左下のメニューから「開発コンテナ構成ファイルを追加」を選択
- 「ワークスペースに構成を追加」を選択
- 公式の「Node.js & TypeScript devcontainers」を選択
- 既定のベースコンテナ(22-bookworm)を選択
-
.devcontainer/devcontainer.json
が生成されるので「コンテナで再度開く」を選択 - 開発に必要な拡張機能(Git Graphなど)を開発コンテナに追加して右クリック「devcontainer.jsonに追加」で自動追加に設定

VSC拡張機能のプロジェクト構成
Yeoman と VS Code Extension Generator をインストール
yarn global add yo generator-code
インストールが完了したら親ディレクトリでYeomanによるVSC拡張プロジェクト構成を実行。
cd ..
npx yo code
# 中略 - 以下は参考例
? What type of extension do you want to create? New Web Extension (TypeScript)
? What's the name of your extension? vscweb-sample
? What's the identifier of your extension? vscweb-sample
? What's the description of your extension?
? Initialize a git repository? Yes
? Which bundler to use? esbuild
? Which package manager to use? yarn
VSC拡張機能をインストール
推奨の拡張機能をインストール
- Extension Test Runner
- esbuild Problem Matchers
その他必要な拡張機能も開発環境にインストールしておく

Git環境構築
YeomanでGit環境を自動構築するがDevContainer環境の設定を追加で行う。
セキュリティ設定
プロジェクト名フォルダをセキュリティ対象から解除設定する。
git config --global --add safe.directory `pwd`
デフォルトリポジトリ名変更
ワークスペースでターミナルを開いてリポジトリを構成
git branch -m master main

Webテスト環境
yarn playwright install
sudo yarn playwright install-deps
package.json
の「デバッグ」から run-in-browser を実行。

TypeScriptのLint&Formatter
VSCのワークスペースに ESLint と Prettier を設定し、Gitのコミット時に自動で実行する環境を構築。
デファクトっぽい以下のツールを適用する。
- Husky: コミット時の自動処理用ツール
- ESLint: Linter
- Prettier: Formatter
インストール
Node.jsのパッケージに以下を追加
yarn add --dev husky eslint prettier eslint-config-prettier @eslint/core
VSCのDevContainerで拡張機能を有効化し、Node.jsの環境構築とHuskyのインストールを行う。
DevContainer設定ファイルの例
{
...
"customizations": {
"vscode": {
"extensions": [
...
"dbaeumer.vscode-eslint",
"esbenp.prettier-vscode"
]
}
},
"postStartCommand": "./.devcontainer/post-start.sh",
...
}
DevContainerの起動スクリプトの例
#!/bin/bash
# Abort script if any command returns an error.
set -euo pipefail
# Set the safe.directory
git config --global --add safe.directory `pwd`
# Setup typescript environment for development.
yarn install
# Install husky if not already installed.
if [ ! -d "./.husky/_" ]; then
yarn run husky install || true
fi
設定
package.json のスクリプトに以下を追加
package.jsonの抜粋記述例
"scripts": {
...
"lint": "eslint ./src",
"format": "prettier --write ./src/**/*.{js,jsx,ts,tsx,json,css,scss,md}"
},
ESLintの設定ファイルに必要項目を設定
eslint.config.mjsの記述例
import eslint from "@eslint/js";
import tseslint from "typescript-eslint";
import prettierConfig from "eslint-config-prettier";
import pluginChaiFriendly from "eslint-plugin-chai-friendly";
export default tseslint.config(
eslint.configs.recommended,
...tseslint.configs.recommended,
prettierConfig,
{
files: ["**/*.test.ts"],
plugins: { "chai-friendly": pluginChaiFriendly },
rules: {
"@typescript-eslint/no-unused-expressions": "off",
"chai-friendly/no-unused-expressions": "error",
},
},
);
Husky の pre-command フックを追加
.husky/pre-commit と .husky/pre-commit.sh の記述例
.husky/pre-commit.sh
#!/bin/bash
# List all staged files
STAGED_FILES=$(git diff --cached --name-only --diff-filter=d | grep -E '\.(js|ts|tsx)$')
if [ -z "$STAGED_FILES" ]; then
echo "No staged files to lint."
exit 0
fi
# check staged files dirrerent from working directory
DIFF_FOUND=0
for FILE in $STAGED_FILES; do
if [ -e "$FILE" ]; then
if ! git diff --quiet -- "$FILE"; then
echo "'$FILE' is different content from the staged and the working directory."
DIFF_FOUND=1
fi
else
echo "'$FILE' does not exist in the working directory."
fi
done
if [ $DIFF_FOUND -ne 0 ]; then
echo "Please stage the changes or reset the changes before committing."
exit 1
fi
# check by ESLint
echo "Linting and formatting staged files: $STAGED_FILES"
yarn run eslint --fix --max-warnings 0 $STAGED_FILES
EXIT_CODE=$?
# check by Prettier
FORMATTED_FILES=$(yarn run -s prettier --list-different $STAGED_FILES)
if [ -n "$FORMATTED_FILES" ]; then
echo "Format files: $FORMATTED_FILES"
yarn run prettier --write $FORMATTED_FILES
EXIT_CODE=1
fi
if [ $EXIT_CODE -ne 0 ]; then
echo "ESlint or Prettier found issues and attempted to fix them. Please review the changes and commit again."
fi
exit $EXIT_CODE
参考情報

テスト実行
環境構築
拡張機能 Extension Test Runner をインストールしておく。
vscode-test を実行できる環境をDevContainer上に構築する。
初期状態でもVSCのテストビュー上でデバグ実行は可能。
通常のテストを実行すると vscode-test がヘッドレス環境に対応していないためエラー停止するので、以下の手順でダミーのX環境を構築する必要がある。
- 必要ライブラリを追加
- xvfb を起動
- $DISPLAY 環境変数を設定
devcontainer.json と post-start.sh の記述例
... (以下を追加)
# Install module for vscode-test/vscode-linux-arm64
sudo apt-get update && sudo apt-get install -y libnss3 libdbus-1-3 libatk1.0-0 libatk-bridge2.0-0 libgtk-3-dev libasound2 xvfb
sudo Xvfb :99 -screen 0 1024x768x16 &> /tmp/xvfb.log &
sleep 3
echo "Xvfb started"
ps -la
... (以下を追加)
"containerEnv": {
"DISPLAY": ":99"
}
コンテナをリビルドしてtestスクリプトが正常に実行できれば環境としては成功。
yarn run test
# `package.json` 内のスクリプトで "vscode-test" が実行される
この状態であれば Test Runner (テストビュー) でも実行可能になっているはず。
テスト記述
調査中
参考リンク