Edited at

ターミナルからApexを実行できるforce.com CLIの使い方

More than 3 years have passed since last update.


はじめに

Salesforceの開発をしていると、検証用に条件を少しだけ変えたSOQLをいくつも実行したり、ちょっとしたApexを書いて実行する機会が多々あります。

すでにSalesforceにはそういったことを実現させる機能が用意してあって、それがこの「開発者コンソール」と呼ばれるものです。

(Salesforceにログインした後、ログインユーザ名をクリックして表示されるメニューから起動)

ただこのコンソールの動作が不安定&遅いこともあり、上に挙げたことのような「ちょっとしたこと」ならローカルから実行できないかなーと思ってました。

そこで発見したのがforce.com CLIというツールです。

(Salesforceの公式ブログはこちら

予想以上に便利だったのと、日本語で紹介しているサイトがあまりなかったのでその使い方をまとめてみます。

(注意)

以下、コマンド部分の

~ $ 

はカレントディレクトリを指します。


インストール方法

さっそくインストールします。

なお、mac book air(Mac OS X 10.7)でやってます。


go言語をインストール

動かすにはgo言語が必要とのことなので、

Homebrewでインストールします。

こちらの記事を見ながらやりました。

http://sixeight.hatenablog.com/entry/2013/12/12/031752

~ $ brew install go


$GOPATHを設定

これも、先ほどの記事にならって~/.go/1.2/に設定。

~ $ mkdir -p ~/.go/1.2/


.zshrc

# 以下の2行を追記した

export GOPATH=$HOME/.go/1.2
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin


force.com CLIをインストール

いよいよforce.com CLI本体のインストールです。

~ $ go get -u github.com/heroku/force

すると...

go: missing Mercurial command. See http://golang.org/s/gogetcmd

package github.com/heroku/force
imports bitbucket.org/kardianos/osext: exec: "hg": executable file not found in $PATH
go: missing Mercurial command. See http://golang.org/s/gogetcmd
package github.com/heroku/force
imports bitbucket.org/pkg/inflect: exec: "hg": executable file not found in $PATH

あれ、エラー。

どうやら、私のMacにはMercurialが入ってなかった模様。

Mercurialをインストールして、もう一度試します。

# pipはhomebrewでインストールされてた?

~ $ sudo pip install mercurial

# シンボリックリンク作成
# (パスはインストールされた場所に応じて変更してください)
~ $ sudo ln -s ~/.pyenv/versions/2.7.5/bin/hg /usr/local/bin

# 今度こそ
~ $ go get -u github.com/heroku/force

無事にインストールできました。


使ってみる

それでは、実際にターミナルから使ってみましょう。


ログイン

ログインは"force login"コマンドを使います。

~ $ force login

すると、ブラウザでアプリの認証画面が開くので「許可」します。


SOQLを実行

SOQLを実行するには"force query"コマンドを使います。

~ $ force query "SELECT Id, Name FROM User"

Id | Name
--------------------+---------------------
00510000002bhRwAAI | さんぷる 太郎
(1 records)


Apexを実行

Apexを実行するには"force apex"コマンドを使います。

apexコードの記述方法は2通りあります。

1. "force apex"を実行した後、入力を受け付けるモードになるので

コードを記述し、Ctrl-Dを押す

2. ローカルファイルにapexコードを記述し、"force apex [ファイル名]"という形で実行する。

1.だとカーソル移動がうまくできないので、個人的には2.の方法が好きです。


force.com CLIのいいところ


SOQLの結果をjson形式で取得できる!

force queryコマンドのオプションにformat:jsonを指定すると、結果をjson形式で取得することができます。


サンプル

~ $ force query "SELECT Id, Name FROM User" format:json

{
"Done": true,
"Records": [
{
"Id": "00510000002bhRwAAI",
"Name": "さんぷる 太郎",
"attributes": {
"type": "User",
"url": "/services/data/v29.0/sobjects/User/00510000002bhRwAAI"
}
}
],
"TotalSize": 1
}
~ %

一旦実行結果をファイルに出力しておいて、javascriptでごにょごにょする、といったことが簡単にできるかも...

ちなみに、format:はcsvもあるよ、とREADMEに書いてあったのですが

記事執筆時点では実装されてないっぽいです。


apex実行結果のログが表示される!

開発者コンソールのログと同じものが出力されます。なので、


CreateEvent.cls

Event e = new Event(

Subject = 'force.com CLIで作成',
StartDateTime = Datetime.now(),
DurationInMinutes = 60
);

insert e;

// デバッグログ出力
System.debug('現在のEventは' + [SELECT Id FROM Event].size() + '件です');



サンプル

~ $ force apex CreateEvent.cls | grep USER_DEBUG

01:13:15.116 (116262542)|USER_DEBUG|[10]|DEBUG|現在のEventは1件です

というように、System.debugだけを出力してファイルにログを保存、とかもできそうです。


おわりに

いかがでしたでしょうか。

ちょっとしたApexを実行するだけでなく、たとえばテストを開始する時、新規作成した組織にデータを流し込む...などといったことも

ターミナルから簡単に行えそうな気がします。


おまけ

似たような機能を提供するツールとしてJSforceというのもあるみたいなんですが、

こちらは全く触ったことがないので試してみる機会があればまたまとめようと思います。

(リンク)

http://jsforce.github.io/start/