Package Deployer ツールで使用するパッケージを作成する

Package Deployer を使用すると、管理者は Microsoft Dataverse のインスタンスにパッケージを展開できます。 Package Deployer パッケージ は、次の一部またはすべてで構成されます:

  • 1 つ以上のDataverseソリューション ファイル。
  • フラット ファイルまたは構成移行ツールからエクスポートされた構成データ ファイル。 ツールの詳細については、構成移行ツールでインスタンスと組織間を移動する構成データを移動 を参照してください。
  • パッケージの前、間、または後に実行できるカスタム コードは、Dataverse インスタンスに展開されます。
  • 展開プロセスの最初か最後に表示可能なパッケージに固有の HTML コンテンツ。 このコンテンツは、パッケージに展開されるソリューションとファイルの説明を提供する場合に役立ちます。

Note

プラグイン パッケージ と呼ばれる別のパッケージ タイプがあります。 この種のパッケージは、プラグイン依存アセンブリ用であり、Package Deployer パッケージとは関係ありません。

前提条件

  • パッケージに含めるすべてのソリューションとその他のファイルがそろっていることを確認します。
  • Visual Studio 2019 (またはそれ以降)、または Visual Studio Code です。

プロセスの概要

Package Deployer パッケージを作成するには、次の手順に従います。

  • Visual Studio または MSBuild プロジェクトを作成する
  • ソリューションとその他のファイルをプロジェクトに追加する
  • 指定された HTML ファイルを更新する (オプション)
  • パッケージの構成値を指定する
  • パッケージ用のカスタム コードを定義する
  • パッケージをビルドおよび展開する

これらの手順については、この記事で詳しく説明います。

パッケージ プロジェクトを作成する

最初の手順は、パッケージの Visual Studio または MSBuild プロジェクトを作成することです。 これを行うには、使用可能な 2 つのツール拡張機能のいずれかを開発用コンピューターにインストールする必要があります。 Visual Studio Code を使用する場合、Microsoft Power Platform CLI をインストールします。 それ以外の場合、Visual Studio 2019 以降なら、Visual Studio 向け Power Platform Tools をインストールします。

以下の適切なタブを選択し、目的のツール拡張機能を使用してプロジェクトを作成する方法を確認してください。 どちらのツールも、プロジェクトを同様の形式で出力します。

pac package init コマンドを実行して、初期パッケージを作成します。 詳細情報: pac package

pac package init help
pac package init --outputDirectory DeploymentPackage

結果の CLI 出力には、以下に示すフォルダーとファイルが含まれます。 ここでは例として "DeploymentPackage" フォルダー名を使用しました。

C:.
└───DeploymentPackage
    │   DeploymentPackage.csproj
    │   PackageImportExtension.cs
    │
    └───PkgAssets
            ImportConfig.xml
            manifest.ppkg.json

作成したプロジェクトで、PkgAssets フォルダー内の ImportConfig.xml 構成ファイルと PackageImportExtension.cs ファイルを見つけます。 この記事で後述するように、これらのファイルを変更します。

パッケージ ファイルを追加する

パッケージ プロジェクトを作成したら、そのプロジェクトにソリューションやその他のファイルを追加することができます。

CLI を使用する場合、追加 サブコマンドのいずれかを使用して、外部パッケージ、ソリューション、参照をパッケージ プロジェクトに追加できます。 pac package help を入力してサブコマンドのリストを表示します。 パッケージにソリューションを追加しましょう。

> pac package add-solution help

Commands:
Usage: pac package add-solution --path [--import-order] [--skip-validation] [--publish-workflows-activate-plugins] [--overwrite-unmanaged-customizations] [--import-mode] [--missing-dependency-behavior] [--dependency-overrides]

> cd .\DeploymentPackage\
> pac package add-solution --path ..\TestSolution_1_0_0_1_managed.zip

The item was added successfully.

パッケージを構成する

プロジェクトにある ImportConfig.xml ファイルにパッケージに関する情報を追加することにより、パッケージ構成を定義します。 使用できる有効な要素と属性の例と説明については、ImportConfig リファレンスをご覧ください。

カスタム コードを追加する

パッケージを環境にインポートする前、インポート中、インポート後に実行するカスタム コードを追加できます。 これを行うには、次の手順に従います。

  1. プロジェクトのルート フォルダーにある PackageTemplate.cs (または PackageImportExtension.cs) ファイルを編集します。

  2. C# ファイルで、次のことができます:

    1. パッケージがInitializeCustomExtensionのオーバーライド メソッドの定義で初期化されるときに実行するカスタム コードを入力します。

      パッケージの実行中、このメソッドは、ユーザーがランタイム パラメータを使用できるようにするのに使用することができます。 開発者として、ユーザーの入力によって処理するコードが存在する限り、RuntimeSettings プロパティを使用することで、任意のランタイム パラメーターのサポートをパッケージに追加することができます。

      たとえば、次のサンプル コードは、可能性のある 2 つの値 true または false を持つパッケージに対して SkipChecks と呼ばれるランタイム パラメーターを有効にします。 サンプル コードは、ユーザーが Package Deployerの実行中 (コマンドラインまたはPowerShellのいずれかを使用して) に、いずれかのランタイム パラメーターを指定しているかどうかをチェックして、次にそれに従って情報を処理します。 パッケージの実行中にユーザーがランタイム パラメーターを指定しない場合、RuntimeSettings プロパティの値は null になります。

      public override void InitializeCustomExtension()  
      {  
      // Do nothing.  
      
      // Validate the state of the runtime settings object.  
      if (RuntimeSettings != null)  
      {  
      PackageLog.Log(string.Format("Runtime Settings populated.  Count = {0}", RuntimeSettings.Count));  
      foreach (var setting in RuntimeSettings)  
      {  
      PackageLog.Log(string.Format("Key={0} | Value={1}", setting.Key, setting.Value.ToString()));  
      }  
      
      // Check to see if skip checks is present.  
      if ( RuntimeSettings.ContainsKey("SkipChecks") )  
      {  
      bool bSkipChecks = false;  
      if (bool.TryParse((string)RuntimeSettings["SkipChecks"], out bSkipChecks))  
      OverrideDataImportSafetyChecks = bSkipChecks;  
      }  
      }  
      else  
      PackageLog.Log("Runtime Settings not populated");  
      }  
      

      このコードにより、管理者はコマンド ラインまたは Import-CrmPackage コマンドレットを使用して、パッケージをインポートするために、Package Deployer ツールの実行中にセーフティ チェックを回避するかどうかを指定することができます。 詳細情報: Package Deployer および Windows PowerShell を使用してパッケージをデプロイする

    2. ソリューションがPreSolutionImportの上書きメソッドの定義にインポートされる前に実行するカスタム コードを入力して、ターゲットDataverseインスタンスの指定されたソリューションの更新中に、カスタマイズを維持または上書きするかどうか、プラグインとワークフローを自動的にアクティブ化するかどうかを指定します。

    3. RunSolutionUpgradeMigrationStep の上書きメソッド定義を使用して、データ転送を実行または 2つのバージョンのソリューション間でアップグレードします。このメソッドは、ユーザーがインポートするソリューションが既に対象の Dataverse インスタンスに存在する場合にのみ呼び出されます。

      この関数は、次のパラメーターが必要です。

      パラメーター 内容
      solutionName ソリューションの名前
      oldVersion 古いソリューションのバージョン番号。
      newVersion 新しいソリューションのバージョン番号。
      oldSolutionId 古いソリューションのGUID。
      newSolutionId 新しいソリューションのGUID。
    4. ソリューションのインポートがBeforeImportStageメソッドの上書き定義で完了する前に実行するカスタム コードを入力します。 ソリューションのインポートが完了する前に、ImportConfig.xml ファイルで指定されたソリューションのサンプル データおよびいくつかのフラット ファイルがインポートされます。

    5. OverrideConfigurationDataFileLanguage の上書きメソッドの定義を使用して構成データのインポートに対して現在選択されている言語を上書きします。 指定した言語の指定されたロケール ID (LCID) がパッケージの利用可能な言語の一覧にない場合、既定のデータ ファイルがインポートされます。

      ImportConfig.xml ファイルの <cmtdatafiles> ノードの構成データに対して利用可能な言語を指定します。 既定の構成データ インポート ファイルは crmmigdataimportfile ファイルのImportConfig.xml 属性で指定されます 。

      データ チェック (OverrideDataImportSafetyChecks = true) は、対象の Dataverse インスタンスにデータ何も含まれていないことを確認する場合に、ここで有効になります。

    6. インポートが AfterPrimaryImport>メソッドの上書き定義で完了した後に実行するカスタム コードを入力します。 ソリューションのインポートが開始する前に、これまでにインポートされなかった残りのフラット ファイルがインポートされるようになりました。

    7. 目的のパッケージ名に、パッケージ フォルダーの既定の名前を変更します。 そのようにするには、ソリューション Explorer ペインの PkgFolder (または PkgAssets) フォルダー名を変更してから、GetImportPackageDataFolderName プロパティの下の戻り値を編集します。

      public override string GetImportPackageDataFolderName  
      {  
      get  
      {  
      // WARNING this value directly correlates to the folder name in the Solution Explorer where the ImportConfig.xml and sub content is located.  
      // Changing this name requires that you also change the correlating name in the Solution Explorer  
      return "PkgFolder";  
      }  
      }  
      
    8. GetNameOfImportプロパティで戻り値を編集することによって、パッケージの名前を変更します。

      public override string GetNameOfImport(bool plural)  
      {  
      return "Package Short Name";  
      }  
      

      この戻り値は、Dynamics 365 Package Deployer ウィザードのパッケージの選択ページに表示されるパッケージ名です。

    9. GetImportPackageDescriptionTextプロパティで戻り値を編集することによって、パッケージの説明を変更します。

      
      public override string GetImportPackageDescriptionText  
      {  
      get { return "Package Description"; }  
      }  
      
      

      この戻り値は、Package Deployer ウィザードのパッケージの選択ページで、パッケージの名前の横に表示されるパッケージの説明です。

    10. GetLongNameOfImportプロパティで戻り値を編集することによって、パッケージの詳しい名前を変更します。

      
      public override string GetLongNameOfImport  
      {  
      get { return "Package Long Name"; }  
      }  
      
      

      インストールするパッケージを選択した後、次のページで、パッケージの長い名前が表示されます。

  3. また、次の関数と変数はパッケージに使用できます。

    名前 種類 説明
    CreateProgressItem(String) 関数 ユーザー インターフェイス (UI) で新しい処理中項目を作成するときに使用します。
    RaiseUpdateEvent(String, ProgressPanelItemStatus) 関数 CreateProgressItem(String).の呼び出しによって作成された処理中の更新に使用します。

    ProgressPanelItemStatus は次の値の列挙体です:

    作業中 = 0
    完了 = 1
    失敗 = 2
    警告 = 3
    不明 = 4
    RaiseFailEvent(String, Exception) 関数 現在の状態のインポートが失敗する場合に例外メッセージと共に使用します。
    IsRoleAssoicatedWithTeam(Guid, Guid) 関数 ロールが特定のチームに関連付けられているかどうかを判断する場合に使用します。
    IsWorkflowActive(Guid) 関数 指定したワークフローがアクティブになっているかどうかを判断する場合に使用します。
    PackageLog クラスのポインター パッケージの初期化されたログ インターフェイスへのポインター。 このインターフェイスは、パッケージのログ ファイルにメッセージと例外をログするのに、パッケージによって使用されます。
    RootControlDispatcher Property パッケージの展開中に、コントロールが独自の UI をレンダリングするのを許可するのに使用されるディスパッチャー インターフェイス。 UI 要素やコマンドをラップするのにも、このインターフェイスを使用します。 値を設定しているかどうかわからないので、それを使用する前に null 値のこの変数を確認することは重要です。
    CrmSvc Property パッケージがパッケージ内から Dynamics 365 に対応できるようにする CrmServiceClient クラスに対するポインター。 このポインターを使用して、上書きされたメソッドで SDK メソッドと他のアクションを実行します。
    DataImportBypass Property Dataverse サンプル データ、フラット ファイル データ、および構成移行ツールからエクスポートされたデータのインポートなど、Dynamics 365 Package Deployer がすべてのデータ インポート操作をスキップするかどうかを指定します。 true または false を指定します。 既定はfalseです。
    OverrideDataImportSafetyChecks Property Dynamics 365 Package Deployer の安全性チェックの一部をバイパスして、インポートのパフォーマンスを向上させるかどうかを指定します。 trueまたはfalseを指定します。 既定はfalseです。

    対象の true インスタンスにデータが含まれていない場合のみ、このプロパティを Dataverse に設定する必要があります。
  4. プロジェクトを保存します。 次の手順は、パッケージをビルドすることです。

ビルドと展開

次のセクションでは、パッケージを構築してデプロイする方法について説明します。

ビルド

パッケージのビルドについては、使用しているツールに応じて以下で説明します。

CLI で作成したパッケージをビルドするには、.csproj ファイルを Visual Studio にロードできますが、代わりに dotnet コマンドと MSBuild を使用します。 以下の例では、作業ディレクトリに *.csproj ファイルが含まれていることを前提としています。

> dotnet publish

DeploymentPackage -> C:\Users\peter\Downloads\DeploymentPackage\bin\Debug\DeploymentPackage.1.0.0.pdpkg.zip

オプションで、ビルド パッケージの詳細を確認できます。

> pac package show --package .\bin\Debug\DeploymentPackage.1.0.0.pdpkg.zip

パッケージは、<Project>\Bin\Debug フォルダーの下にある以下のファイルで構成されています。

  • <PackageName> フォルダー: フォルダー名は、このセクション カスタム コードを追加する のステップ 2.g でパッケージ フォルダー名に対して変更したものと同じです。 このフォルダーには、すべてのソリューション、構成データ、フラット ファイル、およびパッケージ内容が含まれています。

Note

pdpublish フォルダーを含む .NET フォルダー (例: net472) が表示される場合があります。 DLL およびその他のプロジェクト ファイルは、その pdpublish フォルダーにあります。

  • <PackageName>.dll: このアセンブリには、パッケージのカスタムコードが含まれています。 既定では、アセンブリの名前はプロジェクト名と同じになります。

デプロイ

パッケージの作成後、Package Deployer ツール、Windows PowerShell、または CLI コマンドを使用して、Dataverse インスタンスに展開することができます。

ベスト プラクティス

Package Deployer パッケージを使用する際に従うべきいくつかのベスト プラクティスのヒントを以下に示します。

パッケージの作成

パッケージを作成するときに、開発者は次のことを行う必要があります:

  • パッケージ アセンブリが署名されていることを確認します

パッケージの展開

パッケージを展開するときに、Dataverse 管理者は次のことを行う必要があります:

  • 署名付きパッケージ アセンブリを使用 して、アセンブリをそのソースまで追跡できるようにします。
  • 実稼働インスタンスにそれを実行する前に、事前運用インスタンス (可能であれば、実稼働インスタンスのミラー イメージ) にパッケージをテストします
  • パッケージを展開する前に、運用環境インスタンスをバックアップ します。

関連項目

ソリューション パッケージャー ツール