通过Python setuptools获取远程git分支

时间:2016-02-19 20:21:39

标签: python git github setuptools setup.py

我现在已经坐了一会儿,这就是问题所在。你知道我是否能够以任何方式引用setup.py中的git分支?是' @'标志应该这样做?或者它仅用于标签和提交?这是我试图做的一个例子。

# setup.py
...
install_requires=['Django==1.5.11']
dependency_links=['git+https://github.com/django-nonrel/django.git@nonrel-1.5#egg=Django-1.5.11']
...
#python setup.py develop
running develop
running egg_info
...
Processing dependencies for mypackage
Searching for Django==1.5.11
Best match: Django 1.5.11
Doing git clone from https://github.com/django-nonrel/django.git to c:\users\my_user_name\appdata\local\temp\easy_install-ci3vh1\django.git@nonrel-1.5
Checking out nonrel-1.5
fatal: Not a git repository (or any of the parent directories): .git

当我没有引用任何分支时,上面的工作没有问题:

git+https://github.com/django-nonrel/django.git#egg=Django

当我用pip运行它时:

pip install git+https://github.com/django-nonrel/django.git@nonrel-1.5

我出于目的包含了包名,因此您可以查看他们的git repo设置。我没有要求从git安装软件包的替代方法,因为我知道它们。就好像可以引用setup.py中的分支一样。 提前谢谢。

2 个答案:

答案 0 :(得分:0)

只需将egg放在git网址的末尾

即可

pip install git+https://github.com/django-nonrel/django.git@nonrel-1.5#egg=Django

答案 1 :(得分:0)

我正在深入研究setuptools实现(https://github.com/jaraco/setuptools保留了一个最新的镜像以便于浏览),看起来我已经找到了问题所在。如果我们查看负责下载package_index.py中定义的git repos的函数:

    def _download_git(self, url, filename):
    filename = filename.split('#',1)[0]
    url, rev = self._vcs_split_rev_from_url(url, pop_prefix=True)

    self.info("Doing git clone from %s to %s", url, filename)
    os.system("git clone --quiet %s %s" % (url, filename))

    if rev is not None:
        self.info("Checking out %s", rev)
        os.system("(cd %s && git checkout --quiet %s)" % (
            filename,
            rev,
        ))

    return filename

我们可以看到它首先将其克隆到某个目录(通常是系统临时),然后“cd git checkout”分支。不幸的是,最近我被迫在Windows上工作,我讨厌(Arch Linux Linux万岁!),这个checkout命令的问题是这个系统上的cd不会自动切换驱动器。因此,如果您的软件包位于其他分区/驱动器上而不是临时目录,则无法运行。我检查了纠正它:

(cd /d %s && git checkout --quiet %s)

解决了这个问题。这是系统特定的,所以我们(可能)不想做PR来设置工具人来修改它。相反,我所做的是在我的包文件夹中创建一个临时目录并添加

import tempfile
tempfile.tempdir=os.getcwd()+"\\temp\\"

到我的setup.py,它临时更改easy_install的临时目录。那是因为我知道setuptools使用easy_install,easy_install使用tempfile来获取temp dir的位置。这是一个很好的解决方案,我坚持使用它,但为了传播信息,我还提到我尝试的另一件事是为“cd”创建一个临时系统别名为“cd / d”。在Windows上,这是doskey命令。不幸的是,这是一个本地命令,不会传播到使用os.system()创建的子进程。尽管在全球范围内设置这样的别名很麻烦,但您不希望修改潜在用户的系统注册表来实现这一点。