SolutionPackager ツール

SolutionPackager は、Microsoft Dataverse圧縮されたソリューション ファイルを複数の XML ファイルやその他のファイルに元に戻せるツールです。 そうすると、ソース管理システムを使用することによりこれらのファイルを簡単に管理できます。 次のセクションでは、ツールの実行方法と、マネージド ソリューションとアンマネージド ソリューションでツールを使用する方法について説明します。

Important

SolutionPackager ツールは、ソリューションを解凍およびパックするための推奨方法ではなくなりました。 SolutionPackager ツールの機能は、 Power Platform CLI に組み込まれています。 pac solution コマンドには、SolutionPackager ツールの基になる同じ機能を組み込んだunpack、pack、clone、syncなど、多くの動詞があります。

SolutionPackager ツールの場所

SolutionPackager ツールは、 Microsoft.CrmSdk.CoreTools NuGet パッケージの一部として配布されます。 プログラムをインストールするには、この手順に従います。

  1. NuGet パッケージをダウンロードします。
  2. パッケージのファイル名拡張子を .nupkg から .zip に変更します。
  3. 圧縮 (zip) ファイルのコンテンツを解凍します。

<抽出されたフォルダー名>/contents/bin/coretools フォルダーで SolutionPackager.exe 実行可能ファイルを見つけます。 coretools フォルダーからプログラムを実行するか、そのフォルダーを PATH に追加します。

SolutionPackager コマンドライン引数

SolutionPackager はコマンド ライン ツールです。 これを呼び出すには、次の表で説明するパラメーターを使用して呼び出すことができます。

引数 Description
/アクション: {抽出|パック} 必須。 実行すべきアクション。 アクションは、ソリューション .zip ファイルをフォルダーに抽出するか、フォルダーを .zip ファイルにパックするかのいずれかです。
/zipfile: <ファイルパス> 必須。 ソリューション .zip ファイルのパスと名前。 展開時に、ファイルが存在して読み取り可能である必要があります。 パックすると、ファイルが置き換えられます。
/folder: <フォルダのパス> 必須。 フォルダーのパス。 抽出すると、このフォルダが作成され、コンポーネントファイルが入力されます。 パックする場合、このフォルダーは既に存在し、以前に抽出されたコンポーネント ファイルが含まれている必要があります。
/パッケージタイプ: {アンマネージド|管理|両方} Optional. 処理するパッケージのタイプ。 デフォルト値は [アンマネージド] です。 ツールは .zip ファイルまたはコンポーネント ファイル内からパッケージの種類を読み取ることができるため、ほとんどの場合、この引数を省略します。 抽出が行われ、かつ両方のマネージドおよびアンマネージド ソリューション .zip ファイルが指定されている場合、これらのファイルは必ず存在し、1 つのフォルダーにまとめて処理されます。 圧縮と Both が指定されているときは、管理ソリューションおよびアンマネージド ソリューションの .zip ファイルが 1 つのフォルダーから生成されます。 詳細については、この記事の後半にある、管理ソリューションおよびアンマネージド ソリューションを使用した作業についてのセクションを参照してください。
/allowWrite:{はい|いいえ} Optional. 既定値は Yes です。 この引数は、抽出時にのみ使用します。 /allowWrite:No を指定すると、ツールはすべての操作を実行しますが、ファイルの書き込みや削除は行いません。 既存のファイルを上書きまたは削除することなく、抽出操作を安全に評価できます。
/allowDelete:{はい|いいえ|プロンプト} Optional. デフォルト値は [プロンプト] です。 この引数は、抽出時にのみ使用します。 /allowDelete:Yes を指定すると、ツールは /folder パラメーターで指定されたフォルダーに存在する、想定されていないすべてのファイルを自動的に削除します。 /allowDelete:No を指定すると、ツールはファイルを削除しません。 /allowDelete:Prompt を指定すると、ユーザーはコンソールを通じて、すべての削除操作を許可するか拒否するかを求められます。 /allowWrite:No を指定した場合、/allowDelete:Yes も指定されている場合でも、ツールはファイルを削除しません。
/clobber Optional. この引数は、抽出時にのみ使用します。 /clobber を指定すると、ツールは、読み取り専用属性が設定されているファイルを上書きまたは削除します。 指定しない場合、ツールは読み取り専用属性が付いたファイルを上書きまたは削除しません。
/errorlevel: {Off|エラー|警告|情報|Verbose} Optional. 既定値は Info です。 この引数は、出力するログ情報のレベルを示します。
/map: <ファイルパス> Optional. ファイル・マッピング・ディレクティブを含む .xml ファイルのパスと名前。 抽出中に使用すると、ツールは通常、/folder パラメーターで指定されたフォルダー内から読み取るファイルを、マッピング ファイルで指定された別の場所から読み取ります。 パック操作中、ツールはディレクティブに一致するファイルは書き込みません。
/nologo Optional. 実行時にバナーを非表示にします。
/log: <ファイルパス> Optional. ログ・ファイルへのパスと名前。 ファイルがすでに存在する場合は、新しいロギング情報がファイルに追加されます。
@ <ファイルパス> Optional. ツールのコマンドライン引数を含むファイルへのパスと名前。
/sourceLoc: <文字列> Optional. この引数はテンプレート・リソース・ファイルを生成し、抽出時にのみ有効です。

指定できる値は、エクスポートする言語の auto または LCID/ISO コードです。 この引数を使用すると、ツールは、指定されたロケールからニュートラル .resx ファイルとして文字列リソースを抽出します。 autoまたはスイッチの長い形式または短い形式のみを指定した場合は、基本ロケールまたはソリューションが使用されます。 短い形式のコマンド、/src を使用できます。
/ローカライズする Optional. すべての文字列リソースを展開するか、.resx ファイルに統合します。 コマンドの短縮形 /loc を使用できます。 ローカライズ オプションは、.resx ファイルの共有コンポーネントをサポートします。 詳細については、 RESX Web リソースの使用を参照してください。
/ソリューション名: <name> Optional. ソース フォルダーに複数のソリューションが含まれている場合にパックまたは抽出するソリューションの一意の名前 solutions/*/solution.yml。 複数のソリューションが検出された場合に必要です。 YAML ソース管理形式にのみ適用されます。 コマンドの短い形式を使用できます: /sn。
/remapPluginTypeNames Optional. 指定すると、ツールはソリューションに含まれるアセンブリに基づいてプラグインの完全修飾型名を再マップします。 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

solutions/ ファイルを含む *solution.yml サブフォルダーが存在することは、YAML 形式を示します。 solutioncomponents.ymlの下ではなく、フォルダーのルートに YAML マニフェスト ファイル (solutions/<SolutionUniqueName>/、solution.yml、など) を配置した場合、ツールは YAML 形式を検出しません。 このツールは XML パスにフォールバックし、不足している Customizations.xmlに関する誤解を招くエラーを報告します。 この問題を解決する方法については、「 トラブルシューティング 」を参照してください。

詳細情報: ソリューション YAML ソース管理の形式リファレンス

自動検出ルールの書式設定

状態 使用される形式
solutions/*/solution.yml 検出 — 正確に 1 つのソリューション ソリューション名がフォルダーから推論される YAML 形式
solutions/*/solution.yml 検出 — 複数ソリューション /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" に切り替わります。

  • 各フォルダーのサブフォルダーの階層が完全に一致している必要があります。

  • フォルダーのワイルドカードはサポートされていません。

  • ファイル名を指定することはできません。

    Examples

    <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 パラメーターの名前とは異なる場合があります。

  • ファイル名のワイルドカードはサポートされていません。

  • フォルダー ワイルドカードをサポートします。

Examples

  <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 パラメーターの場合:

  • パスを指定してください。

  • フォルダー ワイルドカードをサポートします。

  • ファイル名を指定しないでください。

    Examples

  <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) ファイルは、マネージド ソリューションまたはアンマネージド ソリューションとしてエクスポートできます。

マネージド ソリューション
組織にインポートする準備ができている完成したソリューション。 インポート後は、コンポーネントを追加または削除することはできませんが、必要に応じて追加のカスタマイズを許可することもできます。 ソリューションの開発が完了した際、このタイプを使用します。

アンマネージド ソリューション
追加、削除、または変更できる内容に制限のないオープン ソリューション。 ソリューションの開発中にこの種類を使用します。

圧縮ソリューション ファイルの形式は、マネージドまたはアンマネージドの種類によって異なります。 SolutionPackager は、どちらの種類の圧縮ソリューション ファイルも処理できます。 ただし、ツールでは、ある型を別の型に変換することはできません。 ソリューション ファイルを別の種類 (アンマネージドからマネージドなど) に変換する唯一の方法は、アンマネージド ソリューション .zip ファイルを Dataverse サーバーにインポートしてから、ソリューションをマネージド ソリューションとしてエクスポートすることです。

SolutionPackager は、 /PackageType:Both パラメーターを使用して、アンマネージド ソリューションとマネージド ソリューション .zip ファイルを組み合わせたセットとして処理できます。 この操作を実行するには、ソリューションを各種類としてそれぞれ 1 回、計 2 回エクスポートする必要があります。 .zip ファイルに次の名前を付けてください:

管理されていない .zip ファイル:AnyName.zip

管理対象 .zip ファイル:AnyName_managed.zip

このツールは、マネージド zip ファイルがアンマネージド ファイルと同じフォルダー内にあると想定します。 両方のファイルを 1 つのフォルダーに抽出し、マネージド コンポーネントとアンマネージド コンポーネントが存在する場合は、その違いを保持します。

ソリューションをアンマネージドとマネージドの両方として抽出した後、その 1 つのフォルダーから両方の種類または各種類を個別にパックできます。 /PackageType パラメーターを使用して、作成する型を指定します。 両方のファイルを指定すると、前の名前付け規則を使用して 2 つの .zip ファイルが生成されます。 デュアルのマネージド/アンマネージド フォルダーからパックするときに /PackageType パラメーターを含めない場合、既定では、単一のアンマネージド .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が原因で表示されます。

対処法

  1. お気に入りのテキスト エディターでリソース ファイルを開き、次のタグを見つけて更新してください。

    <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">  
    
    
  2. ノード名を <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 を使用して完全な抽出を取得します。

こちらも参照ください