Python Setuptools和PBR - 如何使用git标签作为版本创建软件包发布?

7
我该如何使用setuptoolspbr创建一个Python包的发布/分发版本,使用git repo标签进行版本控制?
有很多关于基本设置和配置所需的信息: 但是,如何实际创建分发版本的简单信息在哪里?
我正在寻找能够找到带有版本信息的git标签并将其拉入配置信息的命令,以便使用该新版本信息的源代码可以分发,并且版本信息可以从脚本中发现,使用类似于this answer中描述的方法。

附加细节

我正在开发一个项目,将通过git repo分发给其他开发人员,而不是通过PyPi。该项目将作为可执行文件使用pyinstaller发布给用户,因此此软件包分发仅服务于以下几个主要目的:

  1. 为其他开发人员安装/设置软件包,以便可以重新创建依赖项/环境。
  2. 管理版本 - 目前计划使用pbr从Git repo标签生成版本,因此这些标签可以成为我们版本控制的真正来源。
  3. 使用pbr自动生成来自Git的其他单调项目,例如作者、manifest.in文件、发布说明等。

由于setuptools文档专注于设置具有完全可分发和可重用性的包与PyPipip,而pbr文档只是告诉您如何修改setuptools配置以使用 pbr,我找不到关于如何运行发布过程的信息。

我相信这个问题在文档中一定有解答,但是在多次尝试失败后,我想在这里询问。无论我看到的地方都暗示着每个人都知道如何做,或者它只是作为过程的一部分神奇地发生。

难道我错过了显而易见的东西吗?


更新:

根据sinoroc的回答,似乎我需要研究开发模式安装。即任何开发该项目的人都将从git克隆,然后使用setuptools开发安装模式进行安装。

这不是直接与原问题有关,但是暗示了,并且我相信对于处于相同情况的人会很有帮助(这些信息我很难找到)。

有关更新某些元数据的更多信息,请参见他的答案,以及通过this setuptools文档链接进入“开发模式”


注意:我已经开始使用Poetry包作为Python项目的安装/依赖项管理工具。它有一个名为poetry-dynamic-versioning的插件,可以像PBR一样根据git标签驱动版本。它是值得推荐的替代项目框架。 - LightCC
2个回答

3
简言之:
  • python3 setup.py sdist
  • python3 setup.py bdist_wheel

我该如何使用setuptools和pbr创建使用git仓库标签进行版本控制的Python包的发行版/分发版?

使用setuptools创建(源代码和wheel)Python包的分发版的常规命令是:python3 setup.py sdistpython3 setup.py bdist_wheel。 分发版可以在默认情况下在dist目录中找到。

由于setuptools文档侧重于使用PyPi和pip设置完全可分发和可重用的软件包,而pbr文档只告诉您如何修改setuptools配置以使用pbr,因此我找不到有关如何运行分发/发布过程的信息。

确实,setuptools没有记录这个。它只记录了与distutils的差异,确实令人困惑。请参阅以下内容以获取实际文档...

但是,有关如何实际创建分发版的简单信息在哪里?


更新

由于您不打算在像 PyPI 这样的索引上发布项目发行版,而是打算使用 pyinstaller,因此您很可能可以忽略 setuptools 命令,如 sdistbdist_wheel

但是,在开发阶段,您可能需要了解这些命令:

  • 使用诸如 python3 setup.py --versionpython3 setup.py --fullname 等命令来确定 setuptools(在您的情况下为 pbr)是否捕获了正确的信息。
  • 使用 python3 setup.py develop(或 pip install --editable .)将伪链接 (egg-link) 放置在您的 site-packages 中,指向您正在进行的工作。这样,您的更改始终是可安装和可导入的。重要提示:不要使用 python3 setup.py install,否则会将当前版本复制到 site-packages 中,新的更改将无法导入。
现在我不知道一旦你转向使用pyinstaller会发生什么。特别是因为你提到希望从脚本内部可发现元信息(如版本号)。使用setuptools的pkg_resources技术可能在pyinstaller上下文中无法工作。

1
在原问题中添加了一些信息,包括从setuptools文档中的“开发模式”文档的链接。接受了答案。为了澄清我的最后一条评论 - 我认为pkg_resources隐藏了.version方法的依赖关系,而pyinstaller没有发现它,所以如果我明确地导入这些函数,它将强制发现它们,并且工作,但是目前找出这个问题不是首要任务。再次感谢!(如果您觉得有价值,请点赞) - LightCC
1
由于pkg_resources在运行时使用并且是setuptools的一部分,请不要忘记在您的setup.py中将setuptools添加到install_requires中。或者,您可以使用importlib.metadata.version('Example')。也许这些操作之一可以帮助pyinstaller解决问题。 - sinoroc
1
我尝试升级到v3.8.0,但由于某些不兼容性(我最好的猜测),pyinstaller失败了。我在回到可用的v3.7.4时遇到了问题,但是在删除PYTHONHOMEPYTHONPATH并使用py -3.7 -m venv .venv37进行干净的venv后,重新安装所有依赖项等之后,现在pyinstaller成功地使用pkg_resources.get_distribution('pkg').version编译,而以前它无法工作。我做的某些事情解决了这个问题-可能是删除环境变量,但不确定... - LightCC
1
好的,我已经搞定了 pyinstaller。我不得不强制包含 mypackage.egg-info 目录数据文件(其中包含包元数据),以便在 pyinstaller 构建 exe 时包含它们。这在 这个答案 中有解释,我列出了我发现的不同方法。 - LightCC
1
使用 py setup.py install 看起来可以正常更新元数据(并且它将重新安装任何入口点脚本),至少在至少运行了一次 py setup.py -e . 之后如此。我已经将这部分纳入了我的标准发布流程 - 运行 py setup.py install 然后运行 pyinstaller 来创建可执行文件。如果我需要运行或调试本地开发更改,我只需直接使用我的入口点脚本(它被恰当地命名为 run.py ...) - LightCC
显示剩余3条评论

1
这是我解决相同问题的方法,也阅读了几个不同的链接。 我创建了一个包含以下内容的setup.py文件:
from setuptools import setup, find_packages

def readme():
    with open('README.rst') as f:
        return f.read()

def read_other_requirements(other_type):
    with open(other_type+'-requirements.txt') as f:
        return f.read()

setup(
      setup_requires=read_other_requirements('setup'),
      pbr=True,
      packages=find_packages('src'),
      package_dir={'': 'src'},
      include_package_data=True,
      zip_safe=True
)

我有源代码在./src中。另外,我有一个setup-requirements.txt,其内容如下:
pip==18.1
pbr==5.1.1
setuptools==40.7.0

有一个包含以下内容的 setup.cfg 文件:

[metadata]
name = XXXXX
description = XXXXX
description-file = README.rst
home-page = https://github.com/XXXXX/XXXXX

首先,您需要安装设置要求:

pip install -r setup-requirements.txt

然后,每当您在本地提交了一个在GitHub中标记过的提交时,可以使用以下命令进行安装:

python setup.py install

它将与已标记的版本一起安装。您可以通过执行以下操作来检查:

python setup.py --version


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接