我工作的大公司使用自定义版本的Setuptools。这个安装工具的私有分支旨在处理我们组织特有的某些网络和安全困难。最重要的是,标准安装工具和分发都无法在我们的环境中按预期工作。
我喜欢开始在系统上使用 Ian Bicking 出色的 VirtualEnv 工具,特别是在我们的测试系统中,我们需要能够为测试代码设置大量沙盒区域 - 例如在我们的持续集成环境中。
不幸的是,每当我尝试构建一个新的虚拟环境时,virtualenv 工具都会尝试获取并安装最新的正式版本的 Setuptools。由于上述原因,此操作将失败,也因为公司防火墙将阻止该操作。
而不是安装正式版本:
setuptools-0.6c11-py2.4.egg
我想安装我们的自定义版本,它可能被称为:
setuptools-foo-0.6c11-py2.4.egg
这个蛋总是可以保证在系统的全局站点包中找到。我还可以保证它存在于我们所有的公司鸡蛋服务器中。
你能帮我让我的虚拟环境使用我的自定义安装工具而不是常规版本的安装工具吗?
名称以 virtualenv.py 格式硬编码。您必须修补 virtualenv.py 或将修补的安装工具蛋命名为"setuptools-0.6c11-py2.4.egg"
我已经开始编写自己的包装脚本来导入 virtualenv。主要原因是我使用 dpkgs 来安装我的大部分依赖项,包括 distribute
,所以我喜欢在创建新环境时避免下载额外的副本 - 这有一个好处,那就是它的运行速度要快得多。
下面是一个可用于开始的基线包装器。 我添加了一个注释,您可以在其中插入一些代码以符号链接/复制自定义安装工具代码到virtualenv中:
import os, subprocess, sys, virtualenv
# virtualenv changed its internal api slightly after 1.5.
NEW_API = (1, 5)
def get_version(version):
return tuple([int(v) for v in version.split('.')])
def main():
# set the logging level here
level = virtualenv.Logger.level_for_integer(0)
logger = virtualenv.Logger([(level, sys.stdout)])
virtualenv.logger = logger
# insert your command-line parsing code here, if needed
root = sys.argv[1]
home, lib, inc, bin = virtualenv.path_locations(root)
result = virtualenv.install_python(home, lib, inc, bin,
site_packages=True, clear=False)
pyexec = os.path.abspath(result)
version = get_version(virtualenv.virtualenv_version)
if version < NEW_API:
virtualenv.install_distutils(lib, home)
else:
virtualenv.install_distutils(home)
virtualenv.install_activate(home, bin)
# insert whatever post-virtualenv-setup code you need here
if __name__ == '__main__':
main()
用法:
% python wrapper.py [path]
有一个选项--extra-search-dir
允许定义包含所需版本的安装工具的本地目录。这在文档中进行了解释。