Pip 可实现各种级别的可重复性
在 requirements.txt
文件中固定依赖项的版本可以保护我们免受新发布版本中的错误或不兼容性的影响
SomePackage == 1.2.3 DependencyOfSomePackage == 4.5.6
使用 pip freeze
命令生成 requirements.txt
文件不仅可以可以确保顶级的依赖项的安全,还可以保护顶级依赖项的子依赖项的安全
同时,执行安装时还可以添加 --no-deps
选项以获得额外的保障,以防止安装未明确列出的任何内容
这种策略非常容易实现,而且已经应用在操作系统和体系结构中,它信任 PyPI
和证书颁发机构链,它还依赖于索引和查找链接位置,不允许在没有版本增加的情况下更改包 ( PyPI 可以防止这种情况发生 )
摘要检查模式
除了固定版本号之外,我们还可以添加用于验证下载的包的摘要值
FooProject == 1.2 --hash=sha256:2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
这可以用于防止 PyPI
或 HTTPS
证书链的被中间人攻击,还可以防止更改软件包而不更改版本号 ( 在允许此版本的索引上 )
显然,这种方式非常适合自动化服务器部署
摘要检查模式是运行包含已审核包的私有索引服务器的省力替代方法:它不需要上传包,维护 ACL,而且还可以保留审计跟踪( VCS 免费提供给的 requirements.txt
文件 ),它还可以替代供应商库,提供更容易的升级和更少的 VCS 噪音
当然了,有好处就会有坏处,而坏处就是不提供私有索引或供应商库的可用性优势
有关摘要检查的更多信息,可以访问 pip install 中的哈希检查模式的讨论
安装包 ( Bundles )
使用 pip wheel 命令,我们可以对所有项目的依赖项进行一个完整的编译,并捆绑到一个归档文件中
这样就可以在索引服务器不可用时进行安装,并可以避免耗时的重新编译
使用 pip wheel
命令创建一个归档的语法如下
$ tempdir=$(mktemp -d /tmp/wheelhouse-XXXXX) $ pip wheel -r requirements.txt --wheel-dir=$tempdir $ cwd=`pwd` $ (cd "$tempdir"; tar -cjvf "$cwd/bundled.tar.bz2" *)
然后从该归档中安装依赖项的脚本如下
$ tempdir=$(mktemp -d /tmp/wheelhouse-XXXXX) $ (cd $tempdir; tar -xvf /path/to/bundled.tar.bz2) $ pip install --force-reinstall --ignore-installed --upgrade --no-index --no-deps $tempdir/*
请注意,编译的软件包通常是特定于操作系统和体系结构的,因此这些存档不一定可以跨机器移植
摘要检查模式可以与此方法一起使用,以确保将来的归档使用相同的包构建
警告 : 最后,请留意 setup.py
文件中的 setup_requires
关键字,使用此关键字的软件包将导致它的依赖项直接由 setuptools
下载,跳过 pip
的保护,如果你需要使用包含了此关键字的包,可以详细阅读一下 setup_requires 控制