В шаблоне cookiecutter добавляйте папку только в том случае, если переменная выбора имеет заданное значение

#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