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官网)

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