The recommended way to develop on tableauio/loader. One container, all four target languages (C++17, Go, .NET, Node) plus protobuf via vcpkg, pinned to the same toolchain CI uses. Version pins live in ./versions.env, consumed by the Dockerfile, make.py, and the CI workflows.
For native dev (no Docker, no WSL2), use make.py directly.
- Docker Desktop (Windows / macOS) or Docker Engine (Linux)
- VS Code with the Dev Containers extension
code .Then Dev Containers: Reopen in Container from the command palette. First build is one-time ~25 min (vcpkg compiles protobuf); reopens are near-instant.
Inside the container, python3 make.py setup is a no-op. Use python3 make.py test --lang <X> for any language.
LOADER_PROTOBUF_VERSION=3.21.12 code .Then Rebuild Container. Only the vcpkg layer rebuilds.
- Windows. WSL2 backend required. Check the workspace out under WSL2 (
\\wsl.localhost\Ubuntu\home\<user>\loader) — not/mnt/c/...— for good bind-mount performance. - Apple Silicon. Docker builds the image natively as arm64. Confirm with
docker info | grep Architecture. - Linux (native Docker Engine). No special configuration.
Single-stage Dockerfile on mcr.microsoft.com/devcontainers/cpp:1-ubuntu-24.04:
- Architecture detection (
TARGETARCH→ Go arch, buf arch, vcpkg triplet) - Go — version from
versions.env - buf — version from
versions.env - vcpkg pinned to
VCPKG_BASELINE_COMMIT, protobuf installed via manifest mode (asserts version) - .NET SDK — version from
versions.env - Node.js LTS — version from
versions.env ENV CMAKE_PREFIX_PATH=/opt/vcpkg/activesofind_package(Protobuf CONFIG)resolves automatically
Build context is .devcontainer/, so COPY versions.env … resolves directly.
- One
KEY=VALUEper line. - No quotes, no spaces around
=, no inline comments. - Comments at column 0 with
#. Blank lines ignored. No shell expansion.
Consumers: Dockerfile (sourced as a shell file), make.py (Versions.load()), and .github/actions/load-versions (exports to $GITHUB_ENV).
Use python3 make.py env for a JSON dump of resolved values.
Symptoms:
- C++:
fatal error: google/protobuf/generated_message_table_driven.h: No such file or directory - C#: hundreds of
error CS0101: The namespace already contains a definition for ...
The host workspace has gitignored *.pb.* from a previous protobuf version that git pull didn't remove. Wipe with python3 make.py clean --lang cpp (or --lang csharp), then rerun the test.
No Docker? Use make.py directly: python3 make.py setup --lang all then python3 make.py test --lang <X>. Works on macOS / Linux / Windows native.