開発ガイド¶
このページでは、YanmaJS 自体の開発に必要なビルド・テスト・ツールの使い方を説明します。
前提条件¶
- Docker / Docker Compose
- Zig 0.16.0 以降(ホストで直接ビルドする場合)
YanmaJS の開発は Docker コンテナ上で行うことを前提としています。ホスト側に Zig をインストールしなくても、Docker 経由でビルド・テストが実行できます。
開発コンテナと UID/GID¶
コンテナはホストのユーザー ID(UID)・グループ ID(GID)で起動できます。これにより、コンテナ内で生成されたファイル(zig-out/ など)がホスト側でも自分の所有になり、権限の食い違いを避けられます。UID/GID を指定しない場合は既定値 1000:1000 で起動します。
自分の UID/GID が 1000 以外の場合は、リポジトリルートに .env を作成して指定します(.env は git 管理外)。
docker compose は .env を自動で読み込み、compose.yaml の user: "${UID:-1000}:${GID:-1000}" に反映します。
プロジェクト構成¶
コンポーネントの一覧・役割・依存関係はコンポーネント構成を参照してください。
ビルド¶
Docker Compose 経由でビルドする場合は make build を使います。エンジン(yanmajs/)と CLI(yanmajs_cli/)の両方がビルドされます。
これは内部的に以下のコマンドを実行します。
ホストに Zig 0.16.0+ がインストールされている場合は、リポジトリルートで直接 zig build を実行することもできます。
リポジトリ全体は単一の build.zig(ルート)で構成され、エンジン(yanmajs/)・ランタイム(yanmajs_runtime/)・CLI(yanmajs_cli/)などをモジュールとして繋いでいます。既定の zig build はエンジンの静的ライブラリと CLI(zig-out/bin/yanmajs)を生成します。make build-cli も同じ既定ビルドの別名です。
テスト¶
内部的には docker compose run --rm dev sh -c "zig build test --summary all" が実行されます。ホスト上で直接テストする場合は make test-native を使うか、リポジトリルートで zig build test --summary all を実行してください。
yanmajs_runtime(EventLoop/FsModuleLoader/console・rejection ポリシー)のテストは別コマンドです。
内部的には docker compose run --rm dev sh -c "zig build test-runtime --summary all" が実行されます。
C ABI(yanmajs_capi)¶
C ABI 層は yanmajs_capi/ のソースとして提供され、ルートの build.zig の capi ステップでビルドします。詳細な API 面の説明は C API ガイドを参照してください。
内部的には docker compose run --rm dev sh -c "zig build capi" が実行され、zig-out/lib/libyanmajs.so・zig-out/include/yanmajs.h が生成されます。
capi.zig 内のスモークテスト(13 本)を実行します(内部的には zig build test-capi --summary all)。
C API のサンプル(examples-c)¶
C ABI のサンプル 4 本(example/c/*.c)を、共有ライブラリ libyanmajs.so に対してビルドし、そのまま実行します。
内部的には docker compose run --rm dev sh -c "zig build examples-c" が実行されます。
CLI¶
YanmaJS は簡易的な CLI(yanmajs 実行ファイル)も yanmajs_cli/ のソースとして提供しています。make build(または make build-cli)でビルドすると zig-out/bin/yanmajs が生成されます。
# スクリプトファイルを実行
./zig-out/bin/yanmajs script.js
# 式を直接評価
./zig-out/bin/yanmajs -e "1 + 2"
# 引数なしで REPL を起動
./zig-out/bin/yanmajs
# 標準入力から読み込む
echo "1 + 2" | ./zig-out/bin/yanmajs
# ES モジュールとして実行(import/export・top-level await が使える)
./zig-out/bin/yanmajs --module main.mjs
モジュール関連のオプション¶
| オプション | 説明 |
|---|---|
--module |
入力をスクリプトではなく ES モジュールとして評価する |
--module-base <dir> |
相対 specifier(./x.js 等)の解決基準ディレクトリ。省略時はファイル実行なら そのファイルのディレクトリ、stdin/-e ならカレントディレクトリ |
--module-entry <path> |
エントリモジュールのレジストリ登録キーを明示する(stdin 経由でソースを流しつつ、自己 import の同一性を成立させたい場合に使う) |
--test262-harness |
test262 用の $262 ホストオブジェクト(createRealm/evalScript/gc/global)を注入する。通常の実行では不要 |
CLI はファイルシステムベースのモジュールローダーを内蔵しており、import()(dynamic import)はスクリプト実行時にも利用できます。
WASM サンドボックス(プレイグラウンド)¶
YanmaJS には、ブラウザ上で動作する WASM 版のプレイグラウンドが付属しています(WASM ビルドは yanmajs_wasm、HTML ページは yanmajs_sandbox)。以下のコマンドでビルドし、ローカルサーバーで配信できます。
build-sandbox は WASM バイナリをビルドして docs/sandbox/ に配置し、serve-docs は docs/ ディレクトリを簡易 HTTP サーバー(デフォルトでポート 8080)で公開します。ブラウザで http://localhost:8080/sandbox/ を開くと、その場で JavaScript コードを実行できるプレイグラウンドが利用できます。
ドキュメントビルド¶
WASM サンドボックスのビルド、zensical によるドキュメント生成、サンドボックスの docs/ への配備を一括で行います。生成されたドキュメントは make serve-docs でローカル確認できます。
Makefile タスク一覧¶
| タスク | 説明 |
|---|---|
make build |
エンジン(yanmajs/)+CLI(yanmajs_cli/)のビルド |
make build-cli |
CLI(yanmajs_cli/)のみビルド |
make test |
エンジンのユニットテスト(Docker) |
make test-native |
エンジンのユニットテスト(ホスト直接) |
make test-runtime |
yanmajs_runtime のユニットテスト |
make format |
ソースコードのフォーマット |
make run |
CLI のビルド+起動 |
make run-shell |
開発コンテナのシェルに入る |
make clean |
ビルド成果物の削除 |
make run-bench |
ベンチマーク実行 |
make build-capi |
C ABI 共有ライブラリ(yanmajs_capi/)のビルド |
make test-capi |
C ABI(yanmajs_capi/)のユニットテスト |
make examples-c |
C API サンプル(example/c/*.c)のビルド+実行 |
make build-wasm |
WASM バイナリのビルド |
make build-sandbox |
サンドボックスの docs/ への配備 |
make build-doc |
ドキュメント一括ビルド |
make serve-docs |
ドキュメントのローカルサーバー起動 |
make test262 |
test262 準拠テストの実行 |
make test262-setup |
test262 リポジトリのクローン |