AWSのToolkitとかTwilioのライブラリをインストールしようとしたときに、
あるDeveloper環境ではエラーが起きてインストールできず、他の環境ではインストール出来るという
謎の現象が起きてしまった。
パッケージインストールでは詳細なエラーメッセージが出ないっぽいので
インストールできた他の環境からインストールしたい対象の環境に対して
パッケージのコンポーネントを丸ごとデプロイしてみて、エラーが出るか確認。
そしたら、以下のエラーメッセージが出てデプロイ失敗しました。
[Test.isRunningTest method does not exist]
「いやいや、Test.isRunningTestはメソッドとして存在するでしょ。」
「他の環境でインストールできているってことはapex versionも問題ないだろうし。」
とか小賢しいこと思って色々調べたらdeveloer forumにこんな記事が…。
https://developer.salesforce.com/forums?id=906F00000008zvnIAA
ということで、testっていうクラスがあったせいでした。そりゃそうだよな…。
apexは大文字小文字区別しないからtestであろうとTestであろうと見事に引っかかります。
testクラスからTestApexクラスに変更したら無事インストール出来ました。
Developer環境でTest.isRunningTestを使ってなかったし、
そもそも検証用環境だからテストクラス回したりなんて滅多にしないから気付かなかった…。
ちなみにTest.isRunningTest()じゃなくてSystem.Test.isRunningTest()っていう風に
Systemっていう名前空間的なものをつけてあげれば既存のTestっていうクラスを消さずにもイケるっぽい。
Testっていうクラスに
public static Boolean isRunningTest() {
return System.Test.isRunningTest();
}
っていうメソッド持たせるのもOK。
今回はパッケージであんまりコードを修正したくなかったし、
Testっていうクラスをリネームしても問題なかったので良かったけど
どうしてもリネームできない理由があるのであれば上記2つの手段を使うのもOKだと思います。
どんな組織にも入れることが出来るようなパッケージを作る場合は
パッケージのクラスのSystemっていう名前空間がつくものには全てSystem名前空間を付与した方が良さそう。