沙盒

沙盒是 Salesforce 组织的副本,可用于开发、测试、 和培训,而不会影响生产组织中的数据和应用程序。

Salesforce 提供沙盒和一组部署工具,因此您可以:

  • 将自定义和开发工作与生产环境隔离开来,直到 你已准备好部署更改。
  • 针对生产数据和用户的副本测试更改。
  • 提供培训环境。
  • 将单个更改协调到一个部署到生产中。

传统上,您或您的管理员通过 设置 UI。但是我们意识到,许多开发人员希望能够创建和管理他们的 以编程方式开发和测试环境,并自动执行其 CI 流程。 借助 Salesforce CLI,您可以同时做到这两点。

沙盒在应用程序开发生命周期中处于什么位置?

您使用的开发模型决定了您在哪些阶段使用沙盒。查看更多 有关我们的开发模型以及沙盒适合的位置的信息,请参阅确定适合的应用程序生命周期模型 你(Trailhead)。

  • 授权生产组织
    JWT 和基于 Web 的流需要具有沙盒许可证的生产组织,而不是开发人员中心。但是,如果你的生产组织也是开发人员中心组织,则没关系。
  • 创建沙盒定义文件
    在使用 Salesforce CLI 创建沙盒之前,请在沙盒定义文件中定义沙盒的配置。沙盒定义文件是沙盒的蓝图。您可以为在开发过程中使用的每种沙盒类型创建不同的定义文件。
  • 创建、克隆或删除沙盒 创建用于开发、测试或训练的沙盒
    。克隆沙盒以将其数据和元数据复制到另一个沙盒。

授权您的生产组织

JWT 和基于 Web 的流程需要具有沙盒许可证的生产组织,而不是开发人员 枢纽。但是,如果你的生产组织也是开发人员中心组织,则没关系。

使用基于 JWT 的流程授权组织和使用基于 Web 的流程授权组织中的示例是针对的 走向 Scratch 组织。请按照以下提示成功授权您的生产组织。

  • 请务必在 sfdx-project.json 文件中使用 for。 或者,您可以使用直接在命令行上指定 URL。此值将覆盖您的登录 URL 在 sfdx-project.json 文件中指定。https://login.salesforce.comsfdcLoginUrlorg login jwt –instance-url
  • 运行命令时指定生产组织的用户名。无需指定 Dev Hub 或 指示默认的 Dev Hub。org login jwt
  • JWT 授权流程要求您创建连接的应用程序。当你 创建连接的应用,登录到生产组织,而不是开发人员中心组织。

创建沙盒定义文件

在使用 Salesforce CLI 创建沙盒之前,请在 沙盒定义文件。沙盒定义文件是沙盒的蓝图。您可以 为开发中使用的每种沙盒类型创建不同的定义文件 过程。

沙盒配置值

选择必填?描述
apexClassId对 Apex 类的 ID 的引用,该类在 沙盒。允许您在沙盒上执行业务逻辑,以便为沙盒做好准备 用。
自动激活如果 ,您可以激活沙盒 立即刷新。true
copyArchived活动仅限完整沙盒。如果您的组织已购买,则此字段可见 用于复制沙盒的存档活动的选项。要获取此选项,请联系 Salesforce 客户支持。
copyChatter如果 ,则复制存档的 Chatter 数据 到沙盒。true
描述沙盒的描述(1000 个或更少字符),可帮助您 将其与其他沙盒区分开来。
历史天数仅限完整沙盒。表示对象历史记录的天数 复制到沙盒中。取值范围:-1,表示所有可用天数0 (默认)1020306090120150180
许可证类型是(用于沙盒创建)有效值为 、 、 和 。DeveloperDeveloper_ProPartialFull
沙盒名称是的用于标识沙盒的唯一字母数字字符串(10 个字符或更少)。 在删除沙盒的过程中,您无法重复使用名称。
源SandboxName是(用于沙盒克隆)要克隆的沙盒的名称。
模板 Id是(适用于部分沙盒)对于完整沙箱是可选的。不适用于 Developer 和 Developer Pro 沙盒。对由 15 个字符标识的沙盒模板的引用 查看时 URL 中以 开头的 ID 浏览器中的沙盒模板。沙盒模板允许您选择哪些对象 在沙盒中复制。1ps

注意

您可以在定义文件中指定其中之一,但不能同时指定两者。licenseTypesourceSandboxName

示例沙盒定义文件

尽管您可以将沙盒定义文件放在任何位置,但我们建议将其保留在 配置目录中的 Salesforce DX 项目。命名 文件中,我们建议提供以 sandbox-def.json 结尾的描述性名称,例如 developer-sandbox-def.json。

下面是用于创建沙盒的示例定义文件:

{
     "sandboxName": "dev1",
     "licenseType": "Developer"
}

下面是用于克隆沙盒的示例定义文件:

{
     "sandboxName": "dev1clone",
     "sourceSandboxName": "dev1"
}

创建、克隆或删除沙盒

创建用于开发、测试或训练的沙盒。克隆要复制的沙盒 其数据和元数据复制到另一个沙盒。

在创建或克隆沙盒之前:

  • 使用清单文件创建 Salesforce DX 项目。
  • 授权给具有可用沙盒许可证的生产组织。
  • 创建沙箱定义文件。

为什么我们建议使用别名

创建或克隆沙盒时, 沙盒中生成的用户名基于生产组织中存在的用户名,或者 沙盒。用户名看起来像电子邮件地址,例如 .如果生成的用户名不是唯一的,我们会在前面添加一些 字符和数字添加到用户名中。修改后的用户名类似于 。username@company.com.dev100x7Vqusername@company.com.dev1

可以想象, 记住这些用户名可能具有挑战性,尤其是当您有多个沙盒时 管理。别名是管理和跟踪组织的有效方法,我们认为它是最好的 实践。因此,当您发出需要用户名的命令时,使用您可以 记住可以加快速度。如果您在创建沙盒时未设置别名,则 可以设置一个 后。

sf alias set MyDevSandbox username@company.com.dev1

创建沙盒

可选:创建沙箱定义文件

当您创建一个 沙盒,Salesforce 将元数据和可选数据从您的生产组织复制到 沙盒组织。使用该标志指定生产组织的用户名或别名。–target-org

sf org create sandbox --target-org prodOrg --definition-file config/dev-sandbox-def.json --alias MyDevSandbox --set-default --wait 30

这 命令要求您确认沙箱配置,然后将信息显示为沙箱 正在创建中。

旗帜 表示此沙盒是所有 CLI 命令的默认组织。如果您正在使用 多个组织,并且您不希望此组织成为默认值,请排除此标志。–set-default

直接 定义所需的沙盒选项,或覆盖沙盒定义中定义的值 文件,则在命令上指定适当的标志 线。

sf org create sandbox --name FullSbx --license-type=Full --target-org prodOrg --alias MyFullSandbox --wait 30

提示

由于沙盒是在队列中处理的,因此沙盒创建过程可能需要 比默认等待时间 6 分钟长。我们建议将较大的值设置为 ,例如 30 分钟。–wait

创作多长时间 流程需要取决于生产组织的规模和复杂性。您会看到状态消息 发布到 输出:

Sandbox Create... ⣾ 00:28:00 until timeout. 26%
 Field         Value                        
 ───────────── ──────────────────────────── 
 Id            0GR1Q888800HORuWAO           
 SandboxName   dev11                        
 Status        Processing                   
 LicenseType   DEVELOPER                    
 SandboxInfoId 0GQ1Q000009999mWAO           
 Created Date  2023-10-17T21:42:49.000+0000 
 CopyProgress  26%                          
 SandboxOrg    00DP0099993zEZj              
---------------------
Sandbox Create Stages
✓ - Pending
… - Processing
… - Activating
… - Authenticating

等待期结束后,您可以执行命令查看沙箱创建过程的状态。如果沙盒是 在等待时间内创建,Salesforce CLI 会自动在沙盒中进行身份验证。和 沙盒将显示在命令的输出中。 团队成员可以通过运行命令并提供其用户名和密码来向沙盒进行身份验证。org resume sandboxorg listorg web login

sf org web login --instance-url https://test.salesforce.com

克隆沙盒

您可以通过克隆现有沙盒来创建沙盒,而不是使用生产组织 作为您的来源。您可以通过使用一组数据和元数据自定义沙盒来节省时间,并且 然后复制它。使用 标志指定 现有沙箱名称和标志更改为 新的沙盒。这两个沙箱都必须与指定的生产组织相关联,该组织必须 包含沙盒许可证。(标志)。–clone–name–target-org

沙盒克隆简化了 应用程序生命周期。您可以为每种类型的工作设置沙盒,例如开发、 测试和暂存。您的同事可以轻松克隆单个沙盒,而不是共享 一个沙盒,踩着对方的脚趾。

sf org create sandbox --clone ExistingSandbox --name NewClonedSandbox --target-org prodOrg --alias MyDevSandbox --set-default --wait 30

提示

由于沙盒是在队列中处理的,因此沙盒克隆过程可以 花费的时间比默认的 6 分钟等待时间长。我们建议将较大的值设置为 ,例如 30 分钟。–wait

等待期结束后,您可以执行命令查看沙箱克隆过程的状态。如果沙盒是 在等待时间内克隆后,CLI 会自动在沙盒中进行身份验证。而 沙盒将显示在命令的输出中。团队 成员可以通过运行命令并提供其用户名和密码来对沙盒进行身份验证。org resume sandboxorg listorg web login

sf org web login --instance-url https://test.salesforce.com

检查沙盒状态

创建或克隆沙盒可能需要多次 纪要。如果命令超时,它会显示一个作业 ID,您可以将该 ID 传递给命令以报告创建或克隆 地位。当沙盒准备就绪时,此命令还会向 沙盒。org resume sandbox

sf org resume sandbox --job-id 0GR1888880000HORuWAO --target-org prodOrg

如果命令超时,则 未设置别名。但是,您可以使用以下命令进行设置:org create sandboxalias set

sf alias set MyDevSandbox username@company.com.dev1

打开沙盒

沙盒准备就绪后,您可以通过指定其用户名或别名来打开它。但是,您 不必提供其密码,因为 CLI 会管理 你。

sf org open --target-org MyDevSandbox

删除沙盒

您可以使用 Salesforce CLI 删除沙盒,无论 您在本地创建了它,或者记录了它 使用命令添加到现有沙箱中。您必须 之前还登录过包含沙盒许可证的生产组织。org create sandboxorg login

sf org delete sandbox --target-org MyDevSandbox

下一个:

  • 将元数据从沙盒检索到本地 DX 项目。
  • 直接在沙盒中进行开发,然后检索对本地 DX 的更改 项目。
  • 将本地更改部署到沙盒。

跟踪项目和组织之间的更改

使用源跟踪来跟踪本地项目与临时组织之间的更改,或者 创建、更新或删除源代码时的沙盒。

源跟踪对组织没有直接影响;它仅影响您的本地环境。 具体而言,Salesforce CLI 会检查本地配置文件以确定您是否具有 为特定组织启用源跟踪。如果有,则源跟踪操作是 在处理组织时执行,例如使用命令。project deploy start

不带标志的命令 在本地项目和目标组织之间部署或检索所有更改的源。查看更多 精细控制,使用标志指定特定的元数据组件、包目录或 要部署或检索的清单文件。此示例检索 Apex 类:project deploy|retrieve startMyFabClass

sf project retrieve start --metadata ApexClass:MyFabClass

除了列出您所做的更改外,源跟踪还可以:

  • 自动跟踪对元数据组件的更改,使您免于跟踪它们 手动地。
  • 查看其他开发人员部署到沙盒的更改。
  • 部署或检索更改的源。
  • 识别并解决本地项目与临时组织或沙盒之间的冲突 在部署或检索源之前。

要查看哪些元数据组件支持源跟踪,请查看 元数据覆盖率报告。

  • 管理组织的
    源跟踪 仅当目标组织允许时,源跟踪才有效。不用担心,您仍然可以在组织之间部署或检索元数据,而无需进行源跟踪。但是这些命令不会检查冲突,您必须使用适当的标志(如 或 )准确指定要部署或检索的内容。–source-dir–metadata
  • 预览源跟踪
    标识的更改 要查看本地项目与目标组织之间的更改,请导航到要查看其更改的项目目录。然后运行其中一个预览命令,该命令显示项目中可部署到组织的本地更改,或可检索的组织更改。
  • 部署和检索源跟踪
    标识的更改 创建 Salesforce 应用程序时,通常同时使用低代码和专业代码技术。低代码的一个示例是使用 Setup 直接在组织中创建自定义对象。pro-code 的一个示例是使用 IDE(如 VS Code)在本地项目中创建 Apex 类。在您工作时,源跟踪会识别更改,以便您可以使组织中的远程元数据与本地项目中的源保持同步。
  • 解决本地项目与组织
    之间的冲突 最佳做法是,如果本地项目或组织中的组件存在冲突,请在继续操作之前解决这些冲突。您可以手动解决冲突,也可以用组件的一个版本覆盖另一个版本。仅当您确定新版本是要使用的版本时,才覆盖更改。
  • 通过查询 SourceMember 对象获取更改信息 若要了解有关开发人员组织中源跟踪更改的更多信息,请查询 SourceMember Tooling API 对象
    ,以了解进行了哪些更改以及谁进行了更改。Salesforce CLI 使用 SourceMember 对象来查看组织中的更改,作为其源跟踪功能的一部分。
  • 最佳做法 遵循这些最佳做法
    ,充分利用源跟踪。
  • 源跟踪的性能注意事项 源跟踪执行额外的功能来确定对源跟踪
    组件的更改,例如运行更多查询和等待 SourceMember 工具 API 对象在部署后更新。因此,在处理大中型项目时,某些命令可能需要更长的时间才能运行。如果您正在处理小型项目,您不会注意到任何速度变慢。

管理组织的源跟踪

源跟踪仅在目标组织允许的情况下才起作用。别担心,你仍然可以 在不进行源跟踪的情况下将元数据部署到组织或从组织检索元数据。但是命令 不要检查冲突,并且必须准确指定要部署或检索的内容 使用适当的标志,例如 或 .

–source-dir–metadata

支持源跟踪的组织版本

  • Developer Edition 组织、生产组织、部分复制沙箱和完整 沙盒 – 不支持源跟踪。
  • Developer 和 Developer Pro 沙盒 – 在以下情况下支持源跟踪 其关联的生产组织已启用源跟踪。
  • 临时组织 – 始终支持来源追踪。

管理新组织中的源跟踪

Scratch Orgs 有源代码 默认情况下启用跟踪。对于 Developer 和 Developer Pro 沙盒,源 默认情况下,只要其关联的生产组织具有 已启用源跟踪。

在以下情况下,您可以选择退出来源跟踪 通过指定命令的标志来创建临时组织或沙箱。此标志仅影响您的本地 配置,而不是组织本身。Salesforce CLI 将本地配置选项设置为 向组织提供授权信息。如果您注销组织,然后重新登录 同样,默认情况下会再次启用源跟踪。–no-track-sourceorg create scratch|sandboxtrackSource: false

以下是创建 具有源代码跟踪功能的 Scratch 组织 禁用。

sf org create scratch --target-dev-hub=MyHub --definition-file config/project-scratch-def.json --no-track-source

这是 沙盒 例。

sf org create sandbox --definition-file config/dev-sandbox-def.json --target-org prodOrg --no-track-source

管理现有组织中的源跟踪

您可以使用以下方式更改现有临时组织或沙盒是否允许源跟踪 这两个命令:

  • org enable tracking:允许 Salesforce CLI 以跟踪项目与组织之间源文件中的更改。
  • org disable tracking:阻止 Salesforce CLI 从跟踪项目和 组织。

此示例说明如何在具有别名的组织中启用源跟踪;如果组织 不支持跟踪,例如完整沙盒。mySandbox

sf org enable tracking --target-org mySandbox

假设您有一个用于集成测试的沙盒,并且您希望 将源部署到它,但不要等待跟踪操作。此示例演示如何 在具有别名的组织上禁用源跟踪:mySandbox

sf org disable tracking --target-org mySandbox

预览源跟踪标识的更改

要查看本地项目与目标组织之间的更改,请导航到项目 要查看其更改的目录。然后运行其中一个预览命令,该命令显示 项目中可以部署到组织的本地更改,也可以是组织更改 可以检索。

  1. 在终端或命令窗口中,导航到项目目录。在此示例中, 目录名为 MyProject。cd /Users/joe/dx-projects/MyProject
  2. 若要查看项目和组织之间的更改,请运行项目部署预览版项目 检索预览命令。包括 —target-org 标志以指定临时组织或沙箱的用户名或别名 要与本地项目进行比较。在此示例中,该命令显示 可以使用别名 DevSandbox 部署到沙盒的本地更改。sf project deploy preview --target-org DevSandbox同样,此示例显示沙盒中可检索的远程更改 返回到本地项目。sf project retrieve preview --target-org DevSandbox该命令接受 、 、 和标志,您可以使用它们来预览更多内容 精细部署。此示例仅预览元数据的部署:project deploy preview–metadata–source-dir–manifestApexClasssf project deploy preview --metadata ApexClass --target-org DevSandbox

此示例输出显示 对 Apex 类进行了局部更改,并且 WidgetObject__c可以部署到组织的自定义对象。project deploy previewWidgetClass

sf project deploy preview --target-org DevSandbox

No conflicts found.

No files will be deleted.

Will Deploy [2] files.
 Type         Fullname        Path                                                                           
 ──────────── ─────────────── ────────────────────────────────────────────────────────────────────────────── 
 ApexClass    WidgetClass     force-app/main/default/classes/WidgetClass.cls-meta.xml                        
 CustomObject WidgetObject__c force-app/main/default/objects/WidgetObject__c/WidgetObject__c.object-meta.xml 

No files were ignored. Update your .forceignore file if you want to ignore certain files.

此示例输出显示 对 Apex 类进行了远程更改,并且 GizmoObject__c可以从组织检索到本地的自定义对象(及其布局) 项目。输出还显示项目和组织之间没有冲突。project retrieve previewGizmoClass

sf project retrieve preview --target-org DevSandbox

No conflicts found.

No files will be deleted.

Will Retrieve [3] files.
 Type         Fullname                          Path 
 ──────────── ───────────────────────────────── ──── 
 Layout       GizmoObject__c-GizmoObject Layout      
 CustomObject GizmoObject__c                         
 ApexClass    GizmoClass                             

Ignored [2] files. These files won't retrieve because they're ignored by your .forceignore file.
 Type    Fullname                            Path 
 ─────── ─────────────────────────────────── ──── 
 Profile Admin                                    
 Profile B2B Reordering Portal Buyer Profile

预览命令使用包含三列的更改信息表:Type、Fullname 和 路径。每行代表一个更改。

  • Type 是已更改组件的元数据类型。它描述了组件的内容 是,例如 Apex 类或自定义对象。
  • Fullname 是组件的 API 名称。
  • 路径是组件在本地项目中的位置。如果为空,则 组件在本地项目中不存在。当空白时,通常意味着组件是 存在于组织中,但不存在于本地项目中。

如果源跟踪未检测到任何更改,则预览命令将返回一条语句 谚语。No results found

=== Source Status
No results found

在本地项目和组织中预览源中的更改后,即可 部署或检索并解决潜在冲突。

部署和检索源跟踪标识的更改

创建 Salesforce 应用程序时,通常同时使用低代码和专业代码 技术。低代码的一个示例是使用 Setup 直接在组织中创建自定义对象。 pro-code 的一个示例是使用 IDE(如 VS)在本地项目中创建 Apex 类 法典。在您工作时,源跟踪会识别更改,以便您可以将远程元数据保留在 组织与本地项目中的源同步。

该过程是迭代的。首先,预览远程和本地更改。如果存在冲突, 你解决它们。现在,您必须确保这些更改同时存在于组织和本地 项目。因此,您可以检索到本地项目的远程更改,然后将它们推送到 源代码管理存储库,以确保源代码管理系统包含所有更改 并且是历史真相的源泉。将本地更改(如 Apex 代码)部署到 组织,以便您可以验证和测试它。你不断迭代这个过程,直到你 完成 Salesforce 应用程序的开发。

要了解源跟踪的实际效果,让我们看一些示例。

假设您运行并看到远程 变化。project retrieve preview

sf project retrieve preview --target-org DevSandbox

No conflicts found.

No files will be deleted.

Will Retrieve [3] files.
 Type         Fullname                          Path 
 ──────────── ───────────────────────────────── ──── 
 Layout       GizmoObject__c-GizmoObject Layout      
 CustomObject GizmoObject__c                         
 ApexClass    GizmoClass                             

Ignored [2] files. These files won't retrieve because they're ignored by your .forceignore file.
 Type    Fullname                            Path 
 ─────── ─────────────────────────────────── ──── 
 Profile Admin                                    
 Profile B2B Reordering Portal Buyer Profile

使用命令将组织中的更改检索到本地项目。现在组件已在本地创建, “路径”列具有一个值,它包含默认包目录。project retrieve start

sf project retrieve start --target-org DevSandbox
Preparing retrieve request... ⣟ Sending request to org
Preparing retrieve request... Succeeded

Retrieved Source
=========================================================================================================================================
| State   Name                              Type         Path                                                                             
| ─────── ───────────────────────────────── ──────────── ──────────────────────────────────────────────────────────────────────────────── 
| Created GizmoClass                        ApexClass    force-app/main/default/classes/GizmoClass.cls                                    
| Created GizmoClass                        ApexClass    force-app/main/default/classes/GizmoClass.cls-meta.xml                           
| Created GizmoObject__c                    CustomObject force-app/main/default/objects/GizmoObject__c/GizmoObject__c.object-meta.xml     
| Created GizmoObject__c-GizmoObject Layout Layout       force-app/main/default/layouts/GizmoObject__c-GizmoObject Layout.layout-meta.xml

检索源后,再次运行。现在,源跟踪报告没有可检索的内容。project retrieve preview

sf project retrieve preview 

No conflicts found.

No files will be deleted.

No files will be retrieved.

Ignored [2] files. These files won't retrieve because they're ignored by your .forceignore file.
 Type    Fullname                            Path 
 ─────── ─────────────────────────────────── ──── 
 Profile Admin                                    
 Profile B2B Reordering Portal Buyer Profile

现在让我们看一下部署。要预览本地更改,请运行 。project deploy preview

sf project deploy preview --target-org DevSandbox

No conflicts found.

No files will be deleted.

Will Deploy [2] files.
 Type         Fullname        Path                                                                           
 ──────────── ─────────────── ────────────────────────────────────────────────────────────────────────────── 
 ApexClass    WidgetClass     force-app/main/default/classes/WidgetClass.cls-meta.xml                        
 CustomObject WidgetObject__c force-app/main/default/objects/WidgetObject__c/WidgetObject__c.object-meta.xml 

No files were ignored. Update your .forceignore file if you want to ignore certain files.

然后部署本地更改。部署到沙盒后,其他使用 沙盒可以看到您的更改。

sf project deploy start --target-org DevSandbox
Deploying v59.0 metadata to test-ikspctiorkzs@example.com using the v59.0 SOAP API.
Deploy ID: 0Af8D00000pNmKySAK
Status: Succeeded | ████████████████████████████████████████ | 2/2 Components (Errors:0) | 0/0 Tests (Errors:0)

Deployed Source
=====================================================================================================================
| State   Name            Type         Path                                                                           
| ─────── ─────────────── ──────────── ────────────────────────────────────────────────────────────────────────────── 
| Created WidgetClass     ApexClass    force-app/main/default/classes/WidgetClass.cls                                 
| Created WidgetClass     ApexClass    force-app/main/default/classes/WidgetClass.cls-meta.xml                        
| Created WidgetObject__c CustomObject force-app/main/default/objects/WidgetObject__c/WidgetObject__c.object-meta.xml

再次运行。project deploy preview

sf project deploy preview

No conflicts found.

No files will be deleted.

No files will be deployed.

No files were ignored. Update your .forceignore file if you want to ignore certain files.

该命令报告没有要部署的内容,指示您的本地项目和组织 是同步的。

  • 使用源跟踪检索对配置文件的更改 检索配置文件的行为与源跟踪
    略有不同。

使用源跟踪检索对配置文件的更改

检索配置文件的行为与源跟踪略有不同。

重要

通常,我们建议您使用权限集而不是 配置 文件。配置文件在组织之间不一致,检索到的源文件和 部署取决于组织类型、跟踪状态和操作中的其他元数据。如果 您决定继续使用配置文件,我们建议您在部署或 通过将它们添加到文件中进行检索。.forceignore

如果没有源跟踪,检索配置文件只会返回一些配置文件信息。 检索配置文件将返回与指定其他项目相关的配置文件的相关信息 在文件中。package.xml

例如,使用此文件检索配置文件将返回帐户上MyCustomField__c自定义字段的配置文件权限 对象。package.xml

<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
 <types>
  <members>Account.MyCustomField__c</members>
  <name>CustomField</name>
 </types>
 <types>
  <members>*</members>
  <name>Profile</name>
 </types>
 <version>50.0</version>
</Package>

通过源跟踪,检索配置文件会返回与任何内容相关的配置文件信息 文件中指定的 else 加上 any 通过源跟踪跟踪组件。这包括更改的任何实体 存在于本地项目和组织之间。package.xml

例如,假设您在 Opportunity 对象上创建了一个名为 OppCustomField__c 的自定义字段 在本地环境中。源跟踪检测到更改并报告它。现在您检索 配置文件使用与以下情况相同的文件 源跟踪已关闭。package.xml

<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
 <types>
  <members>Account.MyCustomField__c</members>
  <name>CustomField</name>
 </types>
 <types>
  <members>*</members>
  <name>Profile</name>
 </types>
 <version>50.0</version>
</Package>

即使文件没有引用 OppCustomField__c,由于源跟踪正在跟踪新的自定义字段,因此您的检索 返回 Account 对象上MyCustomField__c自定义字段的配置文件权限 以及 Opportunity 对象上的OppCustomField__c。package.xml

有关检索配置文件的详细信息,请参阅元数据 API 中的配置文件元数据类型 开发人员指南。

注意

尽管源检索不包括文件,但检索请求会返回与 源跟踪。package.xml

解决本地项目与组织之间的冲突

最佳做法是,如果本地项目或 组织,在继续前进之前解决它们。您可以手动解决冲突,也可以覆盖冲突 一个组件的版本与另一个组件。仅当您确定新的 version 是您要使用的版本。

假设你跑步并看到冲突 本地项目与组织中的更改。例如,此命令输出显示具有冲突的更改,但已准备好部署。project deploy previewWidgetClassGizmoClass

sf project deploy preview --target-org DevSandbox

Conflicts [1]. Run the command with the --ignore-conflicts flag to override.
 Type      Fullname    Path                                                    
 ───────── ─────────── ─────────────────────────────────────────────────────── 
 ApexClass WidgetClass force-app/main/default/classes/WidgetClass.cls-meta.xml 

No files will be deleted.

Will Deploy [1] files.
 Type      Fullname   Path                                                   
 ───────── ────────── ────────────────────────────────────────────────────── 
 ApexClass GizmoClass force-app/main/default/classes/GizmoClass.cls-meta.xml 

No files were ignored. Update your .forceignore file if you want to ignore certain files.

如果您尝试实际部署源,Salesforce CLI 会再次报告冲突并停止 完成时的操作。运行 时会看到类似的冲突消息。若要成功部署或检索,请执行以下操作: 首先解决冲突,然后用 已解析的文件。让我们看看这是如何工作的。project retrieve preview

覆盖冲突的更改

如果您确定本地版本是正确的,请覆盖 组织,在以下情况下包含标志 部署。在我们的例子中,因为只有 冲突的更改,让我们首先部署该组件以消除冲突和 然后稍后部署无冲突的源。–ignore-conflictsWidgetClass

sf project deploy start --metadata ApexClass:WidgetClass --ignore-conflicts --target-org DevSandbox

DevSandbox 组织现在具有与本地项目中相同的版本。再次运行时,看不到任何冲突的更改 消息。WidgetClassproject deploy preview

但是,如果您确定组织中的版本是正确的,则通过以下方式覆盖本地副本 检索 DevSandbox 组织版本,同时忽略冲突。WidgetClass

sf project retrieve start --metadata ApexClass:WidgetClass --ignore-conflicts --target-org DevSandbox

您的本地项目现在具有与组织中相同的版本。WidgetClass

干得好,你解决了冲突!现在,无需任何特殊标志即可运行,以完成部署和任何其他新的本地源。project deploy startGizmoClass

sf project deploy start --target-org DevSandbox
Deploying v59.0 metadata to test-ikspctiorkzs@example.com using the v59.0 SOAP API.
Deploy ID: 0Af8D00000pNtEUSA0
Status: Succeeded | ████████████████████████████████████████ | 1/1 Components (Errors:0) | 0/0 Tests (Errors:0)

Deployed Source
=====================================================================================
| State   Name       Type      Path                                                   
| ─────── ────────── ───────── ────────────────────────────────────────────────────── 
| Created GizmoClass ApexClass force-app/main/default/classes/GizmoClass.cls          
| Created GizmoClass ApexClass force-app/main/default/classes/GizmoClass.cls-meta.xml

通过查询 SourceMember 对象获取更改信息

若要详细了解开发人员组织中的源跟踪更改,请查询 SourceMember 工具 API 对象,用于找出进行了哪些更改以及谁进行了更改。Salesforce CLI 使用 SourceMember 对象,以查看组织中作为其源跟踪的一部分所做的更改 功能性。

例如,通过运行类似 这。在此示例中,DevSandbox 是沙盒的用户名或别名。

sf data query --query "SELECT MemberName, MemberType, ChangedBy, RevisionCounter FROM SourceMember" --use-tooling-api --target-org DevSandbox

该查询返回元数据组件的列表。CHANGEDBY 列返回 上次更改组件的人员。REVISIONCOUNTER 列返回组件的 修订号。Salesforce 使用修订计数器来确定哪些实体在 组织。

MEMBERNAME                   MEMBERTYPE    CHANGEDBY        REVISIONCOUNTER
───────────────────────────  ────────────  ───────────────  ───────────────
Account.MyTextField__c       CustomField   0056g000000FDuZ  1
Contact.MyField__c           CustomField   0056g000000FDuZ  11
Admin                        Profile       0051k000002KW4R  54
MyObj1__c-MyObj1 Layout      Layout        0051k000002KW4R  55
Account-Account Layout       Layout        0056g000000FDuZ  33
Contact-Contact Layout       Layout        0056g000000FDuZ  45
MyObj1__c                    CustomObject  0051k000002KW4R  57
TVRemoteControl              ApexClass     0056g000000FDuZ  53

您可以使用此输出来运行其他有用的查询。例如,要获取 上次更改 Apex 类的人,运行 此查询将 ID 从 CHANGEDBY 映射到用户名:TVRemoteControl

sf data query --query "SELECT Id,Username,Name FROM User WHERE Id = '0056g000000FDuZ'" --target-org DevSandbox

结果类似于:

ID                  USERNAME                   NAME
──────────────────  ────────────────────────   ────────────
0056g000000FDuZQAS  dev2@example.com.devsb1    Dev2

可以使用 SourceMember 对象来解决问题。例如,假设您更改 组织中的元数据,但更改未显示在 OR 中。检查 SourceMember 的字段是否记录了该字段 元数据组件正在正确递增。project retrieve previewproject retrieve startRevisionCounter

另一个用例是将源跟踪重置回特定的修订号。

sf project reset tracking --revision 30 --target-org DevSandbox

警告

命令 删除或覆盖所有现有的源跟踪文件。使用时要格外小心。project reset tracking

最佳实践

遵循这些最佳实践,充分利用源跟踪。

在将更改部署到 沙盒

这种做法可帮助其他开发人员合并您的更改并促进 协作。

使用 Git 等版本控制系统查看元数据更改历史记录

使用版本控制系统,您可以对更改进行版本控制、跟踪更改历史记录以及 在升级到其他环境(如沙盒)之前查看元数据更改。

让源跟踪文件恢复同步

如果源跟踪感到困惑并开始报告不准确,您可以使用这些命令恢复同步。 使用哪个命令取决于您最信任的源:如果您信任本地源文件,并且信任 组织。对于任一命令,请指定标志。有关详细信息和示例,请参阅解决本地项目与组织之间的冲突。project deploy|retrieve startproject deploy startproject retrieve start–ignore-conflicts

源跟踪的性能注意事项

源跟踪执行额外的功能来确定对跟踪源的更改 组件,例如运行更多查询并等待 SourceMember Tooling API 对象 部署后更新。因此,某些命令在使用 大中型项目。如果你正在处理小项目,你不会注意到任何 减速。

中型项目具有 30 个或更多组件或 50 个或更多测试。一个有 25 个的项目 组件和 51 项测试被认为是中等的。

大型项目需要 600 个或更多组件或 150 个或更多测试。一个有 610 的项目 组件和 140 次测试被认为是大型的。

如果遇到长时间运行的命令,请将项目分解为较小的命令集 组件,并部署较小的集合。

您还可以在创建临时组织或沙盒时选择退出源跟踪,方法是指定 命令的标志。有关用例,请参阅源跟踪。–no-track-sourceorg create scratch|sandbox

如果在 DevOps Center 中创建临时组织或沙盒以用作开发环境, 不要禁用源跟踪。