複数のパッケージディレクトリ
sfdx-project.json ファイルの packageDirectories セクションで、各パッケージディレクトリを別々に指定します。各ローカルパッケージディレクトリは、標準的な Salesforce DX プロジェクト構造に従います。
複数のパッケージディレクトリの構造は、クライアント側 (ローカル) のみです。force:source:deploy または force:source:push でソースを組織にリリースした場合、そのローカルパッケージディレクトリの位置と組織のパッケージの間に関連はありません。特定の 2GP パッケージを明示的にインストールして、メタデータが組織のその 2GP パッケージに属することを指定します。
すべての force:source:* コマンドで複数のパッケージディレクトリがサポートされています。
考慮事項
複数のパッケージディレクトリを設定する前に、次の考慮事項を確認してください。
- デフォルトでは、force:source:deploy と force:source:push はどちらも、単一のトランザクションでメタデータを組織にリリースします。この動作は、sfdx-project.json に複数のパッケージディレクトリが指定されている順序に関係なく実行されます。force:source:push コマンドは、すべてのパッケージディレクトリ内にある変更されたメタデータと新規のメタデータをすべてプッシュします。force:source:deploy は、指定されたメタデータのみをリリースします。force:source:push を使用したいが、パッケージディレクトリをプッシュする順序も指定したい場合は、sfdx-project.json の pushPackageDirectoriesSequentially プロパティを使用します。詳細は、「ソースの順次プッシュ」を参照してください。
- デフォルトでは、force:source:deploy|retrieve コマンドは、ソースファイル内の変更を追跡しません。このコマンドのソース追跡を有効にするには、コマンドを実行するたびに --tracksource パラメータを指定します。そうすると、force:source:deploy|retrieve コマンドは、force:source:push|pull コマンドと同じ内部ソース追跡ファイルを使用するようになります。force:source:deploy|retrieve と force:source:push|pull を一緒に使用する場合は、必ずこのパラメータを使用してください。そうしない���、内部ソース追跡ファイルが同期されなくなります。force:source:push|pull コマンドは、常にソースの変更を追跡します。
設定方法
複数のパッケージディレクトリの設定は簡単です。これらのディレクトリ間でローカルソースコードを整理する方法については、十分な検討と計画が必要です。また、その方法は、ご使用の開発環境によっても変わります。作業を始める前に、コードをどのように整理するかを計画します。開発者がより簡単かつ効率的に作業できるようにするため、ソースコードは、プロジェクトが拡大しても、常に適切に整理された状態にしておいてください。
簡単な例を見てみましょう。たとえば、カスタムオブジェクト MyObject の分解されたメタデータファイルをデフォルトのパッケージディレクトリ内に配置します。この後、MyObject の新規項目 MyField 用のファイルを別の「拡張」パッケージディレクトリに配置できます。これは、MyObject ファイルを含めなくても行うことができます。コードを整理する方法は多数ありますが、このトピックでは、すべての方法については説明いたしません。これらのブログ投稿にいくつかの考えが示されています。
複数のパッケージディレクトリの設定方法を次に示します。最初に、サンプルの sfdx-project.json スニペットを見てみましょう。
この sfdx-project.json スニペットでは、es-base-custom (デフォルト)、es-base-ext、es-base-styles の 3 つのパッケージディレクトリが定義されています。たとえば、最上位のローカルプロジェクトディレクトリが easy-spaces-lwc であるとしましょう。このディレクトリの下のディレクトリ階層は、次のようになっています。

各 es-base-* ディレクトリは、標準的な Salesforce DX プロジェクト構造に従います。たとえば、es-base-ext は、次のようになります。

開発環境に最も適した方法で、分解されたメタデータソースをこれらの複数のパッケージディレクトリに追加します。
Trailhead のしくみ
いくつかの例を通じて、force:source:push|pull と force:source:deploy|retrieve が複数のパッケージディレクトリを操作する方法を確認しましょう。
新しい組織に対して force:source:push コマンドは、sfdx-project.json ファイルに指定されている複数のすべてのパッケージディレクトリ内のメタデータをすべてプッシュします。その後、新しいメタデータ、変更されたメタデータ、または削除対象とマークされたメタデータをプッシュします。デフォルトでは、パッケージディレクトリが 1 つだけであるかのように、メタデータを単一のトランザクションでプッシュします。
これに対し、リリースしたいメタデータを対象にするには、force:source:deploy を使用します。リリースできるのは、特定のパッケージディレクトリ、特定のメタデータコンポーネント、マニフェストファイルに指定されているコンポーネントなどです。次の例では、es-base-custom パッケージディレクトリのメタデータがリリースされます。
次の例では、複数のすべてのパッケージディレクトリにある Apex クラスがすべてリリースされます。
force:source:pull を実行すると、組織のすべてのリモートの変更がローカルプロジェクト内にプルされます。コマンドは、取得されたコンポーネントごとにすべてのパッケージディレクトリを調べ、ローカル一致がないかを確認します。一致が見つかった場合、コマンドは、コンポーネントを更新します。一致が見つからなかった場合、コマンドは、ローカルコンポーネントをデフォルトのパッケージディレクトリ (この例では es-base-custom) 内にコピーします。
プルされたファイルは、プロジェクトに適したパッケージディレクトリに移動できます。force:source:push で、移動したファイルを組織に戻すと、Salesforce CLI は、その新しい位置を追跡します。
対象のメタデータを組織から取得するには、force:source:retrieve を使用します。force:source:pull と同様、既存のメタデータは目的のローカルパッケージディレクトリ内に取得され、新しいメタデータはデフォルトのパッケージディレクトリ内に取得されます。次の例では、ローカル es-base-custom パッケージディレクトリに含まれているメタデータコンポーネントのみが取得されます。
次の例では、組織からすべての Apex クラスが取得されます。新しいクラスはデフォルトのパッケージディレクトリに移動し、ローカルに存在するクラスは対応するパッケージディレクトリに移動します。
ソースの順次プッシュ
- ローカルプロジェクト内の再構成されたメタデータコンポーネントファイルの数が、1 回の取得またはリリースあたり 10,000 ファイルという Salesforce のメタデータの制限を超える。回避策の 1 つとして、メタデータを複数のパッケージディレクトリに分割し、各ディレクトリに含まれるファイル数をこの制限未満にして、各ディレクトリを順次的に別々にプッシュする方法があります。
- 複数のパッケージディレクトリ間に連動関係があり、各ディレクトリを特定の順序でプッシュする必要がある。
- 複数のパッケージディレクトリに同じメタデータコンポーネントが含まれており、どれを最後にリリースして上書きされないようにするかを指定したいと考えている。
sdfx-project.json に指定されている順序で複数のパッケージディレクトリを指定するには、このファイルに "pushPackageDirectoriesSequentially": true を追加します。次に例を示します。
force:source:push を実行すると、最初に es-base-custom からのメタデータ、次に es-base-ext からのメタデータ、次に es-base-styles からのメタデータの順序で、3 つのプッシュが個別に実行されます。