line -1, column -1: Dependent class is invalid and needs recompilationエラーについて

By | November 18, 2022

典型的な発生パターン

■Case
当該エラーの対象となっているApexクラスの依存先のメタデータ(項目やメソッド)に変更があった場合

■Resolution
この場合、ApexクラスのisVaildフラグが(裏側で)falseになっているので、依存関係の修正を行なった上で、再コンパイルを行う必要がある

トリッキーな発生パターン

■Case
組織に特定のApexクラスが存在する状態で、当該のApexクラスと(テストクラスを介して間接的に)相互依存関係を持つクラスをデプロイした際に、元のApexクラスまたは元のApexクラスのテストクラスに対して「相互依存関係を持つクラス」に依存する何らかの修正が加えられている場合

■Description
下記の例の場合、TestDataFactoryのデプロイはその依存先のSelectorとの整合性に依存するが、そのSelectorのデプロイはTest Classに依存し、更にそのTestClassのデプロイはその依存先のTestDataFactoryとの整合性に依存する。

つまり、全体としてデプロイにおけるメタデータ依存関係の「循環構造」が存在しており、このような場合に「循環構造内での依存関係の変更(※メソッドの引数の変化など)が新たに発生すると」Salesforceのデプロイ時(=コンパイル時)メタデータ依存関係チェックは正しく動作しなくなってしまう。

■Before

 Selector←SelectorTest
       ↓
  TestDetaFactory

■Deploy(※NGパターン)

 Selector←SelectorTest(※TestDataFactoryのメソッドの引数を変更)
     ↖︎   ↓
  TestDataFactory(※Beforeからメソッドの引数を変更)

■Resolution

  • メタデータの相互依存関係をなくす
  • 依存関係を発生させている箇所を一時的にコメントアウトするなどによって相互依存関係をなくした上でデプロイし、その後、当該クラスに依存したクラスをデプロイし、その後更にコメントアウトを外したVer.をリリースする(※下記参照)

■Before

 Selector←SelectorTest
       ↓
  TestDetaFactory

■Deploy(※NGパターン)

 Selector←SelectorTest(※TestDataFactoryのメソッドの引数を変更)
     ↖︎   ↓
  TestDataFactory(※Beforeからメソッドの引数を変更)

■Deploy1

 Selector←SelectorTest
        ↓
  TestDataFactory(※Beforeからメソッドの引数を変更)

■Deploy2

 Selector←SelectorTest(※TestDataFactoryのメソッドの引数を変更)
       ↓
  TestDataFactory

■Deploy3

 Selector←SelectorTest
     ↖︎   ↓
  TestDataFactory