用于离线包安装的结构

时间:2012-09-25 19:14:50

标签: packages offline fabric

我正在使用的项目使用fabric进行许多构建步骤,并且需要脱机构建作为后备。

我目前无法安装tarball中提供的python包。

问题是我无法进入新提取的目录并在那里运行setup.py install

@task
def deploy_artifacts():
    """Installs dependencies from local path, useful for offline builds"""
    #TODO: Handle downloading files and do something like this bellow
    tmpdir = tempfile.mkdtemp()
    artifacts_path = ''
    if not 'http' in env.artifacts_path:
        artifacts_path = env.artifacts_path

    with lcd(artifacts_path):

        for f in os.listdir(artifacts_path):
            if 'gz' in f:
                put(f, tmpdir)
                tar = os.path.join(tmpdir, f)
                target_dir = os.path.join(tempfile.gettempdir(), normalize(f))
                if not files.exists(target_dir):
                    run('mkdir %s' % target_dir)
                else: 
                    run('rm -rf %s' %target_dir)
                    run('mkdir %s' % target_dir)
                run('tar xf %s -C %s' % (tar, target_dir))
                run('rm %s' % tar)
                with cd(target_dir):
                    sudo('python setup.py install')

我来自阅读tar手册页,因为我无法获得我想要的东西。

你们有些人面临这样的情况吗?是否有其他(读取:更好)的方法来处理这种情况?

1 个答案:

答案 0 :(得分:1)

原则上对你正在尝试的事情没有任何错误。也许只是采取较小的步骤到那里。如果所有内容都放在一个具有已知权限的系统位置,而不是使用临时目录,它可能会使调试变得更容易。至少可以让你使用一些结构和人工干预的组合来检查出现了什么问题。

从长远来看,我看到了一些替代方案。为简单起见,您希望在线和离线版本以相同的方式工作,这意味着在两种情况下都使用easy_install / pip获取包。

执行此操作的一种方法是构建PyPi的镜像。如果您拥有足够的存储空间(30Gb),那么正确的方法是使用实​​现PEP381的软件(针对PyPI的镜像基础架构),已经有一个客户端执行此操作({{3 }})。许多其他项目可以执行类似的操作(pep381clientbasketweaverdjangopypi2)。

另一种方法是考虑更轻的代理方案。我一直在寻找chishoppip2pi。我不确定他们是否会直接使用easy_install,但值得一试。

还值得注意的是,如果你使用pip,你可以直接从tarball安装。