Conda 将所有包链接到该pkgs
文件夹,该文件夹由所有 env 共享,并且不以任何特殊方式与base关联。每当任何 env 安装或升级包时,它们都会去那里,并且没有任何明确的努力从现有包中获取 - 如果依赖关系求解器碰巧解析为缓存包,它将使用它。目前,没有一种机制可以保持包跨 envs 的同步,因此必须设计一个工作流来实现它。
潜在的工作流程
理论上,可以使用Conda 的 env 克隆来最大化包版本同步。为此,您可以在概念上将您的环境组织为三类:
- base env:仅用于核心基础架构,例如 、、
conda
等。您可以在需要新的命令行软件或需要时自由更新。它应该与其他环境几乎没有重叠。jupyter
git
conda update conda
- template env : 集中通用包集,通常按版本限制分组。例如,对于不同项目可能需要的不同 Python 版本,可能有一个
py27-tmpl
、py36-tmpl
和。py37-tmpl
在这里,您将安装跨项目所需的最大通用包子集。模板环境的主要目的是制作...
- project env:与特定的开发项目相关联,最初是作为模板 env 的克隆派生的。其中大部分核心软件都来自模板,然后这里应该安装额外的软件。一旦你为一个项目启动了一个,你就保持它相对固定,以保持开发的稳定性。
这样的结构将最大限度地重用现有的包版本。从 Conda v4.7 开始,依赖求解器默认为带有隐式--freeze-installed|--no-update-deps
标志的第一阶段求解,它尝试安装请求的包而无需更改现有包。如果与模板 env 保持同步是您的目标,那么您可能希望--freeze-installed
在安装时始终使用 。也可以使用包固定来明确阻止指定的包从模板升级。但是,这可能会限制安装其他软件包的某些最新版本。
不幸的是,您仍然会遇到与您直觉相似的同步问题:虽然您可以在创建新克隆之前更新这些模板环境,但这不会更新以前从它们派生的环境。但是对于项目环境,我认为最好的做法是一旦开始工作就不要操纵它们。如果您关心空间,那么没有什么可以替代完成您的模块化项目,然后在使用后归档和删除项目环境。那个,偶尔跑conda clean
。