こんにちは、倉谷(id:a-kura)です。
今年もいつのまにかアドベントカレンダーの時期になってしまいました。皆さま、いかがお過ごしでしょうか?
さて、Salesforce DX CLI の紹介では、権限セットの付与やデータロードがデモされていましたが、実はもう一つ重要な機能があります。
そう、任意の Apex が実行できる機能です。
今回は、Salesforce DX CLI を使って、 Apex を実行する方法について紹介したいと思います。
ヘルプ
まずは、Apex コードを実行するためのコマンドのヘルプを参照します。下記のコマンドを実行すると、ヘルプを表示できます。他のコマンドを調べるときも同様なので覚えておくと役立ちます。
$ sfdx help force:apex:execute Usage: sfdx force:apex:execute [-f <file>] [-u <string>] [--json] [--loglevel <string>] execute anonymous Apex code Flags: -f, --apexcodefile APEXCODEFILE path to a local file containing Apex code -u, --targetusername TARGETUSERNAME username or alias for the target org; overrides default target org --json format output as json --loglevel LOGLEVEL logging level for this command invocation (error*,trace,debug,info,warn,fatal) Executes one or more lines of Apex code, or executes the code in a local file. Before you enter code, run this command with no parameters to get a prompt. From the prompt, all commands are executed in a single execute anonymous request. For more information, see "Anonymous Blocks" in the Apex Developer Guide. Examples: $ sfdx force:apex:execute -f ~/test.apex $ sfdx force:apex:execute >> Start typing Apex code. Press the Enter key after each line, >> then press CTRL+D when finished.
コマンドラインから Apex コードを入力して実行する
では、コマンドラインから 直接 Apex コードを入力して実行してみましょう。 認証を済ませたあと、先ほどのヘルプで参照した内容を参考に実行してみます。
$ sfdx force:apex:execute
コマンドを実行すると、下記のようなメッセージが表示されて、入力待ちになります。
>> Start typing Apex code. Press the Enter key after each line, >> then press CTRL+D when finished.
下記のように適当な Apex コードを入力して、CTRL+D を押下します。
System.debug('Hello, Astro!');
そうすると、実行結果が表示されます。 実行結果の内容を見ると、開発者コンソールから実行したときのログと同じものが表示されていることがわかります。
Compiled successfully. Executed successfully. 41.0 APEX_CODE,DEBUG;APEX_PROFILING,INFO Execute Anonymous: System.debug('Hello, Astro!'); 23:41:42.11 (11567895)|USER_INFO|[EXTERNAL]|005xxxxxxxxxxxxxx|xxxxx@xxxxx.com|日本標準時|GMT+09:00 23:41:42.11 (11592457)|EXECUTION_STARTED 23:41:42.11 (11597237)|CODE_UNIT_STARTED|[EXTERNAL]|execute_anonymous_apex 23:41:42.11 (12249513)|USER_DEBUG|[1]|DEBUG|Hello, Astro! 23:41:42.12 (12311326)|CUMULATIVE_LIMIT_USAGE 23:41:42.12 (12311326)|LIMIT_USAGE_FOR_NS|(default)| Number of SOQL queries: 0 out of 100 Number of query rows: 0 out of 50000 Number of SOSL queries: 0 out of 20 Number of DML statements: 0 out of 150 Number of DML rows: 0 out of 10000 Maximum CPU time: 0 out of 10000 Maximum heap size: 0 out of 6000000 Number of callouts: 0 out of 100 Number of Email Invocations: 0 out of 10 Number of future calls: 0 out of 50 Number of queueable jobs added to the queue: 0 out of 50 Number of Mobile Apex push calls: 0 out of 10 23:41:42.12 (12311326)|CUMULATIVE_LIMIT_USAGE_END 23:41:42.11 (12348943)|CODE_UNIT_FINISHED|execute_anonymous_apex 23:41:42.11 (13282152)|EXECUTION_FINISHED
ファイルから Apex コードを実行する
次に、Apex コードを保存したファイルから Apex コードを実行していましょう。 まずは、実行するための Apex コードを準備します。
ここでは、Apex コードが実行できるか試したいだけなので、先ほどと同じコードをファイルに保存します。
HelloAstro.apex
System.debug('Hello, Astro!');
先ほどのヘルプのとおり、ファイルを指定する場合は「--apexcodefile」または「-f」のあとにファイル名を入力します。
$ sfdx force:apex:execute --apexcodefile HellpAstro.apex
そうすると、先ほどコマンドラインから Apex コードを入力して実行したときと同じ実行結果になります。
活用方法
Apex コードが実行できると、どういった嬉しいことがあるのでしょうか?
実は、データの初期化などでオブジェクトのレコード間に相互参照などがあると、データインポートが難しくなることがあります。そういった場合には、Apex コードと組み合わせることで効率的にデータインポートができるようになります。
開発者がデータをクリアしたい場合、サンプルデータなどを一括作成する場合などには、Apex コードを準備しておくと、無駄な手間が少し省けるようになり、開発効率向上にも貢献できそうです。
また、オプション「--json」をつけて実行することで、実行結果をJSON形式で受け取ることができます。 JSON形式で受け取ることができれば、Jenkisやバッチ処理内で実行結果を条件判定するような処理を記述できるようになります。
シェルに組み込めるようになると、活用の幅も広がってきます。こういった柔軟性を与えることがこのコマンドのメリットと言えるでしょう。
むすび
Apex コードをコマンドラインから実行してみましたが、参考になりましたでしょうか?
Apex コードを実行できるようになることでかなり柔軟なことができるようになりますので、皆さまもよいアイデアがあれば共有してもらえると幸いです。
最後になりましたが、この投稿は チームスピリット Advent Calendar 2017 - Adventar と Salesforce Platform Advent Calendar 2017 - Qiita 第2日目の投稿になります。
ハッピー・クリスマス!