如何让Poetry安装时忽略可编辑依赖配置?
解决方案:在Docker中忽略Poetry可编辑依赖安装
方法一:临时修改配置文件(无需插件)
适合不想折腾插件的场景,直接在Docker构建流程里调整pyproject.toml:
- 复制项目文件到镜像后,用脚本替换掉可编辑依赖的声明。比如把带
editable = true的依赖项改成普通本地依赖:
示例用sed快速替换(如果依赖项格式固定):
要是依赖多或者格式复杂,用Python脚本解析toml文件修改更可靠,比如加载sed -i '/^\[tool.poetry.dependencies\]/,/^\[/ s/^my-package = { path = "\.\/my-package\/", editable = true }/my-package = { path = "\.\/my-package\/" }/' pyproject.tomlpyproject.toml后遍历依赖,删掉editable字段再存回去。 - 接着执行
poetry install(或poetry install --no-root如果不需要安装根项目),Poetry就会把这些依赖当作普通本地包完整安装,而非可编辑模式。
方法二:自定义Poetry插件实现
Poetry插件完全能实现这个需求,核心是在安装流程里拦截依赖解析,把可编辑依赖转成普通依赖。
插件实现步骤
初始化插件项目:
新建一个Poetry项目作为插件(比如叫poetry-non-editable-plugin),在pyproject.toml里声明插件入口:[tool.poetry.plugins.poetry.plugin] non_editable = "poetry_non_editable_plugin.plugin:NonEditablePlugin"编写核心逻辑:
监听Poetry的依赖解析前事件,修改依赖的可编辑属性。比如:from poetry.plugins import Plugin from poetry.poetry import Poetry from poetry.utils.env import Env class NonEditablePlugin(Plugin): def activate(self, poetry: Poetry, env: Env) -> None: # 遍历所有依赖,把可编辑标记改成False dep_configs = poetry.pyproject.data["tool"]["poetry"]["dependencies"] for name, config in dep_configs.items(): if isinstance(config, dict) and config.get("editable"): config["editable"] = False # 保存修改后的配置 poetry.pyproject.save()也可以拦截安装器的方法,在安装时动态修改已锁定的依赖属性,避免修改原文件。
Docker中使用插件:
- 在Dockerfile里先安装插件:
poetry self add poetry-non-editable-plugin(要求Poetry 1.2及以上版本) - 再执行
poetry install,插件会自动处理所有可编辑依赖,按普通模式安装。
- 在Dockerfile里先安装插件:
方法三:导出requirements.txt(替代方案)
如果不想改动Poetry的安装逻辑,可以先把依赖导出成requirements.txt再用pip安装:
- 执行
poetry export --without-hashes --format=requirements.txt > requirements.txt,这个命令会自动把可编辑依赖转换成普通的本地路径或PyPI包声明 - Docker里直接用
pip install -r requirements.txt完成安装,完全避开可编辑模式的问题。
内容的提问来源于stack exchange,提问作者Nitzan
相关产品推荐
相关产品推荐

