Rules for creating conda environments in Bazel 💚
For more info see the docs or the example.
rules_conda don't have any strict requirements by themselves.
Just make sure you are able to use conda.
Add this to your WORKSPACE file:
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
name = "rules_conda",
sha256 = "9793f86162ec5cfb32a1f1f13f5bf776e2c06b243c4f1ee314b9ec870144220d",
url = "https://github.com/spietras/rules_conda/releases/download/0.1.0/rules_conda-0.1.0.zip"
)
load("@rules_conda//:defs.bzl", "conda_create", "load_conda", "register_toolchain")
load_conda(quiet = False)
conda_create(
name = "py3_env",
environment = "@//:environment.yml",
quiet = False,
)
register_toolchain(py3_env = "py3_env")After that, all Python targets will use the environment specified in register_toolchain.
See below for more advanced example.
This example shows all possibilities of rules_conda:
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
name = "rules_conda",
sha256 = "9793f86162ec5cfb32a1f1f13f5bf776e2c06b243c4f1ee314b9ec870144220d",
url = "https://github.com/spietras/rules_conda/releases/download/0.1.0/rules_conda-0.1.0.zip",
)
load("@rules_conda//:defs.bzl", "conda_create", "load_conda", "register_toolchain")
load_conda(
conda_version = "4.10.3", # version of conda to download, default is 4.10.3
installer = "miniforge", # which conda installer to download, either miniconda or miniforge, default is miniconda
install_mamba = True, # whether to install mamba, which is a faster drop-in replacement for conda, default is False
mamba_version = "0.17.0", # version of mamba to install, default is 0.17.0
quiet = False, # True if conda output should be hidden, default is True
timeout = 600, # how many seconds each execute action can take, default is 3600
)
conda_create(
name = "py3_env", # name of the environment
environment = "@//:py3_environment.yml", # label pointing to environment configuration file
use_mamba = True, # Whether to use mamba to create the conda environment. If this is True, install_mamba must also be True False
clean = False, # True if conda cache should be cleaned (less space taken, but slower subsequent builds), default is False
quiet = False, # True if conda output should be hidden True, default is True
timeout = 600, # how many seconds each execute action can take, default is 3600
)
conda_create(
name = "py2_env", # name of the environment
environment = "@//:py2_environment.yml", # label pointing to environment configuration file
)
register_toolchain(
py2_env = "py2_env", # python2 is optional
py3_env = "py3_env",
)These rules allow you to download and install conda, create conda environments and register Python toolchain from environments.
This means you can achieve truly reproducible and hermetic local Python environments.
Pros:
- easy to use
- no existing
condainstallation necessary - no global
condainstallation, no globalPATHmodifications - virtually impossible to corrupt your environment by mistake as it always reflects your
environment.yml - all Python targets will implicitly have access to the whole environment (the one registered in toolchain)
Cons:
- every time you update your environment configuration in
environment.yml, the whole environment will be recreated from scratch (but cached package data can be reused) - on Windows you need to add environment location to
PATHor setCONDA_DLL_SEARCH_MODIFICATION_ENABLE=1during runtime, so DLLs can be loaded properly (more on that here)
So I think these rules suit you if:
- you want to use Bazel (e.g. you fell into Python monorepo trap)
- you want to use
condafor Python environment management - you don't want to set up your Python environment manually or want your Python targets to just work on clean systems
- you are okay with environments being recreated every time something changes