モデル検証
概要
NDCLI で、モデル検証を行うチュートリアルです。
コマンドラインエクステンションを開発して、NDCLI からそのコマンドを実行したときに、モデル検証の結果を標準出力に出力します。
- 以下の検証を実装します。
- モデルの整合チェック
 - フィーチャーの整合チェック
 - コンフィグレーションの整合チェック
 
 - コマンドを実行するには以下のオプションを指定します。
- "--projectPath" または "-p" : 検証するプロジェクトファイルのパスを指定します。このオプションは必須です。
 - "--model" または "-m" : モデルの整合チェックを実行する場合、true を指定します。
 - "--feature" または "-f" : フィーチャーの整合チェックを実行する場合、true を指定します。
 - "--configuration" または "-c" : コンフィグレーションの整合チェックを実行する場合、true を指定します。
コマンド例ndcli ModelValidate --projectPath "{プロジェクトファイルの格納パス}\先進運転システムソフト開発.nproj" --model true --feature true --configuration true 
 
全体の流れ
- コマンドラインエクステンションの準備
 - コマンド処理の実装
 - 実行環境への配置
 - コマンドラインエクステンションの実行
 
公開サンプル
- 本チュートリアルの結果として作成されるソースコード一式と、コマンド実行に必要なプロジェクトファイルを GitHub で公開しています。
外部リンク: モデル検証
 
ゴールイメージ
- NDCLI から モデル検証コマンドラインエクステンションを実行すると、次のようにメッセージが出力されます。
 
> ndcli ModelValidate --projectPath "{プロジェクトファイルの格納パス}\先進運転システムソフト開発.nproj" --model true --feature true --configuration true
NextDesign.ModelValidate
  Project       : {プロジェクトファイルの格納パス}\先進運転システムソフト開発.nproj
  Model         : Yes
  FeatureModels : Yes
  Configuration : Yes
Model(2)
  [Warning](多重度制約) : 複合フラグメント(相互作用)のオペランドが、多重度上限:1に違反しています。
  [Warning](プロダクトライン) : フィーチャ名が一意ではありません。名前を変更するか、ユニーク名を指定してください。
FeatureModels(1)
  [Warning](プロダクトライン) : 選択できる代替フィーチャが未定義です。
Configuration(1)
  [Error](プロダクトライン) : 「フィーチャ」は論理和フィーチャです。同階層にある論理和フィーチャの内、一つ以上を必ず選択してください。
コマンドラインエクステンションの準備
Visual Studio で コマンドラインエクステンションプロジェクトを新規作成して、コマンドラインエクステンションのデバッグ環境を準備する手順を、次の 順に説明します。
- Visual Studio での新しいプロジェクトの作成
 - コマンドラインエクステンション開発用 NuGet パッケージのインストール
 - クラスの新規作成
 
ここでは、Visual Studio 2022 (以下、VS)での操作手順を説明します。
VS での新しいプロジェクトの作成
Hello World の記載内容と同様です。そちらを参照してください。
| 項目 | 値 | 
|---|---|
| プロジェクト名 | ModelValidationCliExtensionSample | 
| 場所 | プロジェクト一式を格納する任意の親フォルダ | 
| ソリューション名 | ModelValidationCliExtensionSample | 
| フレームワーク | .NET Standard 2.0 | 
注記
- プロジェクト名は "CliExtension" の文字列を含んだ名前としてください。
 - プロジェクトの設定の詳細については次のページを参照ください。
 
パッケージのインストール
Hello World の記載内容と同様です。そちらを参照してください。
ビルドの設定
Hello World の記載内容と同様です。そちらを参照してください。
クラスの新規作成
Hello World の記載内容と同様です。そちらを参照してください。
- クラス名: 
ModelValidationCliExtensionSample 
コマンド処理の実装
コマンドラインエクステンションのエントリーポイントとモデル検証処理を実装するには、クラ スの新規作成で作成したクラスに、次の内容を実装します。
- 参照する API の名前空間の宣言
 - エントリーポイントとなる 
ExtensionBaseクラスを継承したクラス - モデル検証コマンドのオプション
 - モデル検証処理のコマンドハンドラ
 
実装例
ModelValidationCliExtensionSample.cs
using NextDesign.Cli.ExtensionFramework;
using DensoCreate.Cli.Framework;
using NextDesign.Core.Runtime;
using NextDesign.Core;
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace ModelValidate.CliExtension
{
    /// <summary>
    /// モデル検証を提供するエクステンションです
    /// </summary>
    public class ModelValidateExtension : ExtensionBase
    {
        /// <summary>
        /// コンストラクタ
        /// </summary>
        public ModelValidateExtension()
            : base("NextDesign.ModelValidate")
        {
        }
    }
    /// <summary>
    /// モデル検証コマンド
    /// </summary>
    public class ModelValidateCommand : Command
    {
        /// <summary>
        /// コンストラクタ
        /// </summary>
        public ModelValidateCommand()
            : base("ModelValidate", new string[] { "MV", "mv" }, "モデル検証を実行するコマンドです")
        {
            // コマンドのオプション定義
            // DensoCreate.Cli.Framework.CommandBase.AddOption<T>() メソッドを使用して定義します。
            // <T>: オプションの型
            // 第1引数: オプション名とエイリアス(例: "--projectPath", "-p")の配列
            // 第2引数: オプションの説明(ヘルプ表示用)
            // 第3引数: 必須オプションかどうか(true: 必須, false: 任意)
            // ExistingOnly(): FileInfo型の場合、指定されたファイルが存在するかをチェックします。
            AddOption<FileInfo>(new string[] { "--projectPath", "-p" }, "プロジェクトファイルのパス", true).ExistingOnly();
            AddOption<bool>(new string[] { "--doModelValidate", "--model", "-m" }, "モデルの整合チェックを実行します");
            AddOption<bool>(new string[] { "--doFeatureValidate", "--feature", "-f" }, "フィーチャーの整合チェックを実行します");
            AddOption<bool>(new string[] { "--doConfigurationValidate", "--configuration", "-c" }, "コンフィグレーションの整合チェックを実行します");
            
            // コマンドハンドラの登録
            RegisterHandler(nameof(OnExecute));
        }
        /// <summary>
        /// コマンドハンドラの実行
        /// </summary>
        /// <param name="projectPath">プロジェクトファイルのパス</param>
        /// <param name="doModelValidate"></param>
        /// <param name="doFeatureValidate"></param>
        /// <param name="doConfigurationValidate"></param>
        private void OnExecute(FileInfo projectPath, bool doModelValidate = false, bool doFeatureValidate = false, bool doConfigurationValidate = false)
        {
            Console.WriteLine($"{Extension.Name}");
            Console.WriteLine($"  Project       : {projectPath}");
            Console.WriteLine($"  Model         : {(doModelValidate ? "Yes" : "Skip")}");
            Console.WriteLine($"  Feature       : {(doFeatureValidate ? "Yes" : "Skip")}");
            Console.WriteLine($"  Configuration : {(doConfigurationValidate ? "Yes" : "Skip")}");
            Console.WriteLine("");
            // プロジェクトを開く
            // DensoCreate.Cli.Framework.ExtensionBase.GetService<T>() メソッドで
            // NextDesign.Core.Runtime.IProjectService サービスを取得し、
            // IProjectService.OpenProject() メソッドを使用してプロジェクトを開きます。
            var projectService = GetService<IProjectService>();
            var project = projectService.OpenProject(projectPath.FullName);
            if (doModelValidate)
            {
                project.Validate();
                var errors = project.GetAllErrorsWithChildren();
                OutputErrors("Model", errors);
            }
            if (doFeatureValidate)
            {
                var fms = project.ProductLineModel.FeatureModels;
                foreach (var fm in fms) fm.Validate();
                var errors = fms.SelectMany(fm => fm.GetAllErrorsWithChildren());
                OutputErrors("FeatureModels", errors);
            }
            if (doConfigurationValidate)
            {
                project.ProductLineModel.ConfigurationModel.Validate();
                var errors = project.ProductLineModel.ConfigurationModel.GetAllErrorsWithChildren();
                OutputErrors("Configuration", errors);
            }
        }
        private void OutputErrors(string name, IEnumerable<IError> errors)
        {
            Console.WriteLine($"{name}({errors.Count()})");
            foreach (var error in errors.Take(10))
            {
                Console.WriteLine($"  [{error.Type}]({error.Category}) : {error.Message}");
            }
            if (errors.Count() > 10)
            {
                Console.WriteLine("  :");
            }
            Console.WriteLine("");
        }
    }
}
実行環境への配置
ビルド結果として publish フォルダに出力されたファイル一式を、次のフォルダに格納します。
- Windows版:
"%HOMEPATH%\AppData\Local\DENSO CREATE\Next Design CLI\extensions\ModelValidation\" - Linux版:
"$HOME/.local/share/DENSO CREATE/Next Design CLI/extensions/ModelValidation/" 
コマンドラインエクステンションの実行
コマンドプロンプトから次のコマンドを実行すればモデル検証の結果が標準出力に出力されます。
- 全てのオプションを指定した場合のコマンド例
 
ndcli ModelValidate --projectPath "{プロジェクトファイルの格納パス}\先進運転システムソフト開発.nproj" --model --feature --configuration
- フィーチャー とコンフィグレーションの整合チェックを指定した場合のコマンド例
 
ndcli ModelValidate --projectPath "{プロジェクトファイルの格納パス}\先進運転システムソフト開発.nproj" --feature --configuration
注記
コマンドラインエクステンションの実行にはライセンス登録が必要です。詳細は次のページをご参照ください。