精简版:
我怎样才能poetry install
得到一个依赖项之一是本地 tarball/zip 文件的包?它似乎不起作用,但它显示在poetry
文档中?
当从 gitlab 中提取依赖项时,我可以poetry install
打包,但是当我从 gitlab 手动下载依赖项作为 tarball 并尝试poetry install
使用 tarball 中的依赖项时,安装失败。
长版:
我正在尝试使用poetry
安装我开发的两个软件包:
- 一个名为的基础包
my_package
- 一个名为
extension_of_my_package
.
这两个包都在 gitlab 的私有仓库中,并且都有一个pyproject.toml
包含它们的依赖项列表。当从 gitlab 下载基础包时,我可以成功poetry install
扩展包( )。即文件中有一个部分给出了 gitlab 上的私有repo 的位置。extension_of_my_package
my_package
pyproject.toml
extension_of_my_package
tool.poetry.source
my_package
但是,外部用户无法访问我的私人仓库,因此我需要确保可以从 tarball 安装软件包(我从 gitlab 下载并提供给客户端)。
要安装extension_of_my_package
我这样做:
tar xzf extension_of_my_package.tgz
cd extension_of_my_package/python
然后编辑pyproject.toml
,将依赖项更改my_package
为指向本地压缩包:
my_package = { path = "/path/to/my_package.tgz"}
然后运行poetry install
。这失败并显示错误消息:
> poetry install
Updating dependencies
Resolving dependencies... (9.3s)
TypeError
expected string or bytes-like object
at /home/user/.poetry/lib/poetry/_vendor/py3.8/poetry/core/utils/helpers.py:27 in canonicalize_name
23│ _canonicalize_regex = re.compile(r"[-_]+")
24│
25│
26│ def canonicalize_name(name): # type: (str) -> str
→ 27│ return _canonicalize_regex.sub("-", name).lower()
28│
29│
30│ def module_name(name): # type: (str) -> str
31│ return canonicalize_name(name).replace(".", "_").replace("-", "_")
根据poetry
文档,可以从本地文件安装:
[tool.poetry.dependencies]
# directory
my-package = { path = "../my-package/", develop = false }
# file
my-package = { path = "../my-package/dist/my-package-0.1.0.tar.gz" }
我也尝试过使用my-package = { file = ...
而不是my-package = { path = ...
,但它也不起作用。
我尝试添加一个最小的setup.py
文件my_package
(见这篇文章),但这没有帮助。
我尝试将my_package
(以 tarball 格式)转换为wheel
. 我可以在poetry install
格式中成功,但没有安装依赖项。我看不到如何在轮子中包含依赖信息。当我创建轮子时,我尝试以两种方式指定依赖信息:my package
wheel
my_packages
- 在
setup.cfg
:
[metadata]
name = my_package
version = 0.1.0
description = My Package
license = Proprietary
[options]
packages = find:
install_requires =
matplotlib >=3.2.0
和
- 在
setup.py
“
from setuptools import setup
setup(
name=`my_package`,
version="0.1.0,
packages=['.my_package'],
install_requires=['matplotlib >= 3.2.0',]
)
为了排除我自己的包的任何问题,我创建了一个最小测试并尝试从其 zip 文件(从 github 下载)中poetry install
获取一个公开可用的包(tqdm)。它也失败了。这个pyproject.toml
最小测试是:
[tool.poetry]
name = "tester"
version = "0.0.1"
description = "test package"
authors = [ "me" ]
packages = [
{ include = "tester" }
]
[tool.poetry.dependencies]
python = ">=3.7,<3.9"
tqdm = {file = "/home/user/tqdm-master.zip"}
错误信息是:
> poetry install
Updating dependencies
Resolving dependencies... (13.0s)
RuntimeError
Unable to determine package info from path: /home/user/tqdm-master.zip
at /home/user/.poetry/lib/poetry/puzzle/provider.py:251 in get_package_from_file
247│ package = PackageInfo.from_path(path=file_path).to_package(
248│ root_dir=file_path
249│ )
250│ except PackageInfoError:
→ 251│ raise RuntimeError(
252│ "Unable to determine package info from path: {}".format(file_path)
253│ )
254│
255│ return package
我使用的是poetry
1.1.13 版。
我对任何替代方法持开放态度,只要检查所有依赖项即可。