我现在搜索了一段时间,但找不到任何满意的答案:
conda(http://conda.pydata.org)如何在内部运作?欢迎任何细节...
此外,因为它是python不可知的,并且显然工作得很好而且流利,为什么它不被用作apt或yum这样的通用包管理器?
仅使用conda作为包管理器有什么限制?它会起作用吗?
或者相反,为什么例如apt和yum无法提供conda提供的功能? conda比那些包管理员“更好”还是只是不同?
感谢任何提示!
答案 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
行动的高级别序列:
这方面的@asmeurer youtube链接可以让你入门。