1. ホーム
  2. python

[解決済み] クリックコマンドを複数のファイルに分割するにはどうすればよいですか?

2022-10-19 05:06:22

質問

ある大きなクリックアプリケーションを開発したのですが、さまざまなコマンドやサブコマンドをナビゲートするのが面倒になってきました。コマンドを別のファイルに整理するにはどうしたらよいでしょうか。コマンドとそのサブコマンドを別々のクラスに整理することは可能でしょうか?

どのように分けたいかの例です。

init

import click

@click.group()
@click.version_option()
def cli():
    pass #Entry Point

コマンド_cloudflare.py

@cli.group()
@click.pass_context
def cloudflare(ctx):
    pass

@cloudflare.group('zone')
def cloudflare_zone():
    pass

@cloudflare_zone.command('add')
@click.option('--jumpstart', '-j', default=True)
@click.option('--organization', '-o', default='')
@click.argument('url')
@click.pass_obj
@__cf_error_handler
def cloudflare_zone_add(ctx, url, jumpstart, organization):
    pass

@cloudflare.group('record')
def cloudflare_record():
    pass

@cloudflare_record.command('add')
@click.option('--ttl', '-t')
@click.argument('domain')
@click.argument('name')
@click.argument('type')
@click.argument('content')
@click.pass_obj
@__cf_error_handler
def cloudflare_record_add(ctx, domain, name, type, content, ttl):
    pass

@cloudflare_record.command('edit')
@click.option('--ttl', '-t')
@click.argument('domain')
@click.argument('name')
@click.argument('type')
@click.argument('content')
@click.pass_obj
@__cf_error_handler
def cloudflare_record_edit(ctx, domain):
    pass

コマンド_uptimerobot.py

@cli.group()
@click.pass_context
def uptimerobot(ctx):
    pass

@uptimerobot.command('add')
@click.option('--alert', '-a', default=True)
@click.argument('name')
@click.argument('url')
@click.pass_obj
def uptimerobot_add(ctx, name, url, alert):
    pass

@uptimerobot.command('delete')
@click.argument('names', nargs=-1, required=True)
@click.pass_obj
def uptimerobot_delete(ctx, names):
    pass

どのように解決するのですか?

を使うことの欠点は CommandCollection を使うことの欠点は、コマンドをマージしてしまうことと、コマンドグループに対してのみ動作することです。より良い代替案は add_command を使うことです。

次のようなツリーを持つプロジェクトがあります。

cli/
├── __init__.py
├── cli.py
├── group1
│   ├── __init__.py
│   ├── commands.py
└── group2
    ├── __init__.py
    └── commands.py

各サブコマンドは独自のモジュールを持っています。これにより、より多くのヘルパークラスやファイルを含む複雑な実装でも、驚くほど簡単に管理できるようになります。各モジュールでは commands.py ファイルには @click のアノテーションが含まれています。例 group2/commands.py :

import click


@click.command()
def version():
    """Display the current version."""
    click.echo(_read_version())

必要であれば、モジュール内にもっと多くのクラスを簡単に作ることができますし import を作成し、ここでそれらを使用することで、あなたのCLIにPythonのクラスとモジュールのフルパワーを与えることができます。

私の cli.py はCLI全体のエントリポイントです。

import click

from .group1 import commands as group1
from .group2 import commands as group2

@click.group()
def entry_point():
    pass

entry_point.add_command(group1.command_group)
entry_point.add_command(group2.version)

このセットアップを使用すると、懸念事項によってコマンドを分離することが非常に簡単になり、また、それらの周りに必要な追加の機能を構築することができます。これまでのところ、これは私にとても役立っています...

参照 http://click.pocoo.org/6/quickstart/#nesting-commands