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/

本文歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM