我试图编写一个可以从PyPI安装的python包,但我无法正确理解如何正确地构建setup.py
和requirements.txt
。
我知道他们有不同的语义和不同的目的,setup.py
定义了所需的内容,requirements.txt
给出了确切的版本。我也知道你shouldn't read requirements.txt
into setup.py
。
所以我需要知道的是如何构建setup.py
和requirements.txt
,以便在从PyPI安装我的软件包时,就会安装reight要求。
在我的示例中,我需要django-haystack
(最新版本为2.5.1
),但我的代码仅与django-haystack
版本2.5.0
兼容,因此我的{{1 }和setup.py
如下所示:
requirements.txt
:
setup.py
setup(
name='my_package',
install_requires = [
'django-haystack',
],
)
:
requirements.txt
如何构建我的设置代码,以便在安装时,django-haystack==2.5.0
安装的不是最新的?
答案 0 :(得分:2)
首先,警告:在没有范围的setup.py
文件中指定显式版本要求将保证将来对最终用户感到沮丧。
您可以在setup.py
文件中执行此操作。
setup(
name='my_package',
install_requires=[
'django-haystack==2.5.0',
],
)
但是,如果其他用户希望使用另一个需要django-haystack
最新版本的软件包,则由于版本冲突问题,他们将无法按照定义安装软件包。当然,如果手头的包装太脆弱,甚至无法尝试使用语义版本,那么就没有太多可以做的了。
现在,如果你所追求的是一个可重现的构建,requirements.txt
方法可用于环境中所有包的显式版本要求,这与典型的带外包依赖结构,但是它不会受到冲突的需求的严重锁定,这些冲突实际上并不存在冲突。 zc.buildout
是另一种选择,但更重要但它比Python更多。