Developer Guide¶
How to develop across several SHiP packages at once: build unreleased
versions of dependencies (e.g. hack on data-model and aegir
together) and test upstream PRs (e.g. a phlex
PR) underneath our stack.
Every repo works out of the box in binary mode: pixi install
resolves released packages from
prefix.dev/ship and conda-forge,
and you only build the repo you're in. That's the default, and it's
what CI uses. This guide is about the opt-in source mode on top of
it, built on pixi's source
dependencies
(the pixi-build preview feature) and on a local conda channel for
the cases source dependencies can't cover yet.
Repository layout convention¶
All workflows here assume sibling checkouts under a common parent, plus one shared directory for locally built packages:
SHiP/
├── aegir/
├── data-model/
├── geometry/
├── geometry_service/
├── field_service/
├── ship-conda-recipes/
└── ship-local-channel/ # created on demand by the build tasks
Relative paths in the opt-in dev blocks (../data-model,
../ship-local-channel) resolve against this layout.
The two mechanisms¶
Source dependencies — a consumer's dev environment declares e.g.
shipdatamodel = { path = "../data-model" }; pixi builds the checkout
into a conda package on the fly (using the [package] section that
repo declares) and rebuilds it automatically whenever its sources
change. Used for data-model, geometry and geometry_service. See
Multi-package development.
Local channel — packages whose build can't go through a source
dependency yet (field-service because of its multi-output recipe,
phlex because it's upstream) are built into the
../ship-local-channel file channel, which dev environments resolve
ahead of the remote channels. See
Testing dependency PRs.
Requirements and caveats¶
- pixi ≥ 0.68 (
requires-pixiin the manifests enforces this). pixi-buildis a preview feature: behaviour can change between pixi releases. Known limitations and workarounds are tracked in the pixi-build gap log.- The opt-in blocks are commented out in the repos'
pixi.tomland must stay that way in commits: pixi validates every environment against the lockfile, so an activedevenvironment would break--lockedruns (CI, other developers) without your sibling checkouts. Never commit the uncommented block or thepixi.lockchanges it causes.
Relationship to the Packaging section¶
Releases still flow exclusively through
ship-conda-recipes
and the prefix.dev/ship channel — nothing in this guide publishes
anything. Two files are deliberate dev twins of release recipes and
must be kept in lockstep when bumping a
version:
| Dev twin | Release counterpart |
|---|---|
field_service/recipe/recipe.yaml |
ship-conda-recipes/recipes/field-service/recipe.yaml |
ship-conda-recipes/recipes-dev/phlex/ |
conda-forge phlex-feedstock |
Likewise, each producer repo's [package] section mirrors its release
recipe (version and host dependencies).