conda 如何知道哪些包未被使用?

How does conda know which packages are unused?

conda clean --packages 从可写包缓存中删除未使用的包。这是什么 'writable package cache',conda 如何检测它未被使用?
它实际上是 运行 遍历所有 python 文件并寻找依赖项吗?或者它是否保留了之前 运行 的记录?
它会删除我通过 pip 安装但从未使用过的软件包吗?

Conda 很难计算links

以尽量减少物理磁盘的使用。也就是说,lib/libz.a 的单个物理副本可能会从包缓存中(它首先被解包的地方)引用,然后在多个环境中引用。

Conda 通过计算每个包中文件的硬 link 数量来确定是否有资格从包缓存中删除包。 Hardlink 计数由文件系统跟踪,而不是由 Conda 跟踪。 the relevant code的大纲是:

# keep a list of packages to remove
pkgs_to_remove = []

# look in all package caches (there can be multiple)
for pkg_cache in pkgs_dirs:

  # check all packages
  for pkg in pkg_cache:

    # assume removable unless...
    remove_pkg = True
    for file in pkg:
       # is there evidence that it is linked elsewhere?
       if num_links(file) > 1:
         # if so, don't remove, and move on
         remove_pkg = False
         break

    # add it to list is removable
    if remove_pkg:
      pkgs_to_remove.append(pkg)

# output some info on `pkgs_to_remove`
# check if user wants to execute removal

也就是说,如果一个包中的任何文件有多个 link,那么 Conda 将断定它在另一个环境中使用,然后继续下一个包。

请注意,文件系统不会跟踪符号 links(a.k.a.、symlinks、softlinks),而 Conda 不会t 跟踪它们,因此,Conda 会结合 allow_softlinks 设置警告清洁包。