Salesforce 之 SFDX(基礎)

Trailhead

Build Apps Together with Package Development

傳統開發流程

  1. 刷Sandbox
  2. 做開發配置
  3. 部署到UAT驗證
  4. 部署到生產環境
  5. 維護:刷Sandbox 再開發,再次重複上述過程

優點:

  1. 簡單,易操作

缺點:

  1. 沒有代碼管理機制
  2. 當多個團隊並行開發時,比較難管理

Package 模式

  1. 創建SFDX項目
  2. 創建Scratch Org
  3. 開發功能
  4. 部署到Scratch Org,驗證
  5. 創建Package,併發布
  6. 安裝到Org中並驗證
  7. 安裝到生產環境
  8. 維護:本地代碼修改,創建更新包,並安裝到Org中驗證後,安裝到生產環境

優點:

  1. 解決多團隊並行開發的衝突
  2. 基於源代碼驅動開發,有版本管理
  3. 模塊化

缺點:

  1. 學習成本
  2. 對於項目型來說,很難切割成一個個模塊

目前Salesforce大概在17/18年開始推出新的技術SFDX,跟當初出來Lightning一樣,未來SF主推的東西,隨着對VSCode SF開發插件包的完善及Lightning Web Component的出現,都需要基於SFDX爲基礎,所以在學習運用這些新技術之前,先要解決對SFDX的認識,目前我們項目的開發流程已經屬於傳統SF開發了,所以我們需要及時跟上SF的步伐.打開SFDX的大門

應用程序的開發週期流程

Scratch Org VS Sandbox

Scratch 創建後就是一個空白的,具有SF基本功能的Org. Scratch 沒有能力包含生產組織中包含的全部元數據。而且,它也不是要替換沙箱。當您開始分析要推送到臨時組織的哪些元數據片段時,請問問自己,您的特定項目是否需要所有這些源.

例如:

  • 所有定製是否都與單個應用程序或CRM的擴展相關?
  • 定製是否代表許多不同的應用程序或項目? 如果您對第二個問題回答“是”,請考慮如何將這些位分解成包。您將創建一個單獨的臨時組織來測試每個單獨的模塊。在開發生命週期的後期,您會將單獨的程序包部署到沙盒中以進行最終測試和部署。

Salesforce DX

Salesforce DX項目是元數據的本地目錄結構,在本地可以使用Salesforce DX工具進行開發和測試。

  1. 它包含用於創建臨時組織的配置文件。
  2. 它也可以包含加載到組織中進行開發或測試的數據。
  3. 它還可以進行軟件包的測試。

當您使用CLI創建新的Salesforce DX項目時,它將爲您創建項目目錄結構。 包是一組相關的代碼和自定義項。您可以獨立於組織中的其他組件來測試軟件包。您也可以獨立釋放軟件包。包中的元數據組件一次只能存在於已安裝的組織中的一個包中。 至少,項目管理一個軟件包的源。話雖這麼說,如果同時構建併發布了多個軟件包,則可以將這些軟件包組織到一個DX項目中。您的每個軟件包都與項目配置文件中定義的軟件包目錄對齊。

基於源代碼驅動模式(CI & CD)

Salesforce DX添加了可簡化整個開發生命週期的新工具。它改善了團隊開發和協作,促進了自動化測試和持續集成,並使發佈週期更加有效和敏捷。 但是Salesforce DX不僅僅是一套新工具!它提供了更集開發的替代方法,並將真實的來源從組織轉移到了版本控制系統(VCS)。它將您的開發重點從組織開發轉移到包開發。

轉換爲元數據格式進行構建

儘管軟件包開發是管理元數據中的變更的一種好方法,但我們仍然支持與當前變更集方法並行的構建和部署過程。元數據API ==mdapi:convert== 和 ==mdapi:deploy== 命令繼續處理構建和部署用例。 在項目開始時,您可以從組織中檢索元數據源並將其轉換爲源格式,然後將其存儲在VCS中。創建並測試您的應用或自定義設置後,就可以創建部署工件了。您可以從源格式轉換回元數據格式,然後所有源都準備好部署到臨時組織。您可以部署所有源,並且部署操作負責更新已更改的文件。您可以從部署中省略某些文件,並通過修改轉換過程中創建的package.xml文件來確切構造要部署的內容 。

安裝命令行界面(CLI) & VS code

  1. CLI
  2. VS code
  3. Salesforce Extension Pack

CLI 基礎命令(授權,Org管理)

  1. 歡迎頁面

    sfdx force
    

  2. 查看幫助,由於命令很多,這個很有用

    sfdx force --help
    

  3. 授權一個org,當執行這個命令時,會執行OAuth 2.0操作,打開瀏覽器跳轉到登錄界面,輸入用戶名與密碼後,授權後,CLI就會記住,下次可以通過命令直接登錄Org

    sfdx force:auth:web:login
    

    -d 配置默認org
    如果當前org不是開發中心org在創建Scratch Org會報錯 -a是 設置別名,後面都可以通過別名操作
    
    sfdx force:auth:web:login -d -a DevHub 
    
    授權Sandbox:
    sfdx force:auth:web:login -r https://test.salesforce.com -a DevSandbox
    
    
  4. 打開org

    sfdx force:org:open -u DevHub
    

  5. 查看所有org

    sfdx force:org:list
    

  6. 設置默認配置

    查看配置
    sfdx force:config:list
    
    defaultdevhubusername:爲默認的開發中心org
    defaultusername:爲默認組織(一般設置爲臨時組織,這樣在操作臨時組織時,不需要帶上org 名稱)
    
    global:表示這是全局,全局表示針對所有項目,如果是local,則表示當前項目.
    

    設置默認全局配置

    sfdx force:config:set defaultusername=XXX -g
    

    如果只是針對某個項目,需要在這個項目下去設置,不需要帶有-g

  7. 設置別名

    sfdx force:alias:set 別名=用戶名
    
  8. 刪除Org

    sfdx force:org:delete -u SFDXProject_Org
    

CLI 項目操作(創建項目,創建組件)

  1. 創建項目

     sfdx force:project:create -n SFDXProject
    

    	- config:創建scratch的配置文件
    	- force-app:應用程序(包)
    	- sfdx-project:項目配置文件
    
  2. 修改scratch的配置文件

    在settings中可以設置各功能的開啓
    {
      "orgName": "SFDXProject_Org",
      "edition": "Developer",
      "features": [],
      "settings": {
        "lightningExperienceSettings": {
            "enableS1DesktopEnabled": true
        },
        "securitySettings": {
            "passwordPolicies": {
                "enableSetPasswordInApi": true
            }
        },
        "mobileSettings": {
            "enableS1EncryptedStoragePref2": false
        }
      }
    }
    
    
  3. 創建scratch

    sfdx force:org:create -s -f config/project-scratch-def.json -a SFDXProject_Org
    

  4. 創建組件

    sfdx force:lightning:component:create -n AccountListCMP -d force-app/main/default/aura
    
    sfdx force:apex:class:create -n AccountListController -d force-app/main/default/classes
    

  5. 用VS code 打開工程

  6. 在VS Code裏構建應用

    • 打開AccountListCMP 輸入以下代碼,顯示客戶列表
    <aura:component controller="AccountListController" implements="flexipage:availableForAllPageTypes">
    
      <aura:attribute name="AccountList" type="Account[]"/>
    
      <aura:handler name="init" action="{!c.initAction}" value="{!this}"/>
    
      <lightning:layout multipleRows="true">
        <aura:iteration items="{!v.AccountList}" var="obj">
          <lightning:layoutItem size="12" smallDeviceSize="6" mediumDeviceSize="4" largeDeviceSize="3" padding="around-small">
            <lightning:card footer="" title="{!obj.Name}">
                <aura:set attribute="actions">
                    <lightning:button label="New"/>
                </aura:set>
                <p class="slds-p-horizontal_small">
                  行業:{!obj.Industry}<br/>
                  類型:{!obj.Type}<br/>
                  所有人:{!obj.Owner.Name}
                </p>
            </lightning:card>
          </lightning:layoutItem>
       </aura:iteration>
      </lightning:layout> 
    
      <aura:if isTrue="{!empty(v.AccountList)}">
        <div class="slds-scoped-notification slds-media slds-media_center slds-theme_warning" role="status">
          <div class="slds-media__figure">
            <lightning:icon iconName="utility:warning" alternativeText="Warning!" title="Warning" />
          </div>
          <div class="slds-media__body">
            <p>沒有找到記錄</p>
          </div>
        </div>
      </aura:if>
    </aura:component>	
    
    
    • JS 代碼
    ({
        initAction : function(component, event, helper) {
    
            let action = component.get("c.accountListService");
    
            action.setCallback(this, function (response) {
    
                var state = response.getState();
    
                if (component.isValid() && state === "SUCCESS") {
    
                    let ResponseBody = response.getReturnValue();
                    component.set("v.AccountList",ResponseBody);
    
                }
            })
    
            $A.enqueueAction(action);
    
        }
    })
    
    • 在apex中輸入如下代碼,查詢Account 記錄
    public with sharing class AccountListController {
        public AccountListController() {
    
        }
    
        @AuraEnabled
        public static List<Account> accountListService(){
            return [SELECT Id,Name,Owner.Name,Industry,Type  FROM Account Limit 10];
        }
    }
    
  7. 推送代碼到臨時組織中

    sfdx force:source:push
    

  8. 新建一個Lightning 應用程序 SFDX Project

  9. 新建一個應用程序頁面,當作容器,顯示該組件,將選項卡添加到SFDX Project 中,這樣SFDX Project中只有一個選項卡

  10. 創建一個權限集客戶列表分配SFDX Project這個應用程序

    將客戶列表選項卡分配給權限集

  11. 從臨時組織獲取元數據(當我們在臨時組件中調整了配置,我們需要把這部分修改,從臨時組件拉取到本地,作一個包,不僅僅只有代碼也包括配置)

    查看本地與遠程的差異
    sfdx force:source:status
    

    紅框處理是我們在臨時組織中,通過Lightning Builder 構建了一個頁面,添加了一個選項卡,同時將該選項卡添加到SFDX Project 應用程序中,創建一個權限集,並分配了SFDX Project應用程序的權限

     sfdx force:source:pull
    

    下載下來的組件如果有不需要的,可以刪除對應的文件

  12. 測試:通過創建一個新的臨時組織,且將代碼部署到新的臨時組織來驗證

    • 複製project-scratch-def.js,將OrgName 修改爲SFDXProject_Org_New
    • 通過命令快速創建

    - 將本地元數據推送到新的臨時組織

    - 設置權限集

    	sfdx force:user:permset:assign -n AccountList
    

  13. 從原臨時組織導出客戶的數據,將測試數據導入到新的臨時組織中

    	sfdx force:data:tree:export -q "SELECT Name,Industry,Type  FROM Account" -u SFDXProject_Org
    

    	sfdx force:data:tree:import --sobjecttreefiles Account.json
    

元數據與SFDX項目轉換

  1. 在項目下新建一個文件夾 mdapioutput

    mkdir mdapioutput
    
    sfdx force:source:convert -d mdapioutput/
    

    注意刪除不需要的組件,比如簡檔,不僅需要刪除元數據還要在package.xml中刪除對應的節點

  2. 部署到目標環境(Sandbox/Playground等)

    sfdx force:mdapi:deploy -d mdapioutput/ -u TP -w 100
    

    分配權限集 登錄目標環境,查看驗證

  3. 將元數據轉換成SFDX項目

    • 創建新的SFDX項目
    • 獲取元數據到本地

     ```
     mkdir mdapipackage
     //這個是獲取元數據,爲了方便這裏我們自已構造一個含有apex類的元數據包
     sfdx force:mdapi:retrieve -s -r ./mdapipackage -u xxx -w 10
     ```
    
    • 通過命令將元數據轉換成SFDX項目(本質上,只是放到對應的目錄下而已)

      sfdx force:mdapi:convert -r mdapipackage/
      

CLI 創建包

Salesforce 的應用市場App Exchange 大家並不陌生,軟件包分兩種,一種是託管包,安裝後,無法查看元數據,僅僅使用,另一種爲非託管包,安裝後,可以修改元數據,進行定製. SFDX 可以非常方便創建非託管包.

  1. 以上面的SFDX Project 爲例,通過命令,創建一個包

    sfdx force:package:create --name SFDCProject --description "我的第一個非託管包" --packagetype Unlocked --path force-app --nonamespace --targetdevhubusername DevHub
    

  2. 在VS Code中,展開文件夾,然後打開sfdx-project.json文件,這裏會記錄包的ID及信息,後面會使用到

  3. 將versionName更改爲Version 1.0,並將versionNumber更改爲1.0.0.NEXT。

  4. 創建軟件包的新版本

    * -p 是映射到程序包ID(0Ho)的程序包別名。
    * -d 是包含軟件包內容的目錄。
    * -k 是用於防止未經授權的個人安裝軟件包的安裝密鑰。
    
    sfdx force:package:version:create -p SFDCProject -d force-app -k test1234 --wait 10 -v DevHub
    

  5. 軟件包的安裝地址(通過登錄Org,打開該link應該可以安裝): https://[xxxxxx]/packaging/installPackage.apexp?p0=04t0I000000jEexQAE

  6. 通過命令安裝

    sfdx force:package:install --wait 10 --publishwait 10 --package [email protected] -k test1234 -r -u SFDXProject_Org
    

  7. 關於包這塊還有很多比如,創建包,更新包,版本管理,包的發佈等,第一代包與第二代包,有了SFDX基礎可以通過文檔進一步瞭解.

CLI 其它命令

release 包
sfdx force:package:version:promote -p [email protected] -v DevHub

打開指定的路徑的頁面
sfdx force:org:open -p lightning/n/GIFter -u MyTP

分配權限集
sfdx force:user:permset:assign -n GIFter -u MyTP

顯示Org信息
sfdx force:org:display -u SFDXProject_Org

生成Org當前用戶密碼
sfdx force:user:password:generate -u SFDXProject_Org

![](https://raw.githubusercontent.com/SunLangzi/pictures/imgs/15938472934817.jpg)
![](https://raw.githubusercontent.com/SunLangzi/pictures/imgs/15938473602965.jpg)
  1. SFDC 開發官方文檔

  2. 在山的那邊思維導圖案例

  3. 00 Introduction to SFDX

  4. 00 SFDX and module.mp4

  5. Salesforce DX 開發方式入門介紹

  6. 01 Introduction to SFDX

  7. 02 ModernDevelopment with SFDX

  8. 03 SFDX - 持續集成 and 持續交付

  9. 04 SFDX Product Manager AMA

  10. 以上視頻均引用互聯網,如有侵權聯繫後刪除.(除序號3視頻其它視頻引用SF官網)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章