Salesforce DXの基礎の基礎

#概要
本記事は、これまでSalesforce上での開発ライフサイクルをAntツール(Migration Tool)によるメタデータ形式をベースにしていた方で新たにSalesforce DXの手法を検討している方を対象にします。
内容は、タイトルに記載の通り基礎の基礎となるので、既にSalesforce DXを使用している方はあまり参考にならないと想定されます。
なお、Salesforce DXの操作に関しては、コマンドベースで記載しますが、VCS(Gitを想定)のコマンドは記載しておりません。

#Salesforce DXとは
従来のSalesforceのメタデータをベースにした開発ライフサイクルは、Sandbox(もしくは本番環境)を正としてそれを元に追加の変更や新規の開発を行い、Antツール(Migration Tool)や変更セットを用いてリリース(デプロイ)するのが主なやり方でした。
それに対して、Salesforce DXは現代の一般的なシステム開発と同じようにVCS(GitやSVN)を用いた**ソース駆動型**の開発ライフサイクルを実現するための手法となります。
Salesforce DXは以下に記載の**Dev Hub**と**スクラッチ組織**を用いることで、コマンドベースで組織のメタデータのソース形式をプル/プッシュしてバージョンコントロールすることが可能となります。

###Dev Hub
スクラッチ組織を作成、管理するために使用するメインの組織
DevHubは、本番環境か、もしくは下記のトライアルから作成します。(Sandboxからは生成することはできません。)
https://developer.salesforce.com/promotions/orgs/dx-signup
※トライアルでDev Hubを作成した場合は30日間のみの使用となります。

###スクラッチ組織
新しいプロジェクトや新しいブランチのために簡単に作成することができ、短期で使用する設定用の組織
主に実装/単体テストのフェーズで開発者単位に作成して動作確認を行うために使用します。

#Salesforce DXの流れ
Salesforce DXで重要なポイントとなる、以下の流れをそれぞれ簡単に記載します。
操作は基本的にコマンドベースとなるので、コマンドのオプションも合わせて説明します。
- 初期操作
- ソースコード実装
- UIでの設定
- 既存組織からスクラッチ組織を生成
- スクラッチ組織から既存組織へリリース

##初期操作
######①Dev Hubへログイン
`sfdx force:auth:web:login -d -a <ログイン組織(DevHub)の別名>`
-d:デフォルト組織に設定、-a:接続するログイン組織の別名を指定

######②スクラッチ組織を作成
`sfdx force:org:create -s -f config/project-scratch-def.json -a <スクラッチ組織の別名>`
-f:スクラッチ組織定義ファイルを指定、-a:スクラッチ組織の別名を指定
スクラッチ組織定義ファイルの詳細は以下を参照
https://developer.salesforce.com/docs/atlas.ja-jp.216.0.sfdx_dev.meta/sfdx_dev/sfdx_dev_scratch_orgs_def_file.htm
![image.png](https://qiita-image-store.s3.amazonaws.com/0/138335/ffd3c99a-87a1-0b27-4a74-0546ac5e5922.png)
デフォルトではスクラッチ組織は、認証トークンでログインを行うためユーザ名のみ表示されて、パスワードは表示されません。

######③スクラッチ組織へログイン
`sfdx force:org:open -u <ログイン組織の別名>`
-u:スクラッチ組織の別名を指定(指定しない場合は、接続しているデフォルト組織へログインする)

######④ローカルに新しいプロジェクトのスキャホールディングを行い、全てのアセットを適切なフォルダに配置
`sfdx force:project:create -n <プロジェクト名>`

##プログラム実装
######①VCSからソースコードをローカルにクローン/プル

######②ソースコードを作成/修正
下記のコマンドで初期作成時は、スキャフォールディングを使用することができます。
Apexクラスの作成
`sfdx force:apex:class:create -n <Apexクラス名> -d force-app/main/default/classes`

Lightningコンポーネントを生成
`sfdx force:lightning:component:create -n <Lightningコンポーネント名> -d force-app/main/default/aura`

Lightningコンポーネント(イベント)を生成
`sfdx force:lightning:event:create -n <イベント名> -d force-app/main/default/aura`

######③ローカルのソースコードをスクラッチ組織にプッシュ
`sfdx force:source:push`

######④スクラッチ組織を開き、動作確認
`sfdx force:org:open`

######⑤問題なければ、VCSへプッシュ
※.sfdxフォルダは、VCSのリポジトリへの追加から除外(.gitingoreで指定する)

##UIでの設定
######①スクラッチ組織を開き設定を追加/変更
`sfdx force:org:open`

######②スクラッチ組織から設定変更のソースを取得
`sfdx force:source:pull`

######③VCSへプッシュ

##既存組織からスクラッチ組織を生成
既存組織(Sandbox/本番環境)からスクラッチ組織を生成するには、メタデータ形式からソース形式に変換する必要があります。
######①既存組織(Sandbox/本番環境)へログイン
`sfdx force:auth:web:login -a <既存組織(Sandbox/本番環境)の別名>`

######②既存組織からメタデータ形式で取得
`sfdx force:mdapi:retrieve -s -r <ディレクトリ名> -k ./package.xml -u <既存組織(Sandbox/本番環境)の別名>`

######③メタデータ形式からソース形式に変換
`sfdx force:mdapi:convert -r <ディレクトリ名>`

######④ローカルのソースコードをスクラッチ組織にプッシュ
`sfdx force:source:push`

##Sandbox/本番環境へのリリース
Sandbox/本番環境へのリリースは、メタデータAPIを使用してリリースするので、ソース形式からメタデータ形式に変換する必要があります。

######①リリース環境(Sandbox/本番環境)へログイン
`sfdx force:auth:web:login　-a <リリース環境(Sandbox/本番環境)の別名>`

######②VCSからソースコードをローカルにクローン/プル

######③ソース形式をメタデータ形式に変換する
`sfdx force:source:convert -d <ディレクトリ名>`

######③Sandbox/本番環境へリリース
`sfdx force:mdapi:deploy -d <ディレクトリ名> -u <リリース環境(Sandbox/本番環境)の別名>`


#その他　基礎コマンド
######権限セットの割り当て
`sfdx force:user:permset:assign -n <権限セット名>`

######データのエクスポート
`sfdx force:data:tree:export -q "<SOQLのクエリ文>" -d <ディレクトリ名>`

######データのインポート
`sfdx force:data:tree:import --sobjecttreefiles <インポートファイル>`

######スクラッチ組織の削除
`sfdx force:org:delete -u <スクラッチ組織の別名>`
-u:スクラッチ組織の別名を指定

######パスワードの生成
`sfdx force:user:password:generate -u <スクラッチ組織の別名>`

######スクラッチ組織の設定データを確認
`sfdx force:org:display -u <スクラッチ組織の別名>`

#####スクラッチ組織と通常の組織(Devhub含む)を一覧表示
`sfdx force:org:list`

######使用可能なコマンドの参照
`sfdx force --help`

######Salesforce DXプラグインとCLIコマンドを最新化する
`sfdx update`

######使用できる全てのコマンドを表示
`sfdx force:doc:commands:list`

######ログインした組織の履歴を表示する
`sfdx force:org:list`


#参考
主に下記のTrailheadモジュールを実施した内容を整理した記事となります。
**クイックスタート: Salesforce DX**
https://trailhead.salesforce.com/ja/content/learn/projects/quick-start-salesforce-dx?trail_id=sfdx_get_started

**Salesforce DX を使用したアプリケーション開発**
https://trailhead.salesforce.com/ja/content/learn/modules/sfdx_app_dev?trail_id=sfdx_get_started