我现在已经坐了一会儿,这就是问题所在。你知道我是否能够以任何方式引用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中的分支一样。 提前谢谢。
答案 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()创建的子进程。尽管在全球范围内设置这样的别名很麻烦,但您不希望修改潜在用户的系统注册表来实现这一点。