如何基于Cookiecutter模板变量向pyproject.toml按需添加Poetry源并规范空行?
问题的核心是Jinja2模板渲染时会保留条件标签前后的换行,导致生成的pyproject.toml出现多余空行。要解决这个问题,关键是利用Jinja2的空白控制语法,同时合理组织模板结构,确保各配置块之间始终只保留1个空行。
具体模板实现
修改你的pyproject.toml模板如下:
# pyproject.toml ... [[tool.poetry.source]] name = "internal_repo1" url = "https://internal_repo1/simple" default = true {%- if cookiecutter.use_internal_repo == "Yes" %} [[tool.poetry.source]] name = "internal_repo" url = "https://internal_repo/simple" default = true {%- endif %} [build-system] requires = ["poetry-core>=1.0.0"] build-backend = "poetry.core.masonry.api"
实现原理
- 空白控制标签:使用
{%- if ... -%}和{%- endif -%}(标签内侧的减号),会自动吃掉标签前后的多余换行,避免因条件不满足时产生空行堆积。 - 空行精准控制:在
{%- if %}标签后添加一个换行,确保当用户选择"Yes"时,新添加的源块和前面的源块之间保留1个空行;条件结束标签的空白控制则保证无论条件是否满足,最终和[build-system]块之间都只有1个空行。
验证效果
- 当用户选择"Yes"时,生成的文件结构:
# pyproject.toml ... [[tool.poetry.source]] name = "internal_repo1" url = "https://internal_repo1/simple" default = true [[tool.poetry.source]] name = "internal_repo" url = "https://internal_repo/simple" default = true [build-system] requires = ["poetry-core>=1.0.0"] build-backend = "poetry.core.masonry.api"
- 当用户选择"No"时,生成的文件结构:
# pyproject.toml ... [[tool.poetry.source]] name = "internal_repo1" url = "https://internal_repo1/simple" default = true [build-system] requires = ["poetry-core>=1.0.0"] build-backend = "poetry.core.masonry.api"
两种场景下,所有配置块之间都严格保留1个空行,符合需求。
内容的提问来源于stack exchange,提问作者Andi
相关产品推荐
相关产品推荐

