【问题标题】:Python Setuptools and PBR - how to create a package release using the git tag as the version?Python Setuptools 和 PBR - 如何使用 git 标签作为版本创建包发布?
【发布时间】:2020-02-17 20:30:51
【问题描述】:

如何使用setuptoolspbr 实际创建使用git repo 标记进行版本控制的python 包的发布/发行版?

有大量关于所需基本设置和配置的信息:

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

即我正在寻找任何命令找到带有版本信息的 git 标记并将其拉入配置信息中,因此可以分发具有该新版本信息的源,并且可以使用描述的方法从脚本中发现版本信息在this answer


其他细节

我正在开发一个仅通过 git 存储库而不是通过 PyPi 分发给其他开发人员的项目。该项目将使用pyinstaller 以可执行文件的形式发布给用户,因此此包分发仅用于几个关键目的:

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

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

我确定它存在于文档中的某个地方,但是在几次错误的开始之后我在这里问。我所看到的任何地方都暗示每个人要么知道如何做到这一点,要么它只是作为过程的一部分神奇地发生了。

我只是错过了显而易见的事情吗?


更新:

根据 sinoroc 的回答,看来我需要查看开发模式安装。即任何开发项目的人都会从 git 克隆,然后使用setuptools 开发安装模式进行安装。

这不是原始问题的直接部分,而是暗示的,我相信处于相同情况的人会感兴趣(我无法轻易找到的信息)。

更多信息可在他关于更新一些元数据的回答中获得,并通过this setuptools documentation link to working in "Development Mode"

【问题讨论】:

    标签: python git versioning setuptools python-pbr


    【解决方案1】:

    简而言之:

    • python3 setup.py sdist
    • python3 setup.py bdist_wheel

    如何使用 setuptools 和 pbr 实际创建一个使用 git repo 标签进行版本控制的 python 包的发布/发行版?

    使用 setuptools 创建 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),指向您正在进行的工作。这样,您的更改始终已安装并可导入。重要提示:请勿使用 python3 setup.py install,这会将当前版本复制到 site-packages,并且无法导入较新的更改。

    现在我不知道一旦您转到 pyinstaller,这一切将如何运作。特别是因为您提到您希望从脚本中发现 元信息(例如版本号)。 setuptools pkg_resources 的技术在 pyinstaller 上下文中可能有效,也可能无效。

    【讨论】:

    • 在原始问题中添加了一些信息,包括 setuptools 文档中“开发模式”文档的链接。接受了答案。为了澄清我的最后一条评论 - 我认为 pkg_resources 隐藏了 .version 方法依赖项并且 pyinstaller 没有发现它,所以如果我显式导入这些函数,它将强制它发现它们并工作,但弄清楚这是一个低目前优先。再次感谢! (如果您觉得值得,请点赞提问)
    • 由于pkg_resources 在运行时使用并且是setuptools 的一部分,因此不要忘记将setuptools 添加到install_requires 中的setup.py。或者,您可以改用importlib.metadata.version('Example')。也许其中一项操作可以帮助 pyinstaller 解决问题。
    • 我尝试升级到 v3.8.0,但 pyinstaller 由于一些不兼容而崩溃(我的猜测)。我在恢复到正常工作的 v3.7.4 时遇到了问题,但是在删除 PYTHONHOMEPYTHONPATH,并使用 py -3.7 -m venv .venv37 执行干净的 venv,然后重新安装所有依赖项等之后,现在 pyinstaller 已成功编译使用pkg_resources.get_distribution('pkg').version,之前它不工作。我所做的事情解决了这个问题 - 可能删除了环境变量,但不确定......
    • 好的,找到pyinstaller。当pyinstaller 构建exe 时,我不得不强制包含mypackage.egg-info 目录数据文件(具有包元数据)。 this answer 对此进行了解释,我在其中列出了我发现的不同方法。
    • 使用py setup.py install 似乎可以很好地更新元数据(并且它将重新安装任何入口点脚本),至少在至少运行一次py setup.py -e . 之后。我已经将这部分作为标准发布过程的一部分——运行py setup.py install,然后运行 ​​pyinstaller 以生成可执行文件。如果我需要运行或调试本地开发更改,我只需直接使用我的入口点脚本(恰当地命名为 run.py...)
    【解决方案2】:

    这就是我解决相同问题的方法,还阅读了几个不同的链接。 我创建了一个包含以下内容的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
    

    首先,您安装 setup-requirements:

    pip install -r setup-requirements.txt

    然后,只要您在本地有一个在 GitHub 中标记的提交,您就可以使用以下方式安装它:

    python setup.py install

    它将与标记版本一起安装。 您可以通过以下方式进行检查:

    python setup.py --version

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-29
      • 1970-01-01
      • 2018-07-01
      • 2016-06-18
      • 1970-01-01
      • 2012-08-13
      • 1970-01-01
      • 2015-03-03
      相关资源
      最近更新 更多