运行 使用 setuptools_scm 从 bdist_wheel 软件包安装的应用程序失败,出现版本查找错误
Running application installed from bdist_wheel package using setuptools_scm fails with version lookup error
TL;DR
我正在尝试为使用 setuptools-scm
的项目创建内置分发包。我生成了 wheel 包 运行ning python setup.py sdist bdist_wheel
。我可以使用 pip install ...
安装 .whl
包。但是当我尝试 运行 程序时,它抛出以下错误:
Traceback (most recent call last):
File "/home/zobayer/Projects/opensource/staging/myproject/venv/bin/mymodule", line 5, in <module>
from mymodule.cli import main
File "/home/zobayer/Projects/opensource/staging/myproject/venv/lib64/python3.8/site-packages/mymodule/cli.py", line 4, in <module>
from mymodule.contexts import ContextConfig
File "/home/zobayer/Projects/opensource/staging/myproject/venv/lib64/python3.8/site-packages/mymodule/contexts/__init__.py", line 2, in <module>
from mymodule.contexts.context_config import ContextConfig
File "/home/zobayer/Projects/opensource/staging/myproject/venv/lib64/python3.8/site-packages/mymodule/contexts/context_config.py", line 8, in <module>
from mymodule.commons import local_config_file_path, user_config_file_path
File "/home/zobayer/Projects/opensource/staging/myproject/venv/lib64/python3.8/site-packages/mymodule/commons/__init__.py", line 19, in <module>
version = get_version(root="../..", relative_to=__file__)
File "/home/zobayer/Projects/opensource/staging/myproject/venv/lib64/python3.8/site-packages/setuptools_scm/__init__.py", line 144, in get_version
return _get_version(config)
File "/home/zobayer/Projects/opensource/staging/myproject/venv/lib64/python3.8/site-packages/setuptools_scm/__init__.py", line 148, in _get_version
parsed_version = _do_parse(config)
File "/home/zobayer/Projects/opensource/staging/myproject/venv/lib64/python3.8/site-packages/setuptools_scm/__init__.py", line 110, in _do_parse
raise LookupError(
LookupError: setuptools-scm was unable to detect version for '/home/zobayer/Projects/opensource/staging/myproject/venv/lib64/python3.8/site-packages'.
这是目录树的简单视图(没有展开 .git\
)
myproject
├── .git
├── mymodule
│ ├── cli.py
│ ├── commons
│ │ ├── command.py
│ │ ├── helpers.py
│ │ └── __init__.py
│ ├── contexts
│ │ ├── context_config.py
│ │ └── __init__.py
│ ├── __init__.py
│ └── version.py
├── LICENSE
├── MANIFEST.in
├── pyproject.toml
├── README.md
├── requirements.txt
├── setup.cfg
├── setup.py
└── tox.ini
此处mymodule/version.py
未被跟踪。回购协议是干净的和标记的。使用 setuptools 49.1.0
和 setuptools_scm 4.1.2
,我配置了以下内容:
setup.py
(省略元数据字段)
setup(
name="myproject",
use_scm_version=True,
setup_requires=["wheel", "setuptools-scm"],
packages=find_packages(exclude=["docs*", "tests*"]),
include_package_data=True,
install_requires=install_dependencies,
)
setup.cfg
[metadata]
license_files = LICENSE
[options]
setup_requires =
wheel==0.34.2
setuptools_scm==4.1.2
pyproject.toml
[build-system]
requires = ["setuptools>=42", "wheel", "setuptools_scm[toml]>=3.4"]
build-backend = "setuptools.build_meta"
[tool.setuptools_scm]
write_to = "mymodule/version.py"
write_to_template = "# -*- coding: utf-8 -*-\n\n__version__ = '{version}'\n"
version_scheme = "release-branch-semver"
我想在这里指出,安装与预期的 pip install -e .
和应用程序 运行s 一起工作。
我尝试在调用 get_version
时更新 root
和 relative_to
参数,并更新 use_scm_version
以使用配置字典,但均无济于事。我查看了 github 中的官方问题,但无法解决此问题。在这一点上,我确信我误解了setuptools_scm
并且可能配置错误。
您不应该在实际代码中使用 setuptools-scm
,它仅用于打包。它会查找 VCS 存储库以从其元数据(git 标签等)中读取版本,因此很明显它会在安装包时失败。如果您尝试获取已安装软件包的版本,请使用 importlib.metadata
(part of standard library since 3.8, for older versions there's a backport: importlib-metadata
)。示例:
>>> from importlib.metadata import version
>>> version('myproject')
'0.0.1'
您也可以使用 pkg_resources
(setuptools
的一部分)查询版本元数据,但请注意它现在已被 importlib.metadata
取代:
>>> import pkg_resources
>>> pkg_resources.get_distribution('myproject').version
'0.0.1'
TL;DR
我正在尝试为使用 setuptools-scm
的项目创建内置分发包。我生成了 wheel 包 运行ning python setup.py sdist bdist_wheel
。我可以使用 pip install ...
安装 .whl
包。但是当我尝试 运行 程序时,它抛出以下错误:
Traceback (most recent call last):
File "/home/zobayer/Projects/opensource/staging/myproject/venv/bin/mymodule", line 5, in <module>
from mymodule.cli import main
File "/home/zobayer/Projects/opensource/staging/myproject/venv/lib64/python3.8/site-packages/mymodule/cli.py", line 4, in <module>
from mymodule.contexts import ContextConfig
File "/home/zobayer/Projects/opensource/staging/myproject/venv/lib64/python3.8/site-packages/mymodule/contexts/__init__.py", line 2, in <module>
from mymodule.contexts.context_config import ContextConfig
File "/home/zobayer/Projects/opensource/staging/myproject/venv/lib64/python3.8/site-packages/mymodule/contexts/context_config.py", line 8, in <module>
from mymodule.commons import local_config_file_path, user_config_file_path
File "/home/zobayer/Projects/opensource/staging/myproject/venv/lib64/python3.8/site-packages/mymodule/commons/__init__.py", line 19, in <module>
version = get_version(root="../..", relative_to=__file__)
File "/home/zobayer/Projects/opensource/staging/myproject/venv/lib64/python3.8/site-packages/setuptools_scm/__init__.py", line 144, in get_version
return _get_version(config)
File "/home/zobayer/Projects/opensource/staging/myproject/venv/lib64/python3.8/site-packages/setuptools_scm/__init__.py", line 148, in _get_version
parsed_version = _do_parse(config)
File "/home/zobayer/Projects/opensource/staging/myproject/venv/lib64/python3.8/site-packages/setuptools_scm/__init__.py", line 110, in _do_parse
raise LookupError(
LookupError: setuptools-scm was unable to detect version for '/home/zobayer/Projects/opensource/staging/myproject/venv/lib64/python3.8/site-packages'.
这是目录树的简单视图(没有展开 .git\
)
myproject
├── .git
├── mymodule
│ ├── cli.py
│ ├── commons
│ │ ├── command.py
│ │ ├── helpers.py
│ │ └── __init__.py
│ ├── contexts
│ │ ├── context_config.py
│ │ └── __init__.py
│ ├── __init__.py
│ └── version.py
├── LICENSE
├── MANIFEST.in
├── pyproject.toml
├── README.md
├── requirements.txt
├── setup.cfg
├── setup.py
└── tox.ini
此处mymodule/version.py
未被跟踪。回购协议是干净的和标记的。使用 setuptools 49.1.0
和 setuptools_scm 4.1.2
,我配置了以下内容:
setup.py
(省略元数据字段)
setup(
name="myproject",
use_scm_version=True,
setup_requires=["wheel", "setuptools-scm"],
packages=find_packages(exclude=["docs*", "tests*"]),
include_package_data=True,
install_requires=install_dependencies,
)
setup.cfg
[metadata]
license_files = LICENSE
[options]
setup_requires =
wheel==0.34.2
setuptools_scm==4.1.2
pyproject.toml
[build-system]
requires = ["setuptools>=42", "wheel", "setuptools_scm[toml]>=3.4"]
build-backend = "setuptools.build_meta"
[tool.setuptools_scm]
write_to = "mymodule/version.py"
write_to_template = "# -*- coding: utf-8 -*-\n\n__version__ = '{version}'\n"
version_scheme = "release-branch-semver"
我想在这里指出,安装与预期的 pip install -e .
和应用程序 运行s 一起工作。
我尝试在调用 get_version
时更新 root
和 relative_to
参数,并更新 use_scm_version
以使用配置字典,但均无济于事。我查看了 github 中的官方问题,但无法解决此问题。在这一点上,我确信我误解了setuptools_scm
并且可能配置错误。
您不应该在实际代码中使用 setuptools-scm
,它仅用于打包。它会查找 VCS 存储库以从其元数据(git 标签等)中读取版本,因此很明显它会在安装包时失败。如果您尝试获取已安装软件包的版本,请使用 importlib.metadata
(part of standard library since 3.8, for older versions there's a backport: importlib-metadata
)。示例:
>>> from importlib.metadata import version
>>> version('myproject')
'0.0.1'
您也可以使用 pkg_resources
(setuptools
的一部分)查询版本元数据,但请注意它现在已被 importlib.metadata
取代:
>>> import pkg_resources
>>> pkg_resources.get_distribution('myproject').version
'0.0.1'