我一直在尝试安装一个配置了以下设置的包:
setup(
packages=find_packages(),
include_package_data=True,
install_requires=[
'Django==1.5.1',
'xhtml2pdf',
],
dependency_links=[
'https://github.com/chrisglass/xhtml2pdf/zipball/28d12fcaafc4c47b13f1f6f42c2bfb73f90cc947#egg=xhtml2pdf',
],
)
但是,它从PyPi安装XHTML2PDF包,而不是使用指定的链接。根据输出(我使用pip install -vvv package.tar.gz
运行安装),它要么无法从链接解析版本(代码中的// 1
),要么我没有指定正确的项目名称(代码中// 2
):
Downloading/unpacking xhtml2pdf (from mypackage==1.3)
Getting page https://pypi.python.org/simple/xhtml2pdf/
URLs to search for versions for xhtml2pdf (from mypackage==1.3):
* https://pypi.python.org/simple/xhtml2pdf/
* https://github.com/chrisglass/xhtml2pdf/zipball/28d12fcaafc4c47b13f1f6f42c2bfb73f90cc947#egg=xhtml2pdf
Getting page https://github.com/chrisglass/xhtml2pdf/zipball/28d12fcaafc4c47b13f1f6f42c2bfb73f90cc947
Analyzing links from page https://pypi.python.org/simple/xhtml2pdf/
Found link https://pypi.python.org/packages/source/x/xhtml2pdf/xhtml2pdf-0.0.1.tar.gz#md5=9f83a2bcb67858aca9e058761f3bea7b (from https://pypi.python.org/simple/xhtml2pdf/), version: 0.0.1
Found link https://pypi.python.org/packages/source/x/xhtml2pdf/xhtml2pdf-0.0.2.tar.gz#md5=d640ccb9470942fd2e6d3ae740c27dc1 (from https://pypi.python.org/simple/xhtml2pdf/), version: 0.0.2
Found link https://pypi.python.org/packages/source/x/xhtml2pdf/xhtml2pdf-0.0.1.zip#md5=4ad41c845735ae14da99085311d84c00 (from https://pypi.python.org/simple/xhtml2pdf/), version: 0.0.1
Found link https://pypi.python.org/packages/source/x/xhtml2pdf/xhtml2pdf-0.0.4.zip#md5=5f035cd6532bef99b7d35054caaa6ef7 (from https://pypi.python.org/simple/xhtml2pdf/), version: 0.0.4
Found link https://pypi.python.org/packages/source/x/xhtml2pdf/xhtml2pdf-0.0.3.zip#md5=32599c74f26f57ebd002765741ec64f7 (from https://pypi.python.org/simple/xhtml2pdf/), version: 0.0.3
Found link https://pypi.python.org/packages/source/x/xhtml2pdf/xhtml2pdf-0.0.2.zip#md5=4047a8234eb6b77591d526dcb1f60161 (from https://pypi.python.org/simple/xhtml2pdf/), version: 0.0.2
Found link https://pypi.python.org/packages/source/x/xhtml2pdf/xhtml2pdf-0.0.3.tar.gz#md5=13b0d6059b72c994473fddfa7a528451 (from https://pypi.python.org/simple/xhtml2pdf/), version: 0.0.3
Found link https://pypi.python.org/packages/source/x/xhtml2pdf/xhtml2pdf-0.0.5.zip#md5=8db99aae8536436a2b7b0b3987197b99 (from https://pypi.python.org/simple/xhtml2pdf/), version: 0.0.5
Found link https://pypi.python.org/packages/source/x/xhtml2pdf/xhtml2pdf-0.0.5.tar.gz#md5=1ef268b40c11bf966f7c6c5504299e3e (from https://pypi.python.org/simple/xhtml2pdf/), version: 0.0.5
Found link https://pypi.python.org/packages/source/x/xhtml2pdf/xhtml2pdf-0.0.4.tar.gz#md5=36b015a4e2918460711cbc5eebe026ce (from https://pypi.python.org/simple/xhtml2pdf/), version: 0.0.4
Analyzing links from page https://codeload.github.com/chrisglass/xhtml2pdf/legacy.zip/28d12fcaafc4c47b13f1f6f42c2bfb73f90cc947
Could not parse version from link: https://github.com/chrisglass/xhtml2pdf/zipball/28d12fcaafc4c47b13f1f6f42c2bfb73f90cc947#egg=xhtml2pdf // 1
Skipping link https://github.com/chrisglass/xhtml2pdf/zipball/28d12fcaafc4c47b13f1f6f42c2bfb73f90cc947#egg=xhtml2pdf; wrong project name (not xhtml2pdf) // 2
Using version 0.0.5 (newest of versions: 0.0.5, 0.0.5, 0.0.4, 0.0.4, 0.0.3, 0.0.3, 0.0.2, 0.0.2, 0.0.1, 0.0.1)
Downloading xhtml2pdf-0.0.5.zip (118kB):
Downloading from URL https://pypi.python.org/packages/source/x/xhtml2pdf/xhtml2pdf-0.0.5.zip#md5=8db99aae8536436a2b7b0b3987197b99 (from https://pypi.python.org/simple/xhtml2pdf/)
...Downloading xhtml2pdf-0.0.5.zip (118kB): 118kB downloaded
如果我在install_requires
和dependency_links
中都将版本号添加到包(xhtml2pdf-0.0.5
)中,它会找到Git链接,并且不会抱怨它们,但仍然从PyPi安装。
我一直在寻找答案,但一直没能找到解决方案。我需要Git版本,因为它有PyPi版本还没有的修复。
好的,所以我解决了(或者被破解了,取决于你怎么看)我自己的问题。
代码有两个问题。
第一个问题是链接不正确。尽管我在其他地方看到过这样的格式,但它对我来说不起作用(无论是使用setuptools mkvirtualenv mypackage
还是分发mkvirtualenv --distribute mypackage
)。我认为它最后需要zip扩展,并在Github上发现您可以使用https://github.com/user/project/archive/commit.zip
格式下载特定的提交。
然后我仍然有一个问题,尽管它现在可以识别链接,但它仍然会选择PyPi版本而不是Github版本。原因是Github上的最后一次提交(在发布到PyPi之后)仍然与PyPi上的最新版本具有相同的版本号。所以事实证明,这个问题实际上是"我如何让setuptools从另一个源安装一个';s也可以在pypi上使用相同的版本号?。为了解决这个问题,我在setup.py
中尝试了以下设置(其中一些设置在其他堆栈溢出问题中也提到过):
install_requires=[],
dependency_links=['https://github.com/chrisglass/xhtml2pdf/archive/28d12fcaafc4c47b13f1f6f42c2bfb73f90cc947.zip',],
这根本没有安装xhtml2pdf。
install_requires=['xhtml2pdf',],
dependency_links=['https://github.com/chrisglass/xhtml2pdf/archive/28d12fcaafc4c47b13f1f6f42c2bfb73f90cc947.zip#egg=xhtml2pdf',],
这安装了最新的PyPi版本(0.0.5)。
install_requires=['xhtml2pdf==0.0.5',],
dependency_links=['https://github.com/chrisglass/xhtml2pdf/archive/28d12fcaafc4c47b13f1f6f42c2bfb73f90cc947.zip#egg=xhtml2pdf-0.0.5',],
这在PyPi中安装了0.0.5版本。如果版本号相同,setuptools和distribute会选择PyPi版本而不是Github版本,这实际上是有道理的,因为PyPi的版本应该更稳定。
install_requires=['xhtml2pdf==0.0.6',],
dependency_links=['https://github.com/chrisglass/xhtml2pdf/archive/28d12fcaafc4c47b13f1f6f42c2bfb73f90cc947.zip#egg=xhtml2pdf-0.0.6',],
它从Github下载了该包(因为PyPi上不存在0.0.6版本),但在安装时它抱怨版本不匹配,因为包中指定的版本实际上是0.0.5。
install_requires=['xhtml2pdf<=0.0.6',],
dependency_links=['https://github.com/chrisglass/xhtml2pdf/archive/28d12fcaafc4c47b13f1f6f42c2bfb73f90cc947.zip#egg=xhtml2pdf-0.0.6',],
这终于奏效了。Setuptools(和发行版)意识到Github的版本必须更新,因为这是我告诉它的。到了安装时,它没有抱怨实际版本是0.0.5,因为它仍然符合要求。
你可能会认为这有点像黑客。我对这个解决方案并不完全满意。但我也有一个截止日期,它是有效的。需要提醒的是:当0.0.6版本真正发布时,我将开始出现问题。我想正确地固定我的依赖项,这样我以后在重新安装时就不会遇到问题,而且这不是一个正确的固定项。但是,我想您可以使用以下文档来篡改版本号:https://pythonhosted.org/setuptools/setuptools.html#specifying-您的项目版本。关键是这个版本应该(假装)高于0.0.5,但也应该是一个数字(带有可选字符),你不会期望它在未来的PyPi中作为一个版本出现(显然低于下一个版本号(在我的情况下是0.0.6))。
我希望这对其他人有帮助:)。
注意:我使用requirements.txt
文件,该文件由setup.py
文件处理以提取需求。当您在requirements.txt
文件中使用https://github.com/chrisglass/xhtml2pdf/archive/28d12fcaafc4c47b13f1f6f42c2bfb73f90cc947.zip#egg=xhtml2pdf-0.0.6
时,它仍然会使用pip install -r requirements.txt
进行精细安装。