zoukankan      html  css  js  c++  java
  • Salesforce学习之路(八)一次拉取多个文件或全部文件至本地

    在开发中,经常会遇到本地工程错乱或者误操作导致本地本地项目被删除,此时利用SFDX: Retrieve Source from Org只会拉取新建并且名称相同的组件,若通过创建一个个文件,然后再拉取的方式,不免显得过于笨拙。

    本人便踩过这个坑,这里分享一下个人的解决方案。


    在我看来,从Org中一次拉取多个组件文件或者全部组件文件,有三种解决方案,下面一一叙述:

    1. 利用manifest新建工程

    1)打开Vs Code,进入命令行模式(shift+cmmand+p/F1), SFDX: Create Project with Manifest

    直接创建标准模式即可,当然可根据自身实际选择。这里直接创建工程:sample

    在sample/manifest目录下,可发现名为package.xml的文件,标准内容如下:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <Package xmlns="http://soap.sforce.com/2006/04/metadata">
        <types>
            <members>*</members>
            <name>ApexClass</name>
        </types>
        <types>
            <members>*</members>
            <name>ApexComponent</name>
        </types>
        <types>
            <members>*</members>
            <name>ApexPage</name>
        </types>
        <types>
            <members>*</members>
            <name>ApexTestSuite</name>
        </types>
        <types>
            <members>*</members>
            <name>ApexTrigger</name>
        </types>
        <types>
            <members>*</members>
            <name>AuraDefinitionBundle</name>
        </types>
        <types>
            <members>*</members>
            <name>LightningComponentBundle</name>
        </types>
        <types>
            <members>*</members>
            <name>StaticResource</name>
        </types>
        <version>47.0</version>
    </Package>

    从packge.xml文件中可以看出,主要分为一下标准类型:

    • ApexClass: Apex类文件
    • ApexComponent: Apex组件
    • ApexPage: Visualforce组件
    • ApexTestSuite: Apex测试类
    • ApexTrigger: Apex的触发问价
    • AuraDefinitionBundle: Apex的自定义Aura组件
    • LightningCompentBundle: Apex的自定义LWC组件
    • StaticResource: 项目中的静态文件

    2)认证Org并设置为默认Org

    # 认证Org
    SFDX: Authorize an Org
    # 设置默认Org
    SFDX: Set a Default Org

    查看Org列表

    [kaiwu3@localhost:~/sample]$sfdx force:org:list
    === Orgs
         ALIAS         USERNAME                  ORG ID              CONNECTED STATUS
    ───  ────────────  ────────────────────────  ──────────────────  ────────────────
    (U)  k_Reset       kaiwu3@*****.com          00D2v000001Xk5DEAS  Connected
    
    No active scratch orgs found. Specify --all to see all scratch orgs

    3) 利用pacakge.xml拉取文件

    右击sample/manifest/pacakge.xml,选择SFDX: Retrieve Source in Manifest from Org

    19:55:16.740 sfdx force:source:retrieve --manifest /Users/kaiwu3/Works/Code/sfdcTmp/sample/manifest/package.xml
    === Retrieved Source
    FULL NAME                                                                 TYPE                      PROJECT PATH
    ────────────────────────────────────────────────────────────────────────  ────────────────────────  ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
    heatmapmock                                                               StaticResource            force-app/main/default/staticresources/heatmapmock.resource-meta.xml
    heatmapmock                                                               StaticResource            force-app/main/default/staticresources/heatmapmock.js
    heatmap                                                                   StaticResource            force-app/main/default/staticresources/heatmap.resource-meta.xml
    heatmap                                                                   StaticResource            force-app/main/default/staticresources/heatmap.js
    ......

    此时,你会发现package.xml中定义的标准组件,都已经成功拉到本地工程。

    2. 利用Package Manage方式自由拉取文件

    1) Org中创建Package包

    上述manifest方式拉取的文件,仅限于创建工程是自动生成的package.xml中定义的几种类型,有时并不能满足我们的需求(比如Org迁移或者备份,此时不仅需要上述的组件文件,还需要保留在Org中创建的Object等信息)。此时,你会发现Package Manager可以满足你的一切需求。

    在Org中,【Setup】-->【Package Manager】-->【new】

    点击Add按钮,添加所需组件。

    返回Package Maneger界面可见Package列表存在sample的包。

    2)本地工程下载smaple包

    [kaiwu3@localhost:~/Works/Code/sfdcTmp/sample]$mkdir pacakge
    # 下载包命令:sfdx force:mdapi:retrieve -s -r {{pathToCreatePackageFile}} -u {{sandboxUsername}} -p {{packageName}}
    [kaiwu3@localhost:~/Works/Code/sfdcTmp/sample]$sfdx force:mdapi:retrieve -s -r package/ -u kaiwu3@*****.com -p sample
    Retrieving source...
    
    === Status
    Status:  InProgress
    jobid:  09S2v000006nL64EAE
    
    
    === Result
    Status:  Succeeded
    jobid:  09S2v000006nL64EAE
    
    # 产生的zip包路径
    Wrote retrieve zip to /Users/kaiwu3/Works/Code/sfdcTmp/sample/package/unpackaged.zip.

    3)转换package为工程文件

    # 解压下载包(下载包一般命名为:unpacakge.zip)
    [kaiwu3@localhost:~/sfdcTmp/sample/package]$unzip unpackaged.zip 
    Archive:  unpackaged.zip
      inflating: staticresources/leaflet1.resource  
      inflating: staticresources/leaflet1.resource-meta.xml  
      inflating: aura/SmartLocks/SmartLocks.css  
      inflating: aura/SmartLocks/SmartLocksHelper.js  
      inflating: aura/SmartLocks/SmartLocksController.js  
      inflating: aura/SmartHome/SmartHome.css  
      inflating: aura/SmartHome/SmartHomeController.js  
    ......
      inflating: package.xml 
    
    # 将解压文件转换匹配到对应工程中
    # 转换命令:sfdx force:mdapi:convert -r {pacakge.xml所在目录}
    [kaiwu3@localhost:~/Works/Code/sfdcTmp/sample]$sfdx force:mdapi:convert -r package/
    === Converted Source
    STATE  FULL NAME                                                TYPE               PROJECT PATH
    ─────  ───────────────────────────────────────────────────────  ─────────────────  ────────────────────────────────────────────────────────────────────────────────────────────────────────────
    Add    CCTG                                                     CustomApplication  force-app/main/default/applications/CCTG.app-meta.xml
    Add    Company__c-Company Layout                                Layout             force-app/main/default/layouts/Company__c-Company Layout.layout-meta.xml
    Add    Employee__c-Employee Layout                              Layout             force-app/main/default/layouts/Employee__c-Employee Layout.layout-meta.xml
    ......

    细心的同学应该发现了,package manager方式中也存在package.xml文件,区别在哪呢?

    <?xml version="1.0" encoding="UTF-8"?>
    <Package xmlns="http://soap.sforce.com/2006/04/metadata">
        <fullName>sample</fullName>
        <!--类型:ApexClass,成员:sample中自定义添加的-->
        <types>
            <members>BotController</members>
            ...
            <name>ApexClass</name>
        </types>
        <!--类型:触发器,成员:sample包中自定义选择-->
        <types>
            <members>PairContactToAccount</members>
            <members>PushNotificationTrigger</members>
            ...
            <name>ApexTrigger</name>
        </types>
        <!--类型:Aura组件,成员:sample包中自定义选择-->
        <types>
            <members>Map</members>
            <members>MapCard</members>
            ...
            <name>AuraDefinitionBundle</name>
        </types>
        <!--类型:自定义应用,成员:sample包中自定义选择-->
        <types>
            <members>CCTG</members>
            ...
            <name>CustomApplication</name>
        </types>
       <!--类型:自定义字段,成员:sample包中自定义选择-->
        <types>
            <members>Command__c.Active__c</members>
            ...
            <name>CustomField</name>
        </types>
        <!--类型:自定义对象,成员:sample包中自定义选择-->
        <types>
            <members>Command__c</members>
            ...
            <name>CustomObject</name>
        </types>
        <!--类型:自定义导航,成员:sample包中自定义选择-->
        <types>
            <members>Account__c</members>
            ...
            <name>CustomTab</name>
        </types>
        <!--类型:Layout,成员:sample包中自定义选择-->
        <types>
            <members>Bot_Command__c-Bot Action Layout</members>
            ...
            <name>Layout</name>
        </types>
        ...
        <!--类型:RecordType,成员:sample包中自定义选择-->
        <types>
            <members>Account__c.DemoChart</members>
            ...
            <name>RecordType</name>
        </types>
        <!--类型:静态文件, 成员:sample包中自定义选择-->
        <types>
            <members>leaflet1</members>
            <name>StaticResource</name>
        </types>
        <types>
            <members>Account__c.Open_Report</members>
            <name>WebLink</name>
        </types>
        <version>47.0</version>
    </Package>

    而在manifest中,类型仅有上述几种,并且成员为所有。

    3. 利用Scratch Org全部拉取

    1)创建Scratch Org

    # 创建scratch Org
    # 注意,如果没有权限,需进入Org,enable Dev Hub
    # 这里使设置有效期为3天
    [kaiwu3@localhost:~/smaple/config]$sfdx force:org:create -f project-scratch-def.json -d 3
    Successfully created scratch org: 00D9D0000000St7UAE, username: test-l5cwqegykwud@example.comsfdx force:org:create -f project-scratch-def.json -d 3
    
    # 将scratch Org设置为默认Org
    [kaiwu3@localhost:~/sample/config]$sfdx force:config:set defaultusername=test-l5cwqegykwud@example.com
    === Set Config
    NAME             VALUE
    ───────────────  ─────────────────────────────
    defaultusername  test-l5cwqegykwud@example.com
    
    # 查看Org列表
    [kaiwu3@localhost:~/Works/Code/test/config]$sfdx force:org:list
    === Orgs
         ALIAS  USERNAME          ORG ID              CONNECTED STATUS
    ───  ─────  ────────────────  ──────────────────  ────────────────
    (D)  k_Reset kaiwu3@*****.com  00D2v000001Xk5DEAS  Connected
    
         ALIAS  SCRATCH ORG NAME  USERNAME                       ORG ID              EXPIRATION DATE
    ───  ─────  ────────────────  ─────────────────────────────  ──────────────────  ───────────────
    (U)          kaiwu3 Company    test-l5cwqegykwud@example.com  00D9D0000000St7UAE  2019-11-21

    2)全量拉取数据

    # 权量拉取命令:sfdx force:source:pull -u {username}
    [kaiwu3@localhost:~/sample]$sfdx force:source:pull -u test-l5cwqegykwud@example.com
    === Pulled Source
    ...

    在切换Org即可。

    作者:吴家二少

    博客地址:https://www.cnblogs.com/cloudman-open/

    本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

  • 相关阅读:
    我的Java学习推荐书目
    BTrace使用简介
    BTrace使用小结
    如何在生产环境使用Btrace进行调试
    BTrace : Java 线上问题排查神器
    淘宝Tprofiler工具实现分析
    JVM 性能调优实战之:使用阿里开源工具 TProfiler 在海量业务代码中精确定位性能代码
    性能工具TProfiler介绍文档
    分布式系统理论基础
    微信小程序
  • 原文地址:https://www.cnblogs.com/cloudman-open/p/11885328.html
Copyright © 2011-2022 走看看