Я пытаюсь сделать своего рода рекурсивный вызов в своем первом кликвом приложении CLI. Главное - иметь подкоманды, связанные с первым, и поэтому я пытался разделить их все в разных файлах/модулях, чтобы улучшить его ремонтопригодность.
У меня есть текущий directory
:
root
|-commands
|-project
|---__init__
|---command1
|---command2
|-database
|---__init__
|---command1
|---command2
Это мой главный файл:
import click
from commands.project import project
from commands.database import database
@click.group(help="Main command")
def main():
pass
main.add_command(project)
main.add_command(database)
Мои проекты __init__
файл:
from commands.project.command1 import *
from commands.project.command2 import *
import click
@click.group(help="Projects")
def project():
pass
project.add_command(command1)
project.add_command(command2)
Мой файл commands.project.command1
:
import click
@click.command()
def command1():
"""
Execute all the steps required to update the project.
"""
pass
Главное здесь, что каждый раз, когда я хочу добавить новую подкоманду, мне нужно:
-
Добавьте файл
.py
со всем кодом в команду, в соответствующую папку подкоманды/подмодуля (очевидно!) -
Добавьте в него
__init__
import
__init__
file -
Отнесите эту новую команду к родительскому (проект/база данных, в этом случае)
Есть ли способ сделать круговую/динамическую нагрузку, чтобы избежать шагов № 2 и 3?
РЕДАКТИРОВАТЬ
После попытки Stephen Rauch он успешно включает все предоставленные файлы, но ни одна из команд не работает -
только с именем функции (например: → update-project
update_project
).
root
|-commands
|-project
|---update
|---install_project
|-database
|---command_one
|---command_two
main.py
# main command ----------------------------------------------------------- ###
@click.group(help="CLI tool!", context_settings=dict(max_content_width=120))
def main():
pass
# PROJECT command group -------------------------------------------------------- ###
@main.group(cls=group_from_folder("commands/project"),
short_help="Project installation and upgrade utils.",
help="Project installation and upgrade.")
def project():
pass
Команды/проект/install_project.py
import click
@click.command(name="install-project",
help="This options allows you to easily install project",
short_help="Install a brand new project")
@click.pass_context
def install_project(ctx):
main project --help
CLI result main project --help
(обратите внимание на команду install_project
а не install-project
)
Usage: main project [OPTIONS] COMMAND [ARGS]...
Project installation and upgrade.
Options:
--help Show this message and exit.
Commands:
install_project Install a brand new project one