setuptoolspost-install:安装所有软件包以检查版本



在使用Python setuptools的后安装脚本中,这个答案显示了如何生成后install命令。

我想制作一个post-install命令,用于检查来自mono repo的子包之间的版本匹配。

如何获取在发布-install命令期间安装的软件包列表?


当前尝试

from pkg_resources import working_set
from setuptools import setup
from setuptools.command.install import install

class PostInstallCommand(install):
REPO_BASE_NAME = "foo"
def run(self) -> None:
install.run(self)
one_subpkg_name = f"{self.REPO_BASE_NAME}-one"
another_subpkg_name = f"{self.REPO_BASE_NAME}-another"
test_subpkg_name = f"{self.REPO_BASE_NAME}-test"
all_versions: list[str] = [
working_set.by_key[one_subpkg_name].version,
working_set.by_key[another_subpkg_name].version,
working_set.by_key[test_subpkg_name].version,
]
if len(set(all_versions)) != 1:
raise NotImplementedError(
f"test package {test_subpkg_name}'s installed versions "
f"{all_versions} have a mismatch."
)

setup(
...,
cmdclass={"install": PostInstallCommand}
)

这个使用pkg_resources.working_set的解决方案出错了,似乎working_set在安装时不起作用:

...
File "/private/var/folders/41/wlbjqvm94zn1_vbrg9fqff8m0000gn/T/pip-build-env-1iljhvso/overlay/lib/python3.10/site-packages/setuptools/dist.py", line 1217, in run_command
super().run_command(command)
File "/private/var/folders/41/wlbjqvm94zn1_vbrg9fqff8m0000gn/T/pip-build-env-1iljhvso/overlay/lib/python3.10/site-packages/setuptools/_distutils/dist.py", line 987, in run_command
cmd_obj.run()
File "<string>", line 39, in run
KeyError: 'foo-one'

进一步信息

为什么我们不能简单地固定版本?长话短说,我们使用setuptools_scmget_version来动态同步requirements.txt中的版本,因此我们无法提前访问这些版本。

我不确定走这条路是否是最佳实践,但如果真的想要,可以在安装后运行pip freeze,将输出解析为一个集合/dicts数组,并在数组项之间执行Set.difference()

subpackage_deps = [
{"foo=1.1.0", "bar=1.0.0"},
{"foo=1.1.0", "baz=2.0.1"}
]
subpackage_deps[0] - sub package_deps[1]

I、 但是,不要认为这样做有什么意义。为什么不让安装工具来完成它的工作呢?如果你关心项目之间的一致性,为什么不编写一个自动化测试,并使用持续集成来强制执行它,以确保子项目之间依赖版本的奇偶性(即:通过比较跨setup.py的依赖版本(?

参考文献

https://docs.python.org/3/tutorial/datastructures.html#sets

最新更新