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

# はじめに
Salesforceの開発をしていると、検証用に条件を少しだけ変えたSOQLをいくつも実行したり、ちょっとしたApexを書いて実行する機会が多々あります。
すでにSalesforceにはそういったことを実現させる機能が用意してあって、それがこの「開発者コンソール」と呼ばれるものです。
（Salesforceにログインした後、ログインユーザ名をクリックして表示されるメニューから起動）

![SS 2014-04-02 0.00.12.png](https://qiita-image-store.s3.amazonaws.com/0/36518/5a2f900b-1989-16ca-c8a1-56bbd1fdefad.png)

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

そこで発見したのがforce.com CLIというツールです。
（Salesforceの公式ブログは[こちら](
http://blogjp.sforce.com/2013/11/forcecom-cli---d403.html)）

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

（注意）
以下、コマンド部分の

```zsh
~ $ 
```

はカレントディレクトリを指します。
# インストール方法
さっそくインストールします。
なお、mac book air(Mac OS X 10.7)でやってます。

### go言語をインストール
動かすにはgo言語が必要とのことなので、
Homebrewでインストールします。
こちらの記事を見ながらやりました。
http://sixeight.hatenablog.com/entry/2013/12/12/031752

```zsh
~ $ brew install go
```

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

```zsh
~ $ mkdir -p ~/.go/1.2/
```
```zsh:.zshrc
# 以下の2行を追記した
export GOPATH=$HOME/.go/1.2
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
```

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

```zsh
~ $ go get -u github.com/heroku/force
```
すると...

```zsh
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をインストールして、もう一度試します。

```zsh
# 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"コマンドを使います。

```zsh
~ $ force login
```
すると、ブラウザでアプリの認証画面が開くので「許可」します。
![SS_2014-04-02_0_52_29.png](https://qiita-image-store.s3.amazonaws.com/0/36518/550ffefa-d816-ebe4-2936-69ccb6a16e94.png)

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

```zsh
~ $ 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形式で取得することができます。

```zsh:サンプル
~ $ 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実行結果のログが表示される！
開発者コンソールのログと同じものが出力されます。なので、

```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() + '件です');
```

```zsh:サンプル
~ $ 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/