Power Apps component framework (PCF) のCLIツールを軸にしたCDSソリューションの開発サイクル

（ほぼ備忘録です。日本ではあまり需要はないでしょうね・・）

# ステップ１ ソリューションの最低限のプロジェクトを作成する

```
pac solution init --publisher-name yoshi --publisher-prefix yoshi
```

結果。CDSソリューションの最低限のファイルと、MSBuildでビルド出来るプロジェクトファイル(.csproj)が出力される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103139/33b3765f-eda8-3660-1c89-5ca14053297b.png)

# ステップ２ プロジェクトがソリューション（.zip）を出力するように設定を変更する

ステップ１で生成された.csprojファイルでは、肝心の部分がコメントアウトされています。

```yoshi_core.csproj
  <!-- Solution Packager overrides, un-comment to use: SolutionPackagerType (Managed, Unmanaged, Both)
  <PropertyGroup>
    <SolutionPackageType>Managed</SolutionPackageType>
  </PropertyGroup>
  -->
```

コメントを外し、なおかつソリューションのパッケージタイプを```Both```に設定します。```Both```で無く、```Managed```か```Unmanaged```も選択可能ですが、どちらにも対応できる方がいいです。違いの意味が分からない場合も```Both```で良いです。

```yoshi_core.csproj
  <PropertyGroup>
    <SolutionPackageType>Both</SolutionPackageType>
  </PropertyGroup>
```

# ステップ３ ソリューション（.zip）をビルドして生成する

以下の二つのコマンドを実行（前提：msbuildのパスが通っているコンソール。良く分からない場合はDeveloper Command Prompt for VS2019 などのコンソールでOK）

```
> msbuild /t:restore
> msbuild
```

結果。```bin``` フォルダー下に２つのファイル.zipファイルが生成されました。

- ```yoshi_core_managed.zip``` マネージド（インポート先の環境で変更不可）
- ```yoshi_core.zip``` アンマネージド（インポート先の環境で変更可能）

この.zipファイルのいずれかを直接D365オーガニゼーションにインポートできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103139/8ed8f79e-31fe-3c15-30b4-32d1af7dab43.png)

# ステップ４　アンマネージドのソリューションをインポートする

この記事ではソリューションを変更する（＝環境をカスタマイズする）手順を解説するのでアンマネージドのソリューション（unmanaged solution)をインポートします。アンマネージドのソリューションしか変更を加えられません。


インポート後の様子。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103139/4e65f950-a91c-c848-b843-3bf502a62154.png)

# ステップ５　ソリューションをカスタマイズする（開発する）

ソリューションをビジネスに合わせてカスタマイズします。

> カスタマイズ（拡張性）は極めた高く、それだけで1冊の本になってしまいます。

簡単な例としてWebResourceとしてイメージファイルを加えます（例えばこのやり方で会社のロゴをアップロードして、CRMの任意の位置に会社ロゴを表示したりできます）

カスタマイズするには開発用サイトから行います。

https://make.preview.powerapps.com/home

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103139/1b154ea3-a968-8bf0-fba7-cad624e0997c.png)

```Solutions``` メニューを選び、自分のソリューションを選択すると、そこからカスタマイゼーションの作業が出来ます。下図のようにして、新規WebResourceを加える手続きを開始します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103139/51df01eb-7181-b025-ad65-9b2a7af3c7a4.png)

フォームに必要な項目を入力します。ローカルのマシーンからアップロードするファイルを選び、他には名前などのメタ情報を指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103139/a029bdc2-e9d4-5a54-1ee0-a37cb1f87c4d.png)

一旦、保存します。するとこのWebResourceのURLが生成されます。後で確認のためにこのURLにアクセスします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103139/5be8f528-41a7-d2cc-58f2-c30099f5150f.png)

# ステップ６　カスタマイゼーションを確認する

今回はWebResourceとしてPNGイメージファイルを加えました。前述のURLを使ってブラウザにイメージを表示させてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103139/04f16d9d-0db2-165c-fd5e-ba46dd8e3786.png)

上手く行きました。このイメージファイルはCDSに保存されていることが確認できます。（この要領でHTMLやJSなどを加えれば、完全に独自のUIも加えることが出来ます。ただこれは「最終手段」で、他にフォーム等のカスタマイズのやり方があるのでそちらを先に確認しましょう）

#　ステップ７　カスタマイズしたソリューションをエクスポートする（バージョン管理のため）

開発用サイトから```Export```を選びます。マネージドとアンマネージド、両方のソリューションを別々にダウンロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103139/f70970ef-8aeb-e4d9-4282-81577d971a9d.png)

（レガシーなやり方。新しい方で上手くいかなかったらこちらで）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103139/c0ac7c21-d8ac-ac95-46c7-c685a0068351.png)

ダウンロードした.zipファイル、２つとも、ソリューションプロジェクトのルートにコピーします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103139/9e2c784b-b2a6-6ceb-8ac9-4022519fa5b4.png)

この.zipファイルを入力として取る```SolutionPackager.exe```というツールを次に実行します。

# ステップ８　エクスポートしたソリューションの内容を抽出・展開する

この```SolutionPackager.exe```ツールはソリューション（.zip）ファイルからカスタマイズした内容を取り出し、カスタマイズの項目ごとに、管理しやすいように展開してくれます。例えば、今回のカスタマイズは新規WebResourceのみでしたが、これ以外にカスタムエンティティやサイトマップなどのカスタマイズを含む場合は、それに対応したフォルダーを作成してくれます。この状態でGitなどのバージョン管理レポジトリに保存するのが望ましいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103139/18fe9ba6-2f33-36da-83b8-3d7a316f349f.png)

```
$solutionPackagerExe = $env:UserProfile + "\.nuget\packages\microsoft.crmsdk.coretools\9.1.0.39\content\bin\coretools\SolutionPackager.exe"
$solutionPackagerArgs = "/n /action:Extract /zipfile:yoshi_core_1_3.zip /folder:src /packageType:Both"
$solutionPackagerArgs = $solutionPackagerArgs.Split(" ")
& $solutionPackagerExe $solutionPackagerArgs
```

＊注意：バージョンが```1_3```になっていますが、当然これはバージョンを更新するたびに変更してください（もしくはダウンロードした.zipファイルからバージョンの部分を取り除く）

# ステップ９　カスタマイズ（変更）をバージョン管理する

ソリューションのカスタマイゼーションを抽出・展開した結果、以下の変更が確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103139/26862bdb-6a63-8a81-25cd-6d88e0cfddfe.png)

* ```Solutions.xml```が更新されています。あたらに```<RootComponents>```として新規WebResourceが確認できます
* ```WebResources```というサブディレクトリが作成されています。その下にはPNGイメージファイルとそれに関するメタ情報ファイルが追加されています。

この状態でGitレポジトリ等にコミット・プッシュします。

# ステップ１０　バージョン管理されたソースからビルドしてデプロイする

このステップは無駄のように見えますが必要です。カスタマイズを行ったCDSオーガニゼーションからエクスポートしたマネージドソリューションがすでにあるのでそれを使えばよい、と考えてしまいますが、その成果物のソースはカスタマイズを行ったCDSオーガニゼーションです。もしそのオーガニゼーションが無くなってしまうと、二度とこの成果物をエクスポートできなくなってしまいます。

幸い、このステップは「ステップ３　ソリューション（.zip）をビルドして生成する」をそっくりそのまま繰り返すだけです。

以下、最新のカスタマイゼーションを含んだソリューションが生成されました。このソリューションをテスト用CDSオーガニゼーションにインポートして動作確認し、最終的には本番のCDSオーガニゼーションにデプロイして一連の開発サイクルのゴールに到達します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103139/847de82f-8483-8669-07f3-0c3c127b6fff.png)