SolutionPackager は、Microsoft Dataverse圧縮されたソリューション ファイルを複数の XML ファイルやその他のファイルに元に戻せるツールです。 そうすると、ソース管理システムを使用することによりこれらのファイルを簡単に管理できます。 次のセクションでは、ツールの実行方法と、マネージド ソリューションとアンマネージド ソリューションでツールを使用する方法について説明します。
Important
SolutionPackager ツールは、ソリューションを解凍およびパックするための推奨方法ではなくなりました。 SolutionPackager ツールの機能は、 Power Platform CLI に組み込まれています。
pac solution コマンドには、SolutionPackager ツールの基になる同じ機能を組み込んだunpack、pack、clone、syncなど、多くの動詞があります。
SolutionPackager ツールの場所
SolutionPackager ツールは、 Microsoft.CrmSdk.CoreTools NuGet パッケージの一部として配布されます。 プログラムをインストールするには、この手順に従います。
- NuGet パッケージをダウンロードします。
- パッケージのファイル名拡張子を .nupkg から .zip に変更します。
- 圧縮 (zip) ファイルのコンテンツを解凍します。
<抽出されたフォルダー名>/contents/bin/coretools フォルダーで SolutionPackager.exe 実行可能ファイルを見つけます。 coretools フォルダーからプログラムを実行するか、そのフォルダーを PATH に追加します。
SolutionPackager コマンドライン引数
SolutionPackager は、次の表に示すパラメーターを使用して呼び出すことができるコマンド ライン ツールです。
| 引数 | 説明 |
|---|---|
| /アクション: {抽出|パック} | 必須。 実行すべきアクション。 アクションは、ソリューション .zip ファイルをフォルダーに抽出するか、フォルダーを .zip ファイルにパックするかのいずれかです。 |
| /zipfile: <ファイルパス> | 必須。 ソリューション .zip ファイルのパスと名前。 展開時に、ファイルが存在して読み取り可能である必要があります。 パックすると、ファイルが置き換えられます。 |
| /folder: <フォルダのパス> | 必須。 フォルダーのパス。 抽出すると、このフォルダが作成され、コンポーネントファイルが入力されます。 パックする場合、このフォルダーは既に存在し、以前に抽出されたコンポーネント ファイルが含まれている必要があります。 |
| /パッケージタイプ: {アンマネージド|管理|両方} | このフィールドは省略可能です。 処理するパッケージのタイプ。 デフォルト値は [アンマネージド] です。 この引数は、パッケージの種類を .zip ファイルまたはコンポーネントファイル内から読み取ることができるため、ほとんどの場合省略できます。 抽出が行われ、かつ両方のマネージドおよびアンマネージド ソリューション .zip ファイルが指定されている場合、これらのファイルは必ず存在し、1 つのフォルダーにまとめて処理されます。 圧縮と Both が指定されているときは、管理ソリューションおよびアンマネージド ソリューションの .zip ファイルが 1 つのフォルダーから生成されます。 詳細については、この記事の後半にある、管理ソリューションおよびアンマネージド ソリューションを使用した作業についてのセクションを参照してください。 |
| /allowWrite:{はい|いいえ} | このフィールドは省略可能です。 既定値は Yes です。 この引数は、抽出中のみ使用されます。 /allowWrite:No を指定すると、ツールはすべての操作を実行しますが、ファイルの書き込みや削除はできなくなります。 抽出操作は、既存のファイルを上書きしたり削除したりすることなく、安全に評価できます。 |
| /allowDelete:{はい|いいえ|プロンプト} | このフィールドは省略可能です。 デフォルト値は [プロンプト] です。 この引数は、抽出中のみ使用されます。 /allowDelete:Yes が指定されると、予定されていない /folder パラメータによって指定されるフォルダーに存在するすべてのファイルが自動的に削除されます。 /allowDelete:No が指定されると、削除は実行されません。 /allowDelete:Prompt を指定すると、ユーザーはコンソールを通じてすべての削除操作を許可または拒否するように求められます。 /allowWrite:No が指定されていると、/allowDelete:Yes が指定されていても、削除が起きないことに注意してください。 |
| /clobber | このフィールドは省略可能です。 この引数は、抽出中のみ使用されます。 /clobber を指定すると、読み取り専用属性が設定されているファイルは上書きまたは削除されます。 指定しない場合、読み取り専用属性を持つファイルは上書きまたは削除されません。 |
| /errorlevel: {Off|エラー|警告|情報|Verbose} | このフィールドは省略可能です。 既定値は Info です。 この引数は、出力するログ情報のレベルを示します。 |
| /map: <ファイルパス> | このフィールドは省略可能です。 ファイル・マッピング・ディレクティブを含む .xml ファイルのパスと名前。 抽出中に使用すると、通常は /folder パラメーターで指定されたフォルダー内から読み取られるファイルは、マッピング ファイルで指定された別の場所から読み取られます。 パック操作中は、ディレクティブに一致するファイルは書き込まれません。 |
| /nologo | このフィールドは省略可能です。 実行時にバナーを非表示にします。 |
| /log: <ファイルパス> | このフィールドは省略可能です。 ログ・ファイルへのパスと名前。 ファイルがすでに存在する場合は、新しいロギング情報がファイルに追加されます。 |
| @ <ファイルパス> | このフィールドは省略可能です。 ツールのコマンドライン引数を含むファイルへのパスと名前。 |
| /sourceLoc: <文字列> | このフィールドは省略可能です。 この引数はテンプレート・リソース・ファイルを生成し、抽出時にのみ有効です。 指定できる値は、エクスポートする言語の auto または LCID/ISO コードです。 この引数を使用すると、指定したロケールの文字列リソースが中立的な .resx ファイルとして展開されます。 スイッチの auto 形式、または長い形式または短い形式のみが指定されている場合は、基本ロケールまたはソリューションが使用されます。 短い形式のコマンド、/src を使用できます。 |
| /ローカライズする | このフィールドは省略可能です。 すべての文字列リソースを展開するか、.resx ファイルに統合します。 コマンドの短縮形 /loc を使用できます。 ローカライズ オプションは、.resx ファイルの共有コンポーネントをサポートします。 詳細情報: RESX web リソースの使用 |
| /ソリューション名: <name> | このフィールドは省略可能です。 ソース フォルダーに複数のソリューションが含まれている場合にパックまたは抽出するソリューションの一意の名前 solutions/*/solution.yml。 複数のソリューションが検出された場合に必要です。 YAML ソース管理形式にのみ適用されます。 コマンドの短い形式を使用できます: /sn。 |
| /remapPluginTypeNames | このフィールドは省略可能です。 指定すると、プラグインの完全修飾型名は、ソリューションに含まれるアセンブリに基づいて再マップされます。 YAML ソース管理形式で既定で有効になっています。 コマンドの短い形式を使用できます: /fp。 |
ソース管理ファイルの形式
SolutionPackager では、ソリューションの抽出とパッキング時に 2 つのフォルダー レイアウトがサポートされます。
XML 形式 (レガシ)
元の形式。 ソリューション メタデータは Other\Solution.xml と Other\Customizations.xmlに格納され、すべてのコンポーネント ファイルが、それらのファイルと共にフラット フォルダー階層に抽出されます。 この形式は、構成を追加せずに .zip ファイルを抽出する場合の既定の形式です。
YAML ソース管理の形式
Dataverse Git 統合と共に導入されたこの形式では、ソリューション メタデータが構造化フォルダー階層全体に分散された YAML ファイルとして格納されます。 これは、Power Appsでネイティブ Git 統合を使用してソリューションをコミットするときに記述される形式です。
XML 形式に比する利点
- ソース管理で、コンポーネントごとの差分をよりわかりやすく、読みやすくします
- 1 つのリポジトリ フォルダー内の複数のソリューションをサポート
- キャンバス アプリ
.msappファイルと最新のフローは、この形式でのみサポートされます - プラグインの種類名の再マッピングが既定で有効になっている
必要なフォルダー構造
<rootFolder>/
├── solutions/
│ └── <SolutionUniqueName>/
│ ├── solution.yml (solution metadata)
│ ├── solutioncomponents.yml (paths to all component files)
│ ├── rootcomponents.yml (root-level components)
│ └── missingdependencies.yml (dependency info)
├── publishers/
│ └── <PublisherUniqueName>/
│ └── publisher.yml (publisher definition)
├── entities/ (entity components, if present)
├── workflows/ (classic workflows, if present)
├── modernflows/ (Power Automate cloud flows, if present)
├── canvasapps/ (canvas app .msapp files, if present)
└── [other component folders]/
Important
YAML 形式は、solutions/ ファイルを含む*solution.ymlサブフォルダーが存在することによって自動検出されます。
YAML マニフェスト ファイル (solution.yml、 solutioncomponents.ymlなど) が solutions/<SolutionUniqueName>/ではなくフォルダーのルートに配置されている場合、ツールは YAML 形式を検出しません。 このツールは XML パスにフォールバックし、不足している Customizations.xmlに関する誤解を招くエラーを報告します。 この問題を解決する方法については、「 トラブルシューティング 」を参照してください。
詳細情報: ソリューション YAML ソース管理の形式リファレンス
自動検出ルールの書式設定
| 条件 | 使用される形式 |
|---|---|
solutions/*/solution.yml found — 正確に 1 つのソリューション |
ソリューション名がフォルダーから推論される YAML 形式 |
solutions/*/solution.yml found — 複数のソリューション |
/SolutionName引数が必要な YAML 形式 |
サブディレクトリ solutions/ 存在しない |
XML 形式 (レガシ) |
YAML 形式フォルダーのパッキング
次のコマンドは、YAML 形式のフォルダーをパックします。
SolutionPackager.exe /action:Pack /zipfile:MySolution.zip /folder:C:\repos\myrepo
複数ソリューション フォルダーからのパッキング
次のコマンドは、指定したソリューションを複数ソリューション フォルダーにパックします。
SolutionPackager.exe /action:Pack /zipfile:SolutionA.zip /folder:C:\repos\myrepo /SolutionName:SolutionA
/map コマンド引数を使用します
次の説明では、SolutionPackager ツールへの /map 引数の使用について詳しく説明します。
自動化したビルド システムでビルドされる、.xap Silverlight ファイルおよびプラグイン アセンブリなどのファイルは、通常は、ソース コントロールにチェックインされません。 Web リソースは、SolutionPackager ツールと直接互換性のない場所のソース コントロールに既にある場合があります。 /map パラメーターを含めることで、SolutionPackager ツールは、通常行われる Extract フォルダー内からではなく、別の場所からそのようなファイルを読み取ってパッケージ化するように指示できます。 /map パラメーターは、マッピング ディレクティブを含む XML ファイルの名前とパスを指定する必要があります。 これらのディレクティブは、名前とパスによってファイルを照合するように SolutionPackager に指示し、一致したファイルを見つけるための別の場所を示します。 次の情報は、すべてのディレクティブに等しく適用されます。
同一のファイルと一致するディレクティブを含む、複数のディレクティブが表示されることがあります。 ファイルの始めに表示されているディレクティブは、後に表示されているディレクティブよりも優先されます。
ファイルがディレクティブと一致する場合、そのファイルは少なくとも 1 つの代替場所で見つかる必要があります。 一致する代替が見つからない場合、SolutionPackager がエラーを発行します。
フォルダとファイルのパスは、絶対パスまたは相対パスにすることができます。 相対パスは、常に /folder パラメーターで指定されたフォルダーから評価されます。
環境変数は、%variable% 構文を使用して指定できます。
フォルダー ワイルドカード "**" は、"任意のサブフォルダー内" を意味するために使用できます。 パスの最後の部分 ("c:\folderA\**" など) としてのみ使用できます。
ファイル名のワイルドカードは、"*.ext" または "*.*" の形式でのみ使用できます。 他のパターンはサポートされていません。
ここでは、3 種類のディレクティブ マッピングと、それらの使用方法を示す例について説明します。
フォルダマッピング
次の情報は、フォルダのマッピングの詳細を示します。
Xml 形式
<Folder map="folderA" to="folderB" />
説明
"folderA" と一致するファイル パスが "folderB" に切り替わります。
各サブフォルダ内の下位階層は、完全に一致する必要があります。
フォルダーのワイルドカードはサポートされていません。
ファイル名は指定できません。
例
<Folder map="folderA" to="folderB" /> <Folder map="folderA\folderB" to="..\..\folderC\" /> <Folder map="WebResources\subFolder" to="%base%\WebResources" />
ファイル間マッピング
次の情報は、ファイル対ファイルのマッピングの詳細を示します。
Xml 形式
<FileToFile map="path\filename.ext" to="path\filename.ext" />
説明
map パラメーターに一致するファイルが、to パラメーターで指定される名前とパスから読み取られます。
map パラメーターの場合:
ファイル名を指定する必要があります。 パスはオプションです。 パスを指定しない場合、任意のフォルダのファイルが一致する可能性があります。
ファイル名のワイルドカードはサポートされていません。
フォルダのワイルドカードがサポートされています。
toパラメーターの場合:ファイル名とパスを指定する必要があります。
ファイル名は、
mapパラメーターの名前と異なる場合があります。ファイル名のワイルドカードはサポートされていません。
フォルダのワイルドカードがサポートされています。
例
<FileToFile map="assembly.dll" to="c:\path\folder\assembly.dll" />
<FileToFile map="PluginAssemblies\**\this.dll" to="..\..\Plugins\**\that.dll" />
<FileToFile map="Webresrouces\ardvark.jpg" to="%SRCBASE%\CrmPackage\WebResources\JPG format\aardvark.jpg" />
<FileToFile
map="pluginpackages\cr886_PluginPackageTest\package\cr886_PluginPackageTest.nupkg"
to="myplg\bin\Debug\myplg.1.0.0.nupkg" />
上記の NuGet パッケージの例では、指定された場所に既に cr886_PluginPackageTest.nupkg ファイルが存在する場合、上書きは行われません。
ファイルとパスとのマッピング
次に、ファイルからパスへのマッピングについて詳しく説明します。
Xml 形式
<FileToPath map="path\filename.ext" to="path" />
説明
map パラメーターに一致するファイルは、to パラメーターで指定されたパスから読み取られます。
map パラメーターの場合:
ファイル名を指定する必要があります。 パスはオプションです。 パスを指定しない場合、任意のフォルダのファイルが一致する可能性があります。
ファイル名のワイルドカードがサポートされています。
フォルダのワイルドカードがサポートされています。
to パラメーターの場合:
パスを指定する必要があります。
フォルダのワイルドカードがサポートされています。
ファイル名は指定できません。
例
<FileToPath map="assembly.dll" to="c:\path\folder" />
<FileToPath map="PluginAssemblies\**\this.dll" to="..\..\Plugins\bin\**" />
<FileToPath map="*.jpg" to="%SRCBASE%\CrmPackage\WebResources\JPG format\" />
<FileToPath map="*.*" to="..\..\%ARCH%\%TYPE%\drop" />
マッピングの例
次の XML コード サンプルは、SolutionPackager ツールが任意の Web リソースと、CRMDevTookitSample という名前の Developer Toolkit プロジェクトから生成された 2 つの既定のアセンブリを読み取ることができる完全なマッピング ファイルを示しています。
<?xml version="1.0" encoding="utf-8"?>
<Mapping>
<!-- Match specific named files to an alternate folder -->
<FileToFile map="CRMDevTookitSamplePlugins.dll" to="..\..\Plugins\bin\**\CRMDevTookitSample.plugins.dll" />
<FileToFile map="CRMDevTookitSampleWorkflow.dll" to="..\..\Workflow\bin\**\CRMDevTookitSample.Workflow.dll" />
<!-- Match any file in and under WebResources to an alternate set of subfolders -->
<FileToPath map="WebResources\*.*" to="..\..\CrmPackage\WebResources\**" />
<FileToPath map="WebResources\**\*.*" to="..\..\CrmPackage\WebResources\**" />
</Mapping>
管理ソリューションと管理されていないソリューション
Dataverse の圧縮されたソリューション (.zip) ファイルは、ここに示す 2 種類のいずれかでエクスポートできます。
マネージド ソリューション
組織にインポートする準備ができている完成したソリューション。 インポートしたコンポーネントは追加または削除できませんが、必要に応じてさらにカスタマイズできます。 これは、ソリューションの開発が完了したときに推奨されます。
アンマネージド ソリューション
追加、削除、または変更できる内容に制限がないオープン ソリューション。 これは、ソリューションの開発中に推奨されます。
圧縮されたソリューション ファイルの形式は、その種類 (管理されているかどうか) によって異なります。 SolutionPackager は、どちらの種類の圧縮ソリューション ファイルも処理できます。 ただし、ツールでは、ある型を別の型に変換することはできません。 ソリューション ファイルを別の種類へ、たとえば、アンマネージドから管理へ変換する唯一の方法は、アンマネージド ソリューション .zip ファイルを Dataverse アプリ サーバーへインポートし、そのソリューションを管理ソリューションとしてエクスポートすることです。
SolutionPackager は、アンマネージド ソリューション ファイルとマネージド ソリューション の .zip ファイルを /PackageType:Both パラメーターを使用して結合セットとして処理できます。 この操作を実行するには、ソリューションを各タイプとして 2 回エクスポートし、.zip ファイルに次のように名前を付ける必要があります。
管理されていない .zip ファイル:AnyName.zip
管理対象 .zip ファイル:AnyName_managed.zip
このツールは、管理されていないファイルと同じフォルダに管理された zip ファイルが存在すると仮定し、管理されたコンポーネントと管理されていないコンポーネントが存在する場所の違いを保持しながら、両方のファイルを 1 つのフォルダに抽出します。
ソリューションがアンマネージとマネージドの両方として抽出された後、その 1 つのフォルダーから、/PackageType パラメーターを使用して作成するタイプを指定して、両方または各タイプを個別にパックできます。 両方のファイルを指定すると、2 つの .zip ファイルが、上記の命名規則を使用して生成されます。 デュアル管理フォルダと非管理フォルダからパックするときに /PackageType パラメータがない場合、既定では 1 つの非管理 .zip ファイルが生成されます。
Troubleshooting
Visual Studioを使用してリソース ファイルを編集するときに表示されるメッセージ
Visual Studioを使用してソリューション パッケージャーによって作成されたリソース ファイルを編集すると、次のようなメッセージが表示されることがあります。"Failed to determine version id of the resource file <filename>.resx the resource file must be exported from the solutionpackager.exe tool in order to be used as part of the pack process." これは、リソース ファイルのメタデータ タグがデータ タグにVisual Studioによって置き換えられるためです。
Workaround
お気に入りのテキストエディタでリソースファイルを開き、次のタグを見つけて更新します。
<data name="Source LCID" xml:space="preserve"> <data name="Source file" xml:space="preserve"> <data name="Source package type" xml:space="preserve"> <data name="SolutionPackager Version" mimetype="application/x-microsoft.net.object.binary.base64">ノード名を
<data>から<metadata>に変更します。たとえば、次の文字列があるとします。
<data name="Source LCID" xml:space="preserve"> <value>1033</value> </data>以下に変更します。
<metadata name="Source LCID" xml:space="preserve"> <value>1033</value> </metadata>これにより、ソリューション パッケージャーはリソース ファイルを読み取ってインポートできます。 この問題は、Visual Studio リソース エディターを使用する場合にのみ発生します。
エラー: "必要なファイルが見つかりません ...\Other\Customizations.xml" と YAML フォルダーがある
このエラーは、pac solution packなどの YAML ファイルを含むフォルダーに対して SolutionPackager (またはsolution.yml) を実行したときに表示されますが、これらのファイルは、必要なsolutions/<SolutionUniqueName>/サブフォルダー内ではなく、フォルダーのルートに配置されます。
原因:このツールは、solutions/ ファイルを含む*solution.ymlサブフォルダーを探して、YAML ソース管理形式を検出します。 そのディレクトリが存在しない場合、ツールは自動的に XML (レガシ) 形式にフォールバックし、 Other\Customizations.xmlを想定します。 結果のエラー メッセージは XML ファイルを参照し、誤解を招く YAML については言及していません。
修正: YAML マニフェスト ファイルが正しいパスの下に存在するようにフォルダーを再構成します。
<rootFolder>/
solutions/<YourSolutionUniqueName>/ ← move solution.yml here
solution.yml
solutioncomponents.yml
rootcomponents.yml
missingdependencies.yml
publishers/<YourPublisherUniqueName>/
publisher.yml
Git 統合コミットまたは pac solution cloneからフォルダーを取得した場合、フォルダー構造は既に正しいはずです。
solutions/サブディレクトリのない最上位の YAML ファイルのみが含まれるフォルダーは、不完全な抽出を表し、直接パックすることはできません。
警告: rootcomponents.ymlで宣言されたコンポーネントにソース ファイルがありません
この警告は、キャンバス アプリなどのコンポーネントが rootcomponents.yml に一覧表示されているが、想定されるコンポーネント フォルダー (たとえば、 canvasapps/<schema-name>/) に対応するソース ファイルが存在しない場合に表示されます。
効果: ツールは引き続き成功し (終了コード 0)、有効な .zip ファイルが生成されますが、宣言されたコンポーネントはパッケージ 化されたソリューションから省略されます。
原因: フォルダーは部分抽出によって生成されたか、コンポーネントのソース ファイルがリポジトリに含まれていませんでした。 たとえば、ソリューション マニフェスト ファイルのみがコミットされ、キャンバス アプリ自体はコミットされませんでした。
修正:rootcomponents.ymlで宣言されているすべてのコンポーネントに、対応するソース ファイルがフォルダー内に存在することを確認します。 キャンバス アプリの場合、 .msapp ファイルは canvasapps/<schema-name>/ の下に存在する必要があります。 ファイルがない場合は、Dataverse から完全なソリューションを再エクスポートしてアンパックするか、 pac solution clone を使用して完全な抽出を取得します。