Skip to main content

Multiple Project Sandboxes

Sometimes it is useful to configure multiple sandboxes per project:

  • to build a project with a different compiler version
  • to try a project with a different set of dependencies installed
  • to build a project using differeng settings configured via environment variables

It is inconvenient to modify package.json and reinstall dependencies each time you want to work in a different sandbox configuration.

To streamline this esy provides an ability to have multiple sandbox configurations per project.

Configure multiple sandboxes

Put ocaml-4.6.json file into the project directory.

ocaml-4.6 can be any other name you like for your sandbox config:

  • with-ocaml-4.6.json
  • debug-build.json

ocaml-4.6.json file should have the same format as package.json but can have different configuration for dependencies, devDependencies, esy.build or other fields described in Project Configuration.

For example:

{
...
"devDependencies": {
"ocaml": "~4.6.0"
}
...
}

To instruct esy to work with ocaml-4.6.json sandbox configuration (instead of default package.json) you can use @ocaml-4.6 sandbox selector:

  • Install the dependencies of the ocaml-4.6 sandbox:

    esy @ocaml-4.6 install
  • Build the ocaml-4.6 sandbox:

    esy @ocaml-4.6 build
  • Run a command with the ocaml-4.6 sandbox environment:

    esy @ocaml-4.6 which ocaml

Note that sandbox selector @<sandbox-name> should be the first argument to esy command, otherwise it is treated as an option to a subcommand and won't have the desired effect.

Sandbox configuration overrides

When sandbox configurations differ just by few configuration parameters it is too much boilerplate to copy over all package.json fields to a new sandbox configuration.

It is possible to use sandbox configuration overrides to aleviate the need in such boilerplate.

Overrides have the following format:

{
"source": "./package.json",
"override": {
<override-fields>
}
}

Where source key defines the origin configuration which is being overriden with the fields from override key.

Not everything can be overriden and <override-fields> can contain one or more of the following keys.

build

This replaces esy.build commands of the origin sandbox configuration:

"override": {
"build": "dune build"
}

install

This replaces esy.install commands of the origin configuration.

"override": {
"install": "esy-installer project.install"
}

exportedEnv

This replaces esy.exportedEnv set of exported environment variables of the origin configuration.

"exportedEnv": {
"NAME": {"val": "VALUE", "scope": "global"}
}

If you need to add to a set of exported environment variables rather than replace the whole set use exportedEnvOverride key instead.

exportedEnvOverride

This overrides esy.exportedEnv set of exported environment variables of the origin configuration.

Environment variables specified using this key are being added instead of replacing the entire set. If a declaration for an environment variable is set to null then the variable is removed from the set.

"exportedEnvOverride": {
"VAR_TO_ADD": {"val": "VALUE", "scope": "global"},
"VAR_TO_REMOVE": null
}

buildEnv

This replaces esy.buildEnv set of build environment variables of the origin configuration.

"buildEnv": {
"NAME": "VALUE"
}

If you need to add to a set of build environment variables rather than replace the whole set use buildEnvOverride key instead.

buildEnvOverride

This overrides esy.buildEnv set of build environment variables of the origin configuration.

Environment variables specified using this key are being added instead of replacing the entire set. If a declaration for an environment variable is set to null then the variable is removed from the set.

"buildEnvOverride": {
"VAR_TO_ADD": "VALUE",
"VAR_TO_REMOVE": null
}

dependencies

This overrides dependencies set of dependency declaraations of the origin configuration.

"dependencies": {
"dependency-to-add": "^1.0.0",
"dependency-to-remove": null
}

devDependencies

This overrides devDependencies set of dev dependencies of the origin configuration.

"devDependencies": {
"dependency-to-add": "^1.0.0",
"dependency-to-remove": null
}

resolutions

This replaces resolutions set of dependency resolutions.