Stacked environment variable management system. The lightweight, easy to use "rez" alternative for production pipelines.
Environment variables are declared in namespaced .env files using yaml syntax.
The default stack is stack and variables are declared in stack.env
files. You can create any new stack by creating new .env files, e.g. creating
a new test stack just create test.env files.
Envstack works best combined with siteconf.
The easiest way to install:
$ pip install envstackCopy the default stack file
stack.env
to your current working directory, or the root of your project. This is the default
environment stack. Running the envstack command should show you the resolved
environment for your platform:
$ envstack
ENV 'prod'
HELLO 'world'
FOO 'bar'
PYVERSION 3.11
LIB 'lib/python3.11'
LOG_LEVEL 20
ROOT '/mnt/tools/lib/python3.11'Modify the environment stack by updating stack.env or by creating new contextual
stack.env files up and down the project hierarchy.
You can execute any command inside the default stacked environment like this:
$ enstack -- <command>For example:
$ envstack -- python -c "import os; print(os.environ['HELLO'])"
worldTo create a new environment stack, create a new namespaced .env file.
For example thing.env (the stack namespace is "thing"):
all: &default
FOO: barTo see the resolved environment for the thing environment stack, run:
$ envstack thing
FOO 'bar'Environment stacks are hierarchical, so values for $FOO defined in .env files lower
in the filesystem (lower in scope) override those defined higher up (higher in scope):
/show/thing.env
/show/seq/thing.env
/show/seq/shot/thing.env
/show/seq/shot/task/thing.env
Variables can reference other variables defined elsewhere (but cannot be circular):
all: &default
BAR: $FOOVariables can be platform specific (and inherit the defaults):
linux:
<<: *default
HELLO: worldEnvironment files can include other namespaced environments:
include: ['other']To see the default resolved environment for any given scope (directory):
$ envstackTo see the resolved environment for a given namespace.
$ envstack <stack> [OPTIONS]To resolve a $VAR declaration for a given environment stack:
$ envstack <stack> -r <VAR>To trace where a $VAR declaration is being set:
$ envstack <stack> -t <VAR>To see an environment stack on another platform:
$ envstack <stack> -p <platform>To run any command line executable inside of an environment stack, where <command>
is the command to run:
$ enstack <stack> -- <command>For example, running python in the default stack (reading from the default stack.env file):
$ envstack -- python -c "import os; print(os.environ['HELLO'])"
worldSame command but using the "thing" stack"
$ envstack thing -- python -c "import os; print(os.environ['FOO'])"
bar