conda-lock - Conda Environment Locking Reproduzível
conda-lock resolve o problema de reprodutibilidade do conda. Um environment.yml lista pacotes solicitados, então resolvê-lo em duas máquinas uma semana de diferença pode produzir versões diferentes — o clássico “funciona na minha máquina.” conda-lock resolve o ambiente uma vez e escreve um lock file com versões exatas, builds, e hashes para cada plataforma que você visa, então instalações se tornam determinísticas e rápidas (sem resolver em tempo de instalação).
Instalação
| Método | Comando |
|---|
| pipx (recomendado) | pipx install conda-lock |
| conda | conda install -c conda-forge conda-lock |
| pip | pip install conda-lock |
| Verificar | conda-lock --version |
Gerando um Lock File
# Lock para múltiplas plataformas a partir de um environment.yml
conda-lock -f environment.yml -p linux-64 -p osx-arm64 -p win-64
| Flag | Propósito |
|---|
-f, --file | Especificação de entrada (environment.yml, pyproject.toml, meta.yaml) |
-p, --platform | Plataforma alvo (repetível) |
-k, --kind | Tipo de saída: lock (unificado), explicit, env |
--lockfile | Caminho de saída (padrão conda-lock.yml) |
--check-input-hash | Pular re-solving se entradas não mudaram |
Tipos de Lock File
| Tipo | Produz | Uso |
|---|
lock | conda-lock.yml unificado (todas as plataformas) | Commit este para git |
explicit | .lock arquivos per-plataforma | conda create --file |
env | environment.yml renderizado | Ferramentas esperando um arquivo env simples |
# Renderizar arquivos explicit per-plataforma a partir do lock unificado
conda-lock render -p linux-64
Instalando a Partir de um Lock
# Criar um ambiente exatamente como locked
conda-lock install --name myenv conda-lock.yml
# Ou com micromamba (rápido)
micromamba create -n myenv -f conda-linux-64.lock
| Comando | Descrição |
|---|
conda-lock install -n NAME | Criar/atualizar o env a partir de um lock |
conda-lock install --mamba | Usar mamba como solver/installer |
conda create --file X.lock | Instalar um lock explícito diretamente |
Atualizando Dependências
# Re-resolver tudo (novas versões permitidas)
conda-lock -f environment.yml -p linux-64 -p osx-arm64
# Atualizar apenas um pacote, manter o resto fixado
conda-lock --update numpy -f environment.yml -p linux-64
| Tarefa | Comando |
|---|
| Refresh completo | Re-rodar conda-lock |
| Bump selecionado | --update PKG |
| Verificar entradas não mudaram | --check-input-hash |
Incluindo Dependências pip
# environment.yml
name: myproject
channels: [conda-forge]
dependencies:
- python=3.12
- numpy
- pip
- pip:
- some-pypi-only-package==1.2.3
conda-lock resolve tanto dependências conda quanto pip no mesmo lock file, que é importante porque misturar os dois ad hoc é uma fonte comum de ambientes quebrados.
Padrão de CI
# Instalações determinísticas e rápidas de CI
- run: conda-lock install --name ci conda-lock.yml
- run: conda run -n ci pytest
| Prática | Por quê |
|---|
Commit conda-lock.yml | O lock é a fonte de verdade |
| Lock todas as plataformas alvo | Devs em macOS, CI em Linux |
| Regenerar deliberadamente | Atualizações de dependência se tornam diffs revisionáveis |
| Cache o env | Locks tornam caching confiável |
conda-lock vs Alternativas
| Aspecto | conda-lock | environment.yml | pixi | uv |
|---|
| Reproduzível | Pins exatos + hashes | Não | Lock integrado | Lock integrado |
| Ecossistema Conda | Sim | Sim | Sim | Não (PyPI) |
| Lock multi-plataforma | Sim | N/A | Sim | Sim |
| Melhor para | Locking de projetos conda existentes | Envs simples/ad-hoc | Projetos novos baseados em conda | Projetos Python puros |
Para novos projetos considere pixi (locking integrado) ou uv para Python puro; conda-lock retrofit reprodutibilidade em fluxos conda existentes.
Recursos