diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index a697eef..ed80173 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -43,6 +43,9 @@ jobs: - name: Fetch MNIST model run: mise run fetch-mnist-rclone + - name: Prefetch dependencies + run: mise run prefetch + - name: Build WASM modules run: mise run build-modules diff --git a/.gitignore b/.gitignore index 07cb91e..5fc6dbf 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,5 @@ __pycache__/ .pytest_cache/ .python-version uv.lock +node_modules/ +pnpm-lock.yaml diff --git a/.mise.toml b/.mise.toml index aa95113..c9f51ca 100644 --- a/.mise.toml +++ b/.mise.toml @@ -38,6 +38,7 @@ pipx = "latest" "pipx:cmake" = "latest" "pipx:componentize-py" = "latest" "pipx:pytest" = "latest" +pnpm = "latest" protoc = "latest" python = "3.13" rclone = "latest" @@ -154,7 +155,10 @@ depends = ["cargo-check"] run = "osv-scanner --lockfile Cargo.lock" [tasks.prefetch] -depends = ["download-models"] +# `build-ws-wasm-agent` produces `services/ws-wasm-agent/pkg/`, which the +# static workspace references via a `link:` path. Run it before `pnpm install` +# so the link target exists. +depends = ["download-models", "build-ws-wasm-agent"] description = "Pre-download all dependencies and models (Rust crates, Dart packages, Python envs, Java/Maven, .NET, Node, WIT)" run = """ cargo check --workspace @@ -163,10 +167,16 @@ uv sync --directory services/ws-modules/pydata1 uv sync --directory services/ws-modules/pyface1 mvn dependency:resolve --quiet dotnet restore -npm install --prefix services/ws-server/static +pnpm install --dir services/ws-server/static --ignore-scripts --config.ignoredBuiltDependencies=protobufjs zig build --fetch --build-file services/ws-modules/zig-data1/build.zig """ +# pnpm refuses non-TTY destructive node_modules cleanup unless `CI=true`, +# which fires when an earlier install left a different layout (e.g. before +# `link:` was wired up). Treat `mise run prefetch` as a CI-style batch. +[tasks.prefetch.env] +CI = "true" + [tasks.regenerate-verification] alias = "regen-verification" description = "Regenerate checked-in verification output files" diff --git a/services/ws-server/Dockerfile b/services/ws-server/Dockerfile index 1316d9a..608efcc 100644 --- a/services/ws-server/Dockerfile +++ b/services/ws-server/Dockerfile @@ -8,13 +8,20 @@ RUN apt-get update \ npm \ pkg-config \ protobuf-compiler \ - && rm -rf /var/lib/apt/lists/* + && rm -rf /var/lib/apt/lists/* \ + && npm install -g pnpm WORKDIR /workspace COPY . . -RUN npm install --omit=dev --prefix /workspace/runtime-deps onnxruntime-web pyodide +# `--config.node-linker=hoisted` writes packages directly under +# `node_modules/` instead of symlinking into `.pnpm/`, so the downstream +# `COPY --from=builder /workspace/runtime-deps/node_modules/onnxruntime-web` +# step picks up a real directory. +RUN pnpm add --prod --dir /workspace/runtime-deps --config.node-linker=hoisted \ + --ignore-scripts --config.ignoredBuiltDependencies=protobufjs \ + onnxruntime-web pyodide RUN cargo build -p et-ws-server --release --locked FROM debian:bookworm-slim AS runtime diff --git a/services/ws-server/static/package.json b/services/ws-server/static/package.json index a5c124d..b8e23c4 100644 --- a/services/ws-server/static/package.json +++ b/services/ws-server/static/package.json @@ -9,7 +9,7 @@ "style.css" ], "dependencies": { - "et-ws-wasm-agent": "*", + "et-ws-wasm-agent": "link:../../ws-wasm-agent/pkg", "onnxruntime-web": "*" } }