conda如何在内部工作?

时间:2015-01-03 10:34:45

标签: python environment package-managers conda

我现在搜索了一段时间,但找不到任何满意的答案:

conda(http://conda.pydata.org)如何在内部运作?欢迎任何细节...

此外,因为它是python不可知的,并且显然工作得很好而且流利,为什么它不被用作apt或yum这样的通用包管理器?

仅使用conda作为包管理器有什么限制?它会起作用吗?

或者相反,为什么例如apt和yum无法提供conda提供的功能? conda比那些包管理员“更好”还是只是不同?

感谢任何提示!

3 个答案:

答案 0 :(得分:20)

我在SciPy 2014 talk中解释了很多这方面的内容。让我在这里给出一点概述。

首先,conda包非常简单。它只是要安装的文件的tarball,以及info目录中的一些元数据。例如,python的conda包是文件的tarball

info/
    files
    index.json
    ...
bin/
    python
    ...
lib/
    libpython.so
    python2.7/
        ...
    ...
...

通过查看Anaconda pkgs目录中提取的包,您可以准确地看到它的外观。完整规范位于https://docs.conda.io/projects/conda-build/en/latest/source/package-spec.html

当conda安装它时,它会将tarball提取到pkgs目录并将文件硬链接到安装环境中。最后,一些具有一些硬编码安装路径的文件已被替换(通常是shebang行)。

基本上就是这样。在依赖性解析方面还会发生一些更多的事情,但是一旦它知道它将要安装哪些软件包以及它是如何实现的。

构建包的过程稍微复杂一些。 @mattexx的答案及其链接的文档描述了使用conda构建构建包的一些规范方法。

回答您的其他问题:

  

此外,因为它是python不可知的并且显然工作得很好而且流利,为什么它不像apt或yum那样被用作通用包管理器?

你当然可以。唯一限制这一点的是为conda构建的软件包集。在Windows上,这是一个非常好的选择,因为Linux上没有任何系统包管理器。

  

仅使用conda作为包管理器有什么限制?它会起作用吗?

它可以工作,假设您有感兴趣的所有内容的conda包。主要限制是conda只想将内容安装到conda环境本身,因此需要在系统上安装特定位置的东西可能不太好适合conda(虽然它仍然可行,如果你将该位置设置为你的环境路径)。或者,例如,conda可能不适合替代"项目级别"包管理员喜欢凉亭。

此外,conda可能不应该用于管理系统级库(必须安装在/前缀中的库),如内核扩展或内核本身,除非你要构建一个将conda明确用作包管理器的分发。

我要说的主要内容是conda包通常是可重定位的,这意味着包的安装前缀无关紧要。这就是硬编码路径作为安装过程的一部分而改变的原因。它还意味着使用conda build构建的动态库将使其RPATH(在Linux上)和安装名称(在OS X上)自动更改为使用相对路径而不是绝对路径。

  

或者相反,为什么例如apt和yum无法提供conda提供的功能? conda"更好"那些包经理还是差别?

在某些方面它更好,在某些方面它不是。您的系统包管理器知道您的系统,并且其中有些包不会出现在conda中(有些内核,如内核,可能不应该在conda中)。

conda的主要优点是它的环境概念。由于软件包是可重定位的,因此您可以在多个位置安装相同的软件包,并且有效地完全独立安装所有内容,基本上是免费的。

  

是否使用某种集装箱化

不,唯一的"集装箱化"具有单独的安装目录并使包可重定位。

  

或所有依赖项的静态链接,

依赖关系链接完全取决于包本身。有些软件包静态链接它们的依赖项,有些软件包不是。如上所述,动态链接库的加载路径已更改为可重定位。

  

为什么会如此"跨平台"?

"跨平台"在这种情况下意味着"交叉操作系统"。虽然相同的二进制包不能在OS X,Linux和Windows上运行,但关键是conda本身在所有三个上都是相同的,所以如果你有为所有三个平台构建的相同包,你可以管理它们无论你在哪一个方面,都是一样的。

答案 1 :(得分:3)

我不是该软件的专家,但我一直使用conda来维护内部存储库数月,所以我可以分享“高级用户”的见解。这里有很多问题,所以我会尝试按顺序回答它们。

  

conda(http://conda.pydata.org)如何在内部运作?欢迎任何细节...

我可以分享的最简洁的参考是conda-build doc,它详细解释了conda食谱。

TL; DR Recipes是具有配置文件meta.yaml的文件夹,它根据名称,版本,源位置,依赖关系(构建,测试,运行)以及安装后运行的基本测试来描述包。它还包含构建脚本(分别为linux和win的build.sh和/或bld.bat),它们执行除下载源之外的任何构建步骤。

安装包括(简而言之)下载源代码,创建构建环境,构建,创建测试环境和测试。您可以在系统范围内安装或在环境中安装它:

conda install -n myenv mypkg # install only in myenv
conda install mypkg # install globally

激活环境与virtualenv完全相同:

source activate myenv
  

仅使用conda作为包管理器有什么限制?它会起作用吗?

它会起作用。如果你有一个支持你的环境的配方,你可以用conda安装任何你想要的东西。您将遇到的问题是包支持。 Conda维护者和用户已经在各种渠道上创建了包的生态系统,但是对二进制包的支持几乎仅限于Python包通常需要的那些,并且其中许多仅在一个或两个平台上受支持。 apt,yum等用户为各自的平台维护各种东西。

在我们的例子中,我们需要支持Ubuntu和OSX,因此我们通过puppet和其他愚蠢的巫术维护许多依赖于平台的二进制包,并且我们使用conda来维护这两个平台的Python包。如果我们使用的所有二进制包都存在conda包,我可能会考虑使用conda而不是apt,brew等,但如果我们使用的配方变得过时,我将冒险进行重要的配方维护。在Python包管理的情况下,这对我们来说很好,其中conda填补了一个巨大的空白,但我还没准备好接受我们现有工具要维护的包。随着康达生态系统的成熟,我们将看到我的思维是否会发生变化。统治它们的一个工具会很好,但我不认为conda已经准备好让我跳跃了。

  

它是否使用某种容器化或所有依赖项的静态链接,为什么它是“跨平台”?

“跨平台”可以有很多含义。对于Python包,跨平台意味着您可以使用任何版本的python和所需的包创建环境。对于Linux / win flavor和发行版,您可以根据环境在构建脚本中执行所需的操作。举个例子,看看conda build script for qt。它适用于OSX和Linux。脚本可以做任何想做的事情。您可以根据操作系统版本或任何需要进行切换。如果不支持安装平台,很多配方都会失败。

希望您觉得这很有帮助。

答案 2 :(得分:1)

我看到没有人真正了解康达如何运作,愿意分享他们的知识。这很不幸......

我可以提供conda build行动的高级别序列:

  1. 查看meta.yaml以查找RUN + BUILD deps
  2. 创建名为''_build'的新env
    1. 从meta.yaml
    2. 安装RUN + BUILD依赖项
  3. 获取conda_bld / work
  4. 的源代码
  5. 构建包:
    1. 获取完整环境的'snapshot1'
    2. home_dir:'conda_bld / work',运行:'sh build.sh' 'setup.py install conda_bld / work'(将localy安装到_build env)
    3. 获取完整环境的'snapshot2'
    4. 包内容为'diff snapshot1 snapshot2'
  6. 运行测试:
    1. 用'{just built package,RUN DEPS}'
    2. 创建'_test'ENV
    3. 运行测试
  7. 这方面的@asmeurer youtube链接可以让你入门。