---
title: "コマンドを登録するプラグインを作成する"
slug: "create-a-plugin-to-register-a-command"
abstract: "コマンドを登録するプラグインの作成方法、プロジェクトの作成方法、プラグインの作成、コマンドの作成、そして登録する方法も含めて。"
---
# コマンドを登録するプラグインを作成する

[プラグイン](https://doc.sitecore.com/ch/ja/developers/cloud-dev/plugins.html "Plugins")を使ってContent Hub CLIで使うコマンドを登録できます。この例では、echoというコマンドを作成し、それを登録するプラグインを作成します。echoコマンドは、引数として渡される文字列値を出力します。

このウォークスルーでは、以下の方法を説明します:

-   [プロジェクトを作成し](https://doc.sitecore.com/ch/ja/developers/cloud-dev/create-a-plugin-to-register-a-command.html#UUID-95841b04-1492-1ad6-f762-e3ba5b8a94ac_N1714069466870 "Create a project")ましょう。
-   [プラグインを作成します](https://doc.sitecore.com/ch/ja/developers/cloud-dev/create-a-plugin-to-register-a-command.html#UUID-95841b04-1492-1ad6-f762-e3ba5b8a94ac_N1714069440317 "Create the plugin")。
-   [コマンドを作成して登録](https://doc.sitecore.com/ch/ja/developers/cloud-dev/create-a-plugin-to-register-a-command.html#UUID-95841b04-1492-1ad6-f762-e3ba5b8a94ac_N1714069495645 "Create and register a command")します。

> !注以下の例は.NET CLIを使用していますが、お好みの統合開発環境(IDE)でも同様の結果が得られます。

## プロジェクトを作成してください

プロジェクトを作成するには:

1.  クラスライブラリを作成するには、以下のコマンドを実行します:
    
    mkdir Walkthrough
    
    cd Walkthrough
    
    dotnet new classlib --framework net6.0
    
2.  コアCLI機能への参照を追加するには、以下のコマンドを実行します:
    
    dotnet add package Sitecore.CH.Cli.Core --source https://nuget.sitecore.com/resources/v3/index.json
    

Sitecore.CH.Cli.Coreプラグインインフラストラクチャへのアクセス、ファイルシステムアクセス、設定管理、コンソール出力に関する便利なユーティリティを提供します。また、[Web Client SDK](https://doc.sitecore.com/ch/ja/developers/cloud-dev/web-client-sdk.html "Web Client SDK")への依存関係も追加します。

## プラグインを作成する

アプリケーションを起動する際、CLIはSitecore.CH.Cli.Core.Abstractions.Infrastructure.IPluginから継承する型を探すプラグインの検索パスをスキャンします。

プラグインを作成するには:

-   ファイル名をClass1.csPlugin.csに変更し、以下のコードを追加します
    
    using Sitecore.CH.Cli.Core.Abstractions.Infrastructure;
    
    namespace Walkthrough
    {
     public class WalkthroughPlugin : IPlugin
     {
     public void ConfigureServices(IServiceCollection services)
     {
     }
    
     public void RegisterCommands(ICommandRegistry registry)
     {
     }
     }
    }
    

このクラスには以下のメソッドが含まれています:

-   ConfigureServices - 依存注入のために共有サービスコレクションにカスタムサービスを登録できます。コマンドハンドラはこれらのサービスをコンストラクタで解決できます。詳細は依存 [注入 - .NET](https://learn.microsoft.com/en-us/dotnet/core/extensions/dependency-injection) を参照してください。
-   RegisterCommands - このプラグインの一部として提供される新しいコマンドを登録し、CLIを通じて利用可能にします。

## コマンドを作成して登録する

この例では、echoというコマンドを作成します。これを行うために使える方法は2つあります:

-   コマンド宣言とコマンドハンドリングを別々に使用してください。これはコマンドハンドラ実装のより良く、より簡単なユニットテストを可能にするため、好ましいアプローチです。
-   同じクラス内でオプションとコマンド処理を指定してください

コマンドを作成・登録するには:

ベース構造体に渡されるecho値は、後でコマンドが利用可能になる名前です。

引数は関数に渡されます。 IHostは、以前に登録されたサービスを解決するサービスプロバイダーへの参照を含みます。ベース構造体に渡されるecho値は、後でコマンドが利用可能になる名前です。

新しいコマンドは既存のグループに追加することも、それ専用に作成された新しいグループにも追加できます。標準として利用可能なコマンドグループはいくつかあります。以下のようなものがあります:

-   delivery 
-   serialization 
-   tenant

1.  EchoCommand.csというファイルを作成し、以下のコードに示されるように、別のコマンド宣言とコマンド処理を追加します。
    
    using System.CommandLine;
    using System.CommandLine.Invocation;
    using Sitecore.ContentHub.Cli.Shared.Abstractions.Commands;
    using Sitecore.ContentHub.Cli.Shared.Abstractions.Rendering;
    
    namespace Walkthrough;
    
    public class EchoCommand : BaseCommand <EchoCommandHandler>
    {
     public EchoCommand() : base("echo", "Echo a value")
     {
     // Options
     AddOption(new Option <string> (new {"--value", "-v"}, "Value to echo")
     {
     IsRequired = true
     });
     }
    }
    
    public class EchoCommandHandler : BaseCommandHandler
    {
     // Inject services from service provider
     public EchoCommandHandler(IOutputRenderer renderer) : base(renderer)
     {
     }
    
     public string Value { get; set; }
    
     // Command handling
     public override Task <int> InvokeDefaultAsync(InvocationContext context)
     {
     Renderer.WriteLine(Value);
    
     // Return exit code to indicate success or failure
     return Task.FromResult(0);
     }
    }
    
2.  または、引数とオプション用の別クラスを使うこともできます。以下のコードに示されています。
    
    using System;
    using System.CommandLine;
    using System.CommandLine.Invocation;
    using System.Threading.Tasks;
    using Microsoft.Extensions.Options;
    using Sitecore.CH.Cli.Core.Abstractions.Commands;
    using Sitecore.CH.Cli.Core.Abstractions.Rendering;
    using Stylelabs.M.Sdk.WebClient;
    
    namespace Walkthrough;
    
    public class EchoCommandParameters
    {
     public string Value { get; set; }
    }
    
    public class EchoCommand : BaseCommand<EchoCommandHandler>
    {
     public EchoCommand() : base("echo", "Echo a value")
     {
     // Options
     AddOption(new Option <string> (new {"--value", "-v"}, "Value to echo")
     {
     IsRequired = true
     });
     }
    }
    
    public class EchoCommandHandler : BaseCommandHandler
    {
     // Inject services from service provider
     public EchoCommandHandler(
     Lazy<IWebMClient> client,
     IOutputRenderer renderer,
     IOptions<EchoCommandParameters> parameters) : base(client, renderer)
     {
     Parameters = parameters.Value;
     }
    
     public EchoCommandParameters Parameters { get; }
    
     // Command handling
     public override Task<int> InvokeAsync(InvocationContext context)
     {
     Renderer.WriteLine(Parameters.Value);
    
     // Return exit code to indicate success or failure
     return Task.FromResult(0);
     }
    }
    
3.  以下のコードに示されているように、同じクラス内でオプションとコマンド処理を指定します。
    
    using System.CommandLine;
     using System.CommandLine.NamingConventionBinder;
     using Microsoft.Extensions.DependencyInjection;
     using Microsoft.Extensions.Hosting;
     using Sitecore.ContentHub.Cli.Shared.Abstractions.Commands;
     using Sitecore.ContentHub.Cli.Shared.Abstractions.Rendering;
    
     namespace Walkthrough
     {
     public class EchoCommand : BaseCommand
     {
     public EchoCommand() : base("echo", "Echo a value")
     {
     // Options
     AddOption(new Option <string> (new {"--value", "-v"}, "Value to echo")
     {
     IsRequired = true
     });
    
     Handler = CommandHandler.Create <string>, IHost ((value, host) =
     {
     host.Services.GetService <IOutputRenderer> ().WriteLine(value);
     });
     }
     }
    
4.  プラグインクラスとコマンドを接続するには、RegisterCommandsメソッドを更新するPlugin.csファイルを次のように修正してください:
    
    public class WalkthroughPlugin : IPlugin
    {
     ...
    
     public void RegisterCommands(ICommandRegistry registry)
     {
     // register the command to an existing command group
     registry.RegisterCommand("walkthrough", new EchoCommand());
    
     // register a new command group and its commands
     registry.RegisterCommandGroup(
     "walkthrough", new List <Command> { new EchoCommand() }, "Walkthrough plugin for demonstration purposes only");
     }
    
     ...
    }
    

コンパイルされて [検出可能なプラグイン検索パス](https://doc.sitecore.com/ch/ja/developers/cloud-dev/plugins.html "Plugins")にコピーされると、walkthroughコマンドグループとechoコマンドがCLIに含まれています。これで複数のコマンドを実行して、すべてが正しく設定されているか確認できます。

以下のコマンドはwalkthroughコマンドグループから始まり、新しいechoコマンドが追加されたことを検証します。

ch-cli walkthrough --help

echoコマンドは次のように実行できます:

ch-cli walkthrough echo --value Hello