AgentSkillsCN

Salesforce Metadata API Reference

Salesforce Metadata API的密集型平台参考——package.xml结构、元数据类型、源码与MDAPI格式、部署/检索命令、破坏性变更,以及常见错误。专为快速查阅而优化。

SKILL.md
--- frontmatter
name: Salesforce Metadata API Reference
description: Dense platform reference for Salesforce Metadata API — package.xml structure, metadata types, source vs MDAPI format, deploy/retrieve commands, destructive changes, and common errors. Optimized for quick lookup.
when_to_use: When working with Salesforce metadata deployments, retrievals, package.xml files, destructive changes, or troubleshooting deployment errors.
version: "62.0"

Salesforce Metadata API Reference (v62.0)

package.xml Anatomy

xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- XML declaration — required first line, UTF-8 encoding -->

<Package xmlns="http://soap.sforce.com/2006/04/metadata">
<!-- Root element. xmlns is mandatory and never changes. -->

    <types>
        <!-- Each <types> block groups members of a single metadata type -->
        <members>MyApexClass</members>
        <members>AnotherClass</members>
        <!-- Use <members>*</members> to include ALL components of this type (if wildcard supported) -->
        <name>ApexClass</name>
        <!-- <name> MUST appear once per <types> block, AFTER <members> -->
    </types>

    <types>
        <members>AccountTrigger</members>
        <name>ApexTrigger</name>
    </types>

    <types>
        <members>myLwcComponent</members>
        <name>LightningComponentBundle</name>
    </types>

    <types>
        <members>Account</members>
        <members>Contact</members>
        <name>CustomObject</name>
        <!-- Standard objects use API name (Account). Custom objects use MyObj__c -->
    </types>

    <types>
        <members>Account.My_Custom_Field__c</members>
        <members>Contact.Email_Opt_In__c</members>
        <name>CustomField</name>
        <!-- CustomField members use Object.FieldName format -->
    </types>

    <version>62.0</version>
    <!-- API version. Must match target org capabilities. -->

</Package>

Key rules:

  • One <name> per <types> block, always after <members>.
  • <members>*</members> retrieves all — but not all types support wildcard.
  • <version> appears once, outside <types>, as the last child of <Package>.
  • Child metadata (CustomField, ValidationRule, etc.) uses ParentObject.ComponentName format.

Common Metadata Types

Metadata TypeDirectory (Source Format)File SuffixWildcard (*)
ApexClassclasses/.clsYes
ApexTriggertriggers/.triggerYes
ApexPagepages/.pageYes
ApexComponentcomponents/.componentYes
LightningComponentBundlelwc/(directory)Yes
AuraDefinitionBundleaura/(directory)Yes
CustomObjectobjects/.object-meta.xmlYes
CustomFieldobjects/<Obj>/fields/.field-meta.xmlYes
CustomTabtabs/.tab-meta.xmlYes
Layoutlayouts/.layout-meta.xmlYes
Profileprofiles/.profile-meta.xmlNo
PermissionSetpermissionsets/.permissionset-meta.xmlYes
FlowDefinitionflowDefinitions/.flowDefinition-meta.xmlYes
Flowflows/.flow-meta.xmlYes
CustomMetadatacustomMetadata/.md-meta.xmlYes
CustomLabellabels/.labels-meta.xmlYes
StaticResourcestaticresources/.resource-meta.xmlYes
RemoteSiteSettingremoteSiteSettings/.remoteSite-meta.xmlYes
NamedCredentialnamedCredentials/.namedCredential-meta.xmlYes
ConnectedAppconnectedApps/.connectedApp-meta.xmlYes
ApexTestSuitetestSuites/.testSuite-meta.xmlYes
AssignmentRulesassignmentRules/.assignmentRules-meta.xmlNo
AutoResponseRulesautoResponseRules/.autoResponseRules-meta.xmlNo
WorkflowRuleworkflows/.workflow-meta.xmlYes
ValidationRuleobjects/<Obj>/validationRules/.validationRule-meta.xmlYes
RecordTypeobjects/<Obj>/recordTypes/.recordType-meta.xmlYes
ListViewobjects/<Obj>/listViews/.listView-meta.xmlYes
CompactLayoutobjects/<Obj>/compactLayouts/.compactLayout-meta.xmlYes
WebLinkobjects/<Obj>/webLinks/.webLink-meta.xmlYes
HomePageLayouthomePageLayouts/.homePageLayout-meta.xmlYes

Notes:

  • Child types (CustomField, ValidationRule, RecordType, ListView, CompactLayout, WebLink) use ParentObject.ComponentName in package.xml.
  • Profile does NOT support wildcard — you must list each profile by name.
  • AssignmentRules and AutoResponseRules do not support wildcard.

Source Format vs MDAPI Format

AspectSource FormatMDAPI Format
Directory structureforce-app/main/default/ with decomposed subdirsFlat src/ or unpackaged/ directory
DecompositionObjects decomposed into fields, rules, etc. in subdirsSingle monolithic .object XML file per object
TrackingSource tracking per org (scratch/sandbox)No built-in source tracking
CLI commandssf project deploy start, sf project retrieve startsf project deploy start --metadata-dir
Config filesfdx-project.jsonpackage.xml at root of deploy dir
Use casesDay-to-day development, scratch orgs, version controlCI/CD pipelines, unlocked/managed packages, org migrations
VCS friendlinessHigh — small decomposed files, clean diffsLow — large monolithic files, noisy diffs
Convert betweensf project convert mdapi (MDAPI -> source)sf project convert source (source -> MDAPI)

Deployment Commands

sf project deploy start

FlagDescription
--source-dir, -dPath to source files to deploy (source format). Repeatable.
--metadata, -mMetadata component names (e.g., ApexClass:MyClass). Repeatable.
--manifest, -xPath to package.xml manifest file.
--metadata-dirPath to MDAPI-format directory (root must contain package.xml).
--target-org, -oAlias or username of the target org.
--test-level, -lNoTestRun, RunSpecifiedTests, RunLocalTests, RunAllTestsInOrg
--tests, -tSpecific test classes to run (requires --test-level RunSpecifiedTests). Repeatable.
--dry-runValidate only — does not deploy. Equivalent to checkOnly in MDAPI.
--wait, -wMinutes to wait for deploy to finish (default: 33). 0 = async.
--asyncRun deploy asynchronously. Returns job ID immediately.
--ignore-errorsIgnore deploy errors and allow partial success.
--ignore-warningsIgnore deploy warnings.

Examples:

bash
# Deploy source directory
sf project deploy start -d force-app/main/default -o myOrg

# Deploy specific metadata
sf project deploy start -m ApexClass:MyClass -m ApexTrigger:MyTrigger -o myOrg

# Deploy via manifest with tests
sf project deploy start -x manifest/package.xml -o myOrg -l RunSpecifiedTests -t MyClassTest

# Validate only (dry run)
sf project deploy start -x manifest/package.xml -o myOrg --dry-run -l RunLocalTests

# Quick deploy after successful validation (uses job ID from dry run)
sf project deploy quick --job-id <jobId> -o myOrg

sf project deploy report

bash
# Check status of async deploy
sf project deploy report --job-id <jobId> -o myOrg

sf project deploy cancel

bash
# Cancel an in-progress deploy
sf project deploy cancel --job-id <jobId> -o myOrg

Retrieval Commands

sf project retrieve start

FlagDescription
--source-dir, -dRetrieve source into this directory path. Repeatable.
--metadata, -mMetadata component names (e.g., ApexClass:MyClass). Repeatable.
--manifest, -xPath to package.xml manifest.
--target-org, -oAlias or username of the source org.
--package-name, -nName of installed package to retrieve. Repeatable.
--output-dir, -rDirectory to store retrieved MDAPI-format files.
--api-version, -aOverride API version for retrieval.

Examples:

bash
# Retrieve by manifest
sf project retrieve start -x manifest/package.xml -o myOrg

# Retrieve specific components
sf project retrieve start -m ApexClass:MyClass -m CustomObject:Account -o myOrg

# Retrieve into MDAPI format directory
sf project retrieve start -x manifest/package.xml -o myOrg -r mdapi-output/

# Retrieve installed package
sf project retrieve start -n "My Managed Package" -o myOrg

Destructive Changes

Pre-Destructive vs Post-Destructive

AspectdestructiveChangesPre.xmldestructiveChangesPost.xml
Execution orderDeletions happen before deployDeletions happen after deploy
Use whenRemoving something that blocks the deploy (e.g., field referenced by deleted code)Removing something that the deploy makes obsolete
Typical useRemove fields/objects before deploying code that no longer references themClean up old components after new code is deployed

Requirements

  1. An empty package.xml is required alongside destructive manifests (even if deploying nothing new).
  2. Use --metadata-dir to deploy the directory containing both files.

Full Example

Directory structure:

code
destructive-deploy/
  package.xml                    # Empty — required
  destructiveChangesPost.xml     # Components to delete after deploy

package.xml (empty — required even when only deleting):

xml
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
    <version>62.0</version>
</Package>

destructiveChangesPost.xml:

xml
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
    <types>
        <members>ObsoleteClass</members>
        <members>DeprecatedHelper</members>
        <name>ApexClass</name>
    </types>
    <types>
        <members>Account.Old_Field__c</members>
        <name>CustomField</name>
    </types>
    <types>
        <members>Old_Object__c</members>
        <name>CustomObject</name>
    </types>
    <version>62.0</version>
</Package>

Deploy command:

bash
# Deploy destructive changes
sf project deploy start --metadata-dir destructive-deploy/ -o myOrg -w 30

# Validate first (recommended)
sf project deploy start --metadata-dir destructive-deploy/ -o myOrg --dry-run -w 30

Pre-destructive example (deletions run first):

bash
# Directory contains: package.xml + destructiveChangesPre.xml
# Use when removing a field that existing code no longer references
# (deploy removes the code, but the field must go first to avoid dependency errors)
sf project deploy start --metadata-dir pre-destructive-deploy/ -o myOrg

Common Deployment Errors

ErrorCauseFix
Cannot delete metadata componentComponent is referenced by another component, or deletion not allowed for that type.Remove references first. Use destructiveChangesPre.xml to sequence deletions. Check if the type supports deletion.
This component has an error that prevents deploymentApex compilation error, LWC template error, or invalid XML in the component being deployed.Fix syntax/compilation errors locally. Run sf apex run test to surface failures before deploying.
Code coverage below 75%Org-wide Apex code coverage is under 75% (required for production deploys).Write more tests. Use --test-level RunLocalTests to verify coverage. Check coverage with sf apex get test -i <testRunId>.
Test failureOne or more Apex test methods failed during the deployment validation.Run tests locally first. Use --tests to isolate failures. Check test data setup and org-specific config.
Dependent class is invalidA class referenced by the deploying code has a compilation error in the target org.Fix or deploy the dependent class first. Deploy both classes together.
Entity of type X named Y not foundReferencing a metadata component (field, object, class) that doesn't exist in the target org.Deploy the missing dependency first. Check API names for typos. Verify the component exists in the target.
API version mismatchComponent's API version exceeds the org's supported version, or package.xml version is incompatible.Lower the <version> in package.xml or the component's -meta.xml. Check org's max API version in Setup > Apex Settings.
Namespace prefix mismatchDeploying components with a namespace prefix to an org with a different or no namespace.Remove namespace prefixes for unmanaged deployments. Ensure org namespace matches.
DUPLICATE_VALUEAttempting to create a metadata component that already exists (e.g., duplicate field API name, duplicate record type).Rename the new component or delete the existing one first. Use retrieve to check current state.
UNKNOWN_EXCEPTION: An unexpected error occurredSalesforce platform error — transient or caused by corrupt metadata.Retry the deployment. If persistent, open a Salesforce support case. Try deploying smaller subsets to isolate.

Quick Reference: Test Levels for Production Deploy

Test LevelWhen to Use
NoTestRunNot allowed for production. Sandbox/scratch only.
RunSpecifiedTestsDeploy with targeted tests. Must cover 75% of deployed code.
RunLocalTestsRuns all local tests (excludes managed package tests). Default for production.
RunAllTestsInOrgRuns everything including managed package tests. Slowest — rarely needed.

Metadata API Limits (v62.0)

LimitValue
Max file size per component5 MB
Max total deploy/retrieve size (unzipped)400 MB
Max components per deploy10,000
Deploy timeout (default)33 minutes (--wait overrides)
Max retrieve size (zipped)39 MB
Long-running deploy timeout24 hours (async)