スクラッチ組織の有効期間が終わってしまう場合の対応

スクラッチ組織には有効期間というものがあり、作成時に7日から30日を指定する事ができます。

例えば、7日もあれば終わると思って7日で終わらない場合、残念ですがスクラッチ組織は消えてしまいます。ソースは手元にありますので、新しくスクラッチ組織を作成して、ソースをpushすればいいのですが、ちょっとしたコツが必要です。

まず、こう言った場合の対応として、準備しておくことがあります。

  • 不要なオブジェクトは転送しない(pushもpullも)ように.forceignoreファイルに定義しておく。
  • pushするだけでなくpullもしておく(カスタムオブジェクトをスクラッチ組織で登録している場合、pullしておかないと消えます)

では、新しくスクラッチ組織を作成して、必要なオブジェクトを転送します。

スクラッチ組織の作成

DevHubの認証を行った上で、新しくスクラッチ組織を作成します。

sfdx force:org:create -f project-scratch-def.json -a <alias-name>

スクラッチ組織へのソース転送

スクラッチ組織へのソースを転送します。

sfdx force:source:push

これでうまく行けばOKです。ラッキーです。

Lighting Web Component、Apexクラス、カスタムオブジェクトなど使っている場合、pushではエラーになることが多いです。

なぜでしょう?

sfdx force:source:pushでは、pushする順序を制御してくれないからです。しかも、どれを転送するのかを個別に指定する事もできません(.forceignoreを駆使すればできます)

例えば、カスタムオブジェクトを使っているApexクラスがあったとします。Apexクラスをpushするためにはカスタムオブジェクトはすでに存在する必要があります。ですが、順序を制御できないので、pushしたときにApexクラスでエラーが発生します。

では、どうするかと言うことですが、個別に転送できる方法を使います。

具体的には、sfdx force:source:deployを使います。

Lightning Web Component、Apexクラス、カスタムオブジェクトを転送する場合は、依存関係を意識して、カスタムオブジェクト、Apexクラス、Lightning Web Componentの順に転送します。

sfdx force:source:deploy -u <alias-name> --sourcepath force-app/main/default/objects
sfdx force:source:deploy -u <alias-name> --sourcepath force-app/main/default/classes
sfdx force:source:deploy -u <alias-name> --sourcepath force-app/main/default/lwc

これで無事に転送できます。

最後に大切なこと

無事に転送しましたが、環境がきちんとできているとは限りません。

これを確認するためには、Apexクラスのテストを実行するのがベストです。

sfdx force:apex:test:run

これですべてのテストクラスが正常終了したら、概ね環境は構築できたと考えていいと思います。

テストクラスって作るのは面倒なんですけど、Apexクラスと一緒に作っておくと、品質と生産性向上に繋がります。