Я пытаюсь сделать своего рода рекурсивный вызов в своем первом приложении Click 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
файл со всем кодом команды, соответственнопапка субкоманд / субмодулей (очевидно!)
Добавить оператор import
в свой файл __init__
Свяжите эту новую команду сродительский (проект / база данных, в данном случае)
Есть ли способ выполнить круговую / динамическую загрузку, чтобы избежать шагов № 2 и 3?
РЕДАКТИРОВАТЬ
После попытки Стивена Рауха он успешно включает все предоставленные файлы, но ни одна из команд не работает с -
только с функциейимя (например: 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
command / project / 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):
CLI-результат 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