コマンドの編成

シェルが多くの機能を提供し始めると、最終的には多くのコマンドが必要になり、ユーザーを混乱させる可能性があります。help と入力すると、アルファベット順に整理された困難なコマンドのリストが表示されます。これは、使用可能なコマンドを表示する最良の方法ではない場合があります。

この混乱の可能性を軽減するために、Spring Shell はコマンドをグループ化する機能を提供し、適切なデフォルトを設定します。関連するコマンドは同じグループ (たとえば、User Management Commands) にまとめられ、ヘルプ画面やその他の場所に一緒に表示されます。

@Command アノテーションで group 属性を指定することにより、コマンドをグループ化できます。

@Command(name = "example", group = "My Commands")
public String example() {
    return "Hello";
}

Command.Builder.group(String) メソッドを使用したプログラム登録モデルを使用する場合、グループはプログラムで指定することもできます。

@Bean
Command myCommand() {
    return Command.builder()
            .name("mycommand")
            .group("My Commands")
            .execute(context -> {
                System.out.println("This is my command!");
            });
}

通常、関連するコマンドは同じクラス内で定義され(コマンド間で状態を簡単に共有するため)、グループ名とプレフィックスはクラスレベルで指定されます。つまり、そのクラス内で定義されたすべてのコマンドは同じグループに属することになります。以下にその例を示します。

@CommandGroup(name = "Authentication Commands", prefix = "auth")
public class AuthenticationCommands {

	private boolean authenticated = false;

	@Command(name = "login", description = "Log in to the system")
	public void login() {
        // Authentication logic here
        authenticated = true;
        System.out.println("Logged in successfully!");
    }

    @Command(name = "logout", description = "Log out of the system")
    public void logout() {
        // Logout logic here
        authenticated = false;
        System.out.println("Logged out successfully!");
    }
}

この例では、login コマンドと logout コマンドはどちらも Authentication Commands グループに属しており、ヘルプ画面ではそのグループにまとめて表示されます。prefix 属性は、そのグループ内のすべてのコマンドに共通の接頭辞を指定しており、これを使用してコマンドを呼び出すことができます (例: auth login と auth logout)。

コマンドに group 属性が指定されている場合、クラスレベルで指定されたグループよりも優先されます。これにより、必要に応じて特定のコマンドに対してグループを上書きすることができます。