#python #cookiecutter
#питон #разделочная машина для приготовления пищи
Вопрос:
Я создаю шаблон cookiecutter и хотел бы добавить папку (и файлы, которые она содержит), только если переменная имеет заданное значение. Например, cookiecutter.json:
{
"project_slug":"project_folder"
"i_want_this_folder":['y','n']
}
и моя структура шаблона выглядит следующим образом:
template
└── {{ cookiecutter.project_slug }}
├── config.ini
├── data
│ └── data.csv
├── {% if cookiecutter.i_want_this_folder == 'y' %}my_folder{% endif %}
└── some_files
Однако при запуске cookiecutter template
и выборе ‘n’ я получаю сообщение об ошибке
Error: "~/project_folder" directory already exists
Правильный ли мой синтаксис для имени папки?
Ответ №1:
Я столкнулся с той же проблемой, имея возможность добавлять или не добавлять папки с разным содержимым (все папки могут существовать одновременно). Структура проекта следующая:
├── {{cookiecutter.project_slug}}
│ │
│ ├── folder_1_to_add_or_no
│ │ ├── file1.py
│ │ ├── file2.py
│ │ └── file3.txt
│ │
│ ├── folder_2_to_add_or_no
│ │ ├── image.png
│ │ ├── data.csv
│ │ └── file.txt
│ │
│ └── folder_3_to_add_or_no
│ ├── file1.py
│ └── some_dir
│
├── hooks
│ └── post_gen_project.py
│
└── cookiecutter.json
где cookiecutter.json
содержит следующее
{
"project_owner": "some-name",
"project_slug": "some-project",
"add_folder_one": ["yes", "no"],
"add_folder_two": ["yes", "no"],
"add_folder_three": ["yes", "no"],
}
поскольку каждый каталог folder_X_to_add_or_no
содержит разные файлы, хитрость заключается в том, чтобы удалить те папки, ответ на которые «нет», вы можете сделать это с помощью перехвата. Внутри post_gen_project.py
файла
# post_gen_project.py
import os
import shutil
from pathlib import Path
# Current path
path = Path(os.getcwd())
# Source path
parent_path = path.parent.absolute()
def remove(filepath):
if os.path.isfile(filepath):
os.remove(filepath)
elif os.path.isdir(filepath):
shutil.rmtree(filepath)
folders_to_add = [
'folder_one',
'folder_two',
'folder_three'
]
for folder in folders_to_add:
# Check if user wants the folder
cookiecutter_var = '{{cookiecutter.' f'{folder}' '}}'
add_folder = cookiecutter_var == 'yes'
# User does not want folder so remove it
if not add_folder:
folder_path = os.path.join(
parent_path,
'{{cookiecutter.project_slug}}',
'folder'
)
remove(folder_path)
Теперь папки, которые пользователь решил не добавлять, будут удалены.
Select add_folder_one:
1 - yes
2 - no
Choose from 1, 2 [1]:
Ссылки
Этот ответ основан на ответе Брианкапелло по этому вопросу github