Salesforce DX
Salesforce DX (Salesforce Developer Experience) 是 Salesforce 推出的一個(gè)新的開(kāi)發(fā)和部署模式,旨在提供更好的開(kāi)發(fā)者體驗(yàn)。在 Salesforce 官網(wǎng)和 Trailhead 網(wǎng)站中都可以找到很多相關(guān)的介紹和教程。目前 Salesforce DX 的某些文檔還處于 Beta 階段。
本文將簡(jiǎn)單介紹其優(yōu)點(diǎn)和開(kāi)發(fā)流程。
Salesforce DX 的優(yōu)點(diǎn)
Salesforce DX(下面簡(jiǎn)稱(chēng)SFDX)有兩個(gè)主要優(yōu)點(diǎn):
- SFDX 符合快速迭代的開(kāi)發(fā)模式
- SFDX 提供了統(tǒng)一的命令行工具在代碼庫(kù)和服務(wù)器之間進(jìn)行通信和同步
SFDX 對(duì)快速迭代的支持
在 Salesforce DX(下面簡(jiǎn)稱(chēng)SFDX)出現(xiàn)之前,開(kāi)發(fā)者主要是通過(guò)部署不同類(lèi)型的沙盒進(jìn)行開(kāi)發(fā),如圖所示:
圖片取材于官方文檔。
這種結(jié)構(gòu)的缺陷在于沙盒環(huán)境的搭建。
在多個(gè)功能同時(shí)進(jìn)行開(kāi)發(fā)的情況下,需要同時(shí)擁有多個(gè)開(kāi)發(fā)的沙盒,即上圖的“Developer Sandbox”。這些沙盒沒(méi)法同時(shí)擁有所有已經(jīng)開(kāi)發(fā)的功能。隨著項(xiàng)目的發(fā)展,越來(lái)越多的沙盒會(huì)因?yàn)闆](méi)有特定的功能而“過(guò)時(shí)”,這就需要?jiǎng)?chuàng)建新的沙盒或刷新已有的沙盒。而這些操作需要耗費(fèi)大量的時(shí)間,對(duì)于敏捷開(kāi)發(fā)和快速迭代造成影響。
為了改進(jìn)這種缺陷,SFDX 提供了一種新的概念:Scratch org。Scratch org 是一種可以快速搭建的“沙盒”,只包含了特定的功能。開(kāi)發(fā)者可以通過(guò) SFDX 中的設(shè)置快速創(chuàng)建 Scratch org,在上面開(kāi)發(fā)新的功能,然后將所做的更改直接提取出來(lái)放到代碼庫(kù)中進(jìn)行整合。
通過(guò)這樣一種流程,之前笨重的“開(kāi)發(fā)沙盒”就被輕盈的 Scratch org 所取代,為快速迭代和持續(xù)集成提供了更好的支持。
Salesforce 命令行工具
Salesforce 隨著 SFDX 一起推出了命令行工具(下面簡(jiǎn)稱(chēng) CLI)。在此之前,開(kāi)發(fā)者一般使用官方的 Force.com IDE 或其他第三方插件(比如 MavensMate)來(lái)進(jìn)行本地代碼和服務(wù)器之間的通信。CLI 作為整合這些功能的工具而出現(xiàn)。它可以和各種代碼編輯器結(jié)合使用,包含了在開(kāi)發(fā)中需要的各種操作和命令,讓開(kāi)發(fā)者可以更方便的將本地修改上傳到各種 Scratch org 中或者將 Scratch org 中的修改同步到本地代碼庫(kù)。
SFDX 開(kāi)發(fā)過(guò)程示例
下面通過(guò)一些簡(jiǎn)單的例子來(lái)說(shuō)明 SFDX 的工作流程。
前提條件
在使用 SFDX 開(kāi)發(fā)之前,需要先完成以下幾個(gè)部分:
- 擁有一個(gè) Salesforce 環(huán)境來(lái)作為基礎(chǔ)(在 SFDX 中被稱(chēng)為“Dev Hub”)。Scratch org 就會(huì)基于它來(lái)建立
- 在第一步中的 Salesforce 環(huán)境中啟用“Dev Hub”功能??梢酝ㄟ^(guò)設(shè)置界面搜索“Dev Hub”來(lái)啟用
- 安裝 Salesforce CLI 工具
登錄“Dev Hub”環(huán)境
在進(jìn)行開(kāi)發(fā)之前,先要登錄 Dev Hub 環(huán)境。
打開(kāi)命令行,輸入命令:
sfdx force:auth:web:login -d -a ExampleDevHub
在此命令之后,系統(tǒng)會(huì)自動(dòng)打開(kāi)瀏覽器,顯示 Salesforce 的登錄頁(yè)面。在此頁(yè)面中像平時(shí)一樣登錄要作為“Dev Hub”的 Salesforce 環(huán)境即可。在登錄之后,這個(gè)“Dev Hub”就被作為接下來(lái)創(chuàng)建 Scratch org 的基礎(chǔ),記錄在系統(tǒng)中。
命令講解:
- “sfdx force:auth:web:login”部分是基礎(chǔ)命令,用來(lái)登錄
- “-d”參數(shù)是設(shè)定接下來(lái)登錄的“Dev Hub”是默認(rèn)的。系統(tǒng)中可以同時(shí)擁有多個(gè)“Dev Hub”。要注意的是,當(dāng)創(chuàng)建了 Scratch org 后,這條命令也可以用來(lái)登錄 Scratch org。在這時(shí),不要使用“-d”參數(shù)
- “-a”參數(shù)是為這個(gè)“Dev Hub”設(shè)定一個(gè)好記的別名。在這里我們使用“ExampleDevHub”
在命令行中輸入命令:
sfdx force:org:open -u ExampleDevHub
即可打開(kāi)瀏覽器直接進(jìn)入剛才建立的以“ExampleDevHub”為別名的“Dev Hub”環(huán)境
當(dāng)創(chuàng)建了 Scratch org 后,這條命令也可以用來(lái)打開(kāi)瀏覽器直接進(jìn)入 Scratch org。
建立 SFDX 項(xiàng)目
在使用 SFDX 之前,需要先建立一個(gè)項(xiàng)目。
在命令行中使用以下命令建立一個(gè)名為“ExampleProj”的項(xiàng)目:
sfdx force:project:create -n ExampleProj
該命令會(huì)建立以下目錄結(jié)構(gòu):
其中,“sfdx-project.json”文件包含了該項(xiàng)目的基本信息,“config”文件夾下的“project-scratch-def.json”文件包含了建立 Scratch org 的基本配置信息,“force-app”目錄則用來(lái)存放代碼。
建立 Scratch org
使用命令行進(jìn)入 SFDX 項(xiàng)目的目錄,然后輸入以下命令即可建立一個(gè) Scratch org:
sfdx force:org:create -s -f config/project-scratch-def.json -a ExampleScratchOrg
命令解釋?zhuān)?/p>
- “-s”參數(shù)把即將建立的 Scratch org 作為該項(xiàng)目默認(rèn)的 Scratch org
- “-f”參數(shù)聲明了即將建立的 Scratch org 是基于哪一個(gè)配置文件
- “-a”參數(shù)是設(shè)定別名
接下來(lái)使用命令:
sfdx force:org:open -u ExampleScratchOrg
即可打開(kāi)瀏覽器直接進(jìn)入剛才建立的以“ExampleScratchOrg”為別名的 Scratch org。
使用命令:
sfdx force:org:list
可以查看當(dāng)前系統(tǒng)中已經(jīng)記錄的“Dev Hub”環(huán)境和已經(jīng)建立的 Scratch org 列表。
使用 Scratch org
在 Scratch org 中,開(kāi)發(fā)者(或管理員)可以和使用真正的 Salesforce 環(huán)境一樣開(kāi)發(fā)或配置功能。于此同時(shí),Salesforce CLI 工具也提供了一系列的命令來(lái)進(jìn)行相關(guān)的操作,比如建立 Apex 類(lèi)、建立 Lightning 組件等。
代碼庫(kù)與 Scratch org 同步
SFDX 的一個(gè)重要功能就是將代碼庫(kù)與 Scratch org 同步。Salesforce CLI 提供了兩個(gè)重要的命令來(lái)實(shí)現(xiàn)這些操作:
- sfdx force:source:pull
- sfdx force:source:push
將更改從 Scratch org 同步到本地代碼庫(kù)
開(kāi)發(fā)者可以登錄 Scratch org 進(jìn)行開(kāi)發(fā)和配置。當(dāng)完成開(kāi)發(fā)后,可以在 SFDX 中使用命令“sfdx force:source:pull”來(lái)將更改同步到本地的代碼庫(kù)。
比如:在上面建立的 Scratch org 中建立一個(gè)新的自定義對(duì)象“地址”,API 名字叫“Address__c”。
要將此更改同步到本地代碼庫(kù),可以在命令行中運(yùn)行:
sfdx force:source:pull
運(yùn)行的結(jié)果如圖:
可以看到,剛才建立的新的自定義對(duì)象,包括隨之生成的頁(yè)面布局,以及相關(guān)的簡(jiǎn)檔設(shè)置都以元數(shù)據(jù)的形式保存到了“force-app”文件夾中。
接下來(lái)開(kāi)發(fā)者可以將此更改拷貝到 Git 或其他代碼庫(kù)中進(jìn)行提交。
將更改從本地代碼庫(kù)同步到 Scratch org
在本地代碼庫(kù)中,也可以新建一些組件,比如 Apex 類(lèi)或 Lightning 組件等,然后通過(guò)命令“sfdx force:source:push”將其同步到 Scratch org 中。
比如:在之前建立的 Scratch org 中并沒(méi)有任何 Apex 類(lèi),我們?cè)诿钚兄羞\(yùn)行:
sfdx force:apex:class:create -n AccountController -d force-app/main/default/classes
這條命令就在本地代碼庫(kù)的文件夾“force-app/main/default/classes”下面建立了一個(gè)名叫“AccountController”的 Apex 類(lèi)。
然后在命令行中運(yùn)行:
sfdx force:source:push
運(yùn)行的結(jié)果如圖:
接下來(lái),我們登錄 Scratch org,進(jìn)入 Developer Console,可以看到剛才建立的 Apex 類(lèi)“AccountController”已經(jīng)被同步過(guò)來(lái)了。