{"id":31548103,"url":"https://github.com/esss/pixi-devenv","last_synced_at":"2026-03-04T00:08:50.258Z","repository":{"id":313953540,"uuid":"1042701497","full_name":"ESSS/pixi-devenv","owner":"ESSS","description":"pixi-devenv is tool to work with multiple pixi projects in development mode.","archived":false,"fork":false,"pushed_at":"2025-09-16T17:35:19.000Z","size":67,"stargazers_count":1,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-09-16T20:03:09.797Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ESSS.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-08-22T12:42:14.000Z","updated_at":"2025-08-27T20:50:01.000Z","dependencies_parsed_at":"2025-09-09T19:57:33.021Z","dependency_job_id":"32a8357e-fdf3-41f8-b357-7c0f0a1cfaeb","html_url":"https://github.com/ESSS/pixi-devenv","commit_stats":null,"previous_names":["esss/pixi-devenv"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ESSS/pixi-devenv","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ESSS%2Fpixi-devenv","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ESSS%2Fpixi-devenv/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ESSS%2Fpixi-devenv/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ESSS%2Fpixi-devenv/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ESSS","download_url":"https://codeload.github.com/ESSS/pixi-devenv/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ESSS%2Fpixi-devenv/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278335469,"owners_count":25970131,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-04T02:00:05.491Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-10-04T16:03:25.541Z","updated_at":"2026-03-04T00:08:50.252Z","avatar_url":"https://github.com/ESSS.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# pixi-devenv\n\n\n## Why?\n\npixi-devenv is tool to work with multiple pixi projects in development mode.\n\npixi currently does not have full support to work with multiple projects in development mode. Development mode allows one to have each project declaring its own dependencies, and work with all of them with live code so changes are reflected immediately, without the needing of creating/installing the projects as packages in the environment.\n\npixi-devenv makes it easy to aggregate multiple \"projects\" to create a single \"product\".\n\n\n## Usage\n\nIn a directory with a `pixi.devenv.toml` and the target `pixi.toml`, execute:\n\n```console\npixi exec -c conda-forge pixi-devenv update\n```\n\nThis will update the `pixi.toml` file from the `pixi.devenv.toml` configuration.\n\n## Introduction\n\nHere are a quick explanation of some `pixi` concepts that are important to understand to use `pixi-devenv`.\n\n### `[dependencies]`\n\nLists the `conda` dependencies of a project. `[pypi-dependencies]` lists PyPI dependencies. `pixi` fully supports using PyPI packages, meaning PyPI packages are solved together with the conda packages.\n\n\n```toml\n[dependencies]\nalive-progress = \"\u003e=3.2\"\nartifacts_cache = \"\u003e=3.0\"\n```\n\n### `[activation]`\n\nDefines which variables and scripts should be activated for the environment.\n\n```toml\n[activation]\nscripts = [    \n    \".pixi-activation/env-vars.sh\",\n]\nCONDA_PY=\"310\"\nPATH = \"$PIXI_PROJECT_ROOT/bin:$PATH\"\n```\n\n### `[target.{NAME}]`\n\n\nA `[target.{NAME}]` section can be used to specify platform specific configuration, such as `[target.win]` or `[target.linux]`. Generic terms are valid (`win`, `unix`), down to more specific ones (`linux-64`, `windows-64`).\n\nEach `[target.{NAME}]` section contains its own `[dependencies]` and `[activation]` sections.\n\n```toml\n[target.win.dependencies]\npywin32 = \"\u003e=305\"\n\n[target.unix.dependencies]\nsqlite = \"\u003e=3.40\"\n\n[target.linux-64.activation]\nenv = { JOBS = \"6\" }\n```\n\n\n### `[feature.NAME]`\n\nThink of a `feature` as a group of `dependencies` and `activation` sections. They can be used to have a different set of dependencies for different purposes, like testing or linting tools, as well as different dependency matrixes. They are *additive* to the default `[environment]` and `[activation]` sections:\n\n```toml\n[feature.python310]\ndependencies = { python = \"3.10.*\" }\nactivation = { env = { CONDA_PY = \"310\" } }\n\n[feature.compile.target.win.dependencies]\ndependency-walker = \"*\"\n``` \n\n### `[environments]`\n\nEnvironments are sets of one or more features. An environment will contain all the `dependencies` and `activation` of the features that compose the environment.\n\n```toml\n[environment]\npy310 = [\"python310\", \"compile\"]\npy312 = [\"python312\", \"compile\"]\n```\n\n## pixi-devenv\n\n`pixi-devenv` configuration resides in a `pixi.devenv.toml` file. To update `pixi.toml` in case `pixi.devenv.toml` changes, execute:\n\n```console\npixi run pixi-devenv\n```\n\nIf your project includes `pixi-devenv` in its `dependencies`, but it can be run from a one-off environment:\n\n```console\npixi exec pixi-devenv\n```\n\nConsider this project structure:\n\n```\nworkspace/\n    core/\n        src/\n        pixi.devenv.toml\n    calc/\n        src/\n        pixi.devenv.toml\n    web/\n        src/\n        pixi.devenv.toml\n```\n\n**Characteristics**\n\n* `web` depends on `calc`, which depends on `core`.\n* We have two features defined in `core`:\n    * `test`: adds test specific dependencies.\n    * `py310`: Python 3.10.\n    * `py312`: Python 3.12.\n\n### `core/pixi.devenv.toml`\n\nThe `pixi-devenv` configuration resides in the `devenv` table. This avoids confusion when looking at both `pixi.devenv.toml` file and `pixi.toml`, making the distintion clear.\n\n```toml\n[devenv]\n# Mandatory: name of this project\n# Question: should this actually be forbidden and forced to be the name of the directory?\nname = \"core\"\nchannels = [\n    \"prefix.dev\",\n    \"https://packages.company.com\"\n]\nplatforms = [\"win-64\", \"linux-64\"]\n```\n\nBasic information about the project. `channels` and `platforms` are inherited by downstream projects by default, but can also be overwritten.\n\n\n```toml\n[devenv.dependencies]\nattrs = \"*\"\nboltons = \"*\"\n\n[devenv.target.win.dependencies]\npywin32 = \"*\"\n```\n\nDefault dependencies, identical to pixi's `[dependencies]` section. They are inherited by default by downstream projects.\n\n\n```toml\n[devenv.constraints]\nqt = \"\u003e=5.15\"\n\n[devenv.target.win.constraints]\nvc = \"\u003e=14\"\n```\n\nDefault `constraints`. They are inherited by default by downstream projects.\n\n`constraints` contain version specs similar to `[dependencies]`, but contrary to `dependencies` the specs are not part of the environment by default.\n\nThey will be added to the versions specifiers of the section *if* a downstream project explicitly declares that dependency.\n\n\n```toml\n[devenv.env-vars]\n# Lists are prepended to existing variable of same name, with the appropriate joiner for the platform (':' on Linux, ';' on Windows).\n# ${{ devenv_project_dir }} is replaced by the project directory.\nPYTHONPATH = ['${{ devenv_project_dir }}/src']\n\n# Strings are set directly.\nJOBS = \"6\"\n\n# Overwrite by platform uses the same syntax as usual.\n[devenv.target.unix.env-vars]\nCC = 'CC $CC'\n```\n\nVariables might be used which will be replaced by the correct values when creating the `pixi.toml` file:\n\n* `{devenv_project_dir}`: root of the directory containing the `pixi.devenv.toml` file. This will be replaced by a \n   relative path to `pixi.toml` in the final file.\n\nBy default, they are inherited from upstream projects.\n\nThis takes the place of the `[activation]` section of the default pixi configuration.\n\n\n```toml\n[devenv.feature.python310]\ndependencies = { python = \"3.10.*\" }\nenv-vars = { CONDA_PY = \"310\" }\n\n[devenv.feature.python312]\ndependencies = { python = \"3.12.*\" }\nenv-vars = { CONDA_PY = \"312\" }\n\n[devenv.feature.test]\ndependencies = { pytest = \"*\" }\n\n[devenv.feature.compile]\ndependencies = { cmake = \"*\" }\n``` \n\nFeature configuration, identical to pixi's `[feature]` section. Features **are not** inherited automatically. The reason for that is that features that are not used by environments generate a warning, which would cause false warnings in downstream projects only because they decide to not use a feature available on upstream projects.\n\n\n```toml\n[devenv.environment]\npy310 = [\"python310\"]\npy310-test = [\"python310\", \"test\", \"compile\"]\npy312 = [\"python312\"]\npy312-test = [\"python312\", \"test\", \"compile\"]\n```\n\nNote that features can be defined at any point in the hierarchy. Downstream projects control how/when they inherit features.\n\nEnvironment configuration, identical to pixi's `[environment]` section. Same as features, environments **are not inherited** by default.\n\n\n### `calc/pixi.devenv.toml`\n\n\n```toml\n[devenv]\nname = \"calc\"\n# platforms = [\"linux-64\"]  # can overwrite platforms defined upstream.\n# channels = [\"conda-forge\"]  # can overwrite platforms defined upstream.\n\n\n# Mandatory: List of upstream projects. This should be a list pointing to the directory, relative to this directory, of the upstream's project `pixi.devenv.toml` file.\nupstream = [\n    \"../core\",\n]\n\n[devenv.dependencies]\n\n\n\n[devenv.inherit]  # Optional\n# Both settings can be a list instead of a bool, meaning to inherit dependencies only from the projects explicitly listed.\n# dependencies = [\"core\"]\n# Default to true, meaning default dependencies from all upstream projects are inherited. Using false means no dependencies are inherited.\ndependencies = true\npypi-dependencies = true\nenv-vars = true\n\n# Controls which features will be inherited. By default this table is empty, meaning no features are inherited.\n[devenv.inherit.features]  # Optional\npy310 = true  # inherits all features defined upstream named 'py310'.\n# py310-test = ['core']  # instead of inheriting 'py310-test' from all upstream projects, inherit it only from 'core'.\n```\n\nNote: `environments` **are never inherited**. \n\n\n\n## Differences to `conda-devenv`\n\n[conda-devenv](https://github.com/ESSS/conda-devenv) is a tool developed by ESSS with the same purpose as `pixi-devenv`: working with multiple projects in development mode. \n\nThere is one important difference on how the tools work:\n\n`conda-devenv` is a frontend tool. Developers work with it directly on their day-to-day work, even if they are not changing dependencies or adding/removing projects -- developers call `conda devenv` to create their environments. One consequence of this is that developers must have `conda-devenv` installed in their root `conda` installation, which requires everyone to be using the exact same version `conda` version, because unfortunately bugs in conda happen (as in any software). The lack of native locking in `conda` requires using `conda-lock`, which by itself must also be of a compatible version with `conda` and `conda-devenv`, further complicating bootstrapping.\n\n\n`pixi-devenv` is a code generation tool. Developers don't need to use it on their day-to-day work, only using `pixi` and plain `pixi.toml` files directly. Developers only need `pixi-devenv` when they make changes to the `pixi.devenv.toml` file, changing package dependencies, adding/removing upstream projects -- in that case, developers must invoke `pixi-devenv` to update your `pixi.toml` file. The fact that `pixi-devenv` is a standalone tool resolves the bootstrapping problem that plagues `conda-devenv`.\n\n\n## Development\n\nBecause this is a pure Python package, we decided to use the more standard `uv` tool for development.\n\nTo run mypy:\n\n```console\nuv run mypy\n```\n\nTo run tests:\n\n```console\nuv run pytest\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fesss%2Fpixi-devenv","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fesss%2Fpixi-devenv","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fesss%2Fpixi-devenv/lists"}