Titanium Alloy プロジェクトでの開発のお供、alloy-smelter のお誘い

地味すぎて世間から忘れられてしまいそうな Titanium の布教も兼ねて、先日のもくもく会に参加もできず、存在自体地味なぼくもアピールしてみようかと投稿してみました。よろしくお願いします。

さて、突然のお誘いですが、お誘いというか、ぼくみたいな方にはお勧めですので是非どうぞ。

ぼくはどうも命名がふらふらしがちで、Alloy プロジェクトで ```$ alloy generate controller foo``` した後でも、やっぱり違うなーとコントローラ名をちょこちょこ変更しまくる癖があります。病気ですね。ただ、コントローラ名を変更すると言っても、変更するのはコントローラ、ビュー、スタイルの3つになります。毎度毎度こんなことをしていたらとても非効率ですよね。ということで、一括で簡単に変更したいなーという怠惰な理由でこのコマンドを作り始めました。普段から Titanium Studio ではなくて、コマンドラインで開発をする方にはピッタリです。

[alloy-smelter](https://github.com/k0sukey/alloy-smelter) は npm で提供されています。インストールは Node.jsと npm が必要ですが、Titanium をご利用な方はすでにセットアップ済みですよね。以下のコマンドでインストールすることができます。

```shell-session
$ npm install -g alloy-smelter
```

## ファイル操作系

コントローラ・ビュー・スタイルを1セットに、一括で操作することができます。

### コピー

```shell-session
$ smelter copy foo bar
```

もちろん深い階層のフォルダへコピーすることも可能です。

```shell-session
$ smelter copy foo bar/baz
```

### 移動（リネーム）

```shell-session
$ smelter move foo bar
$ smelter move foo bar/baz
```

### 削除

```shell-session
$ smelter remove foo
$ smelter remove bar/baz
```

## 生成

```alloy``` コマンドへそのまま渡します（controller、view、style のみ）。

```shell-session
$ smelter generate controller foo
```

また、```--template``` オプションを付けることにより、自身で用意したテンプレートでコントローラ・ビュー・スタイルを生成することができます。

```shell-session
$ smelter generate controller foo --template bar
```

テンプレートはホームディレクトリ直下に ```.smelter``` が作られていますので、そちらへ予め配置しておいてください。上記の例では ```bar``` というテンプレートが指定されていますので、以下の様な構成になります。


```
$HOME
  └ .smelter
    └ template
      └ bar
        ├ controller.js
        ├ view.xml
        └ style.tss
```

## ビルド

``` titanium``` コマンドへそのまま渡します。```--titanium``` オプションで渡したいオプションを指定してください。

```shell-session
$ smelter build --titanium '-p ios --retina --tall'
```

また、プリセットを用意すれば、頻繁に指定するようなオプションを予め指定することができます。プリセットは JSON で管理していますので、以下のコマンドで編集することができます。

```shell-session
$ smelter preset
```

ぼくは各シミュレータ毎に指定していたりします。最新の開発環境ではシミュレータも UDID 指定になったようで、これは是非指定しておくと良いかと思います。

```json
{
  "iPhone5s": "-p ios -C XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
  "iPadAir": "-p ios -C XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
}
```

プリセットが用意できたら、ビルド時にプリセット名を指定してください。

```shell-session
$ smelter build iPhone5s
```

## クリーン

```titanium``` コマンドにもクリーンはありますが、こちらは ```build``` フォルダだけではなく ```Resources``` も削除します。Alloy プロジェクトではなく、クラシックなプロジェクトの場合は気をつけてください。

```shell-session
$ smelter clean
```

## 統計

Alloy プロジェクトの統計を出力します。

```shell-session
$ smelter stats
```

```
┌────────────────┬─────────────────────────────────────┐
│ Category       │ Summary                             │
├────────────────┼─────────────────────────────────────┤
│ File           │                    controllers:   1 │
│                │                          views:   3 │
│                │                         styles:   1 │
│                │                         models:   1 │
├────────────────┼─────────────────────────────────────┤
│ View node      │                          Label:   8 │
│                │                      TextField:   4 │
│                │                         Window:   3 │
│                │                       MenuItem:   3 │
│                │                           View:   3 │
│                │                     HeaderView:   2 │
│                │                       ListView:   2 │
│                │                      Templates:   2 │
│                │                   ItemTemplate:   2 │
│                │                    ListSection:   2 │
│                │                       ListItem:   2 │
│                │                           Menu:   1 │
│                │               NavigationWindow:   1 │
│                │                      TabbedBar:   1 │
│                │                         Labels:   1 │
├────────────────┼─────────────────────────────────────┤
│ Selector       │                        element:   9 │
│                │                             id:   7 │
│                │                          class:   2 │
├────────────────┼─────────────────────────────────────┤
│ Property       │                         height:   7 │
│                │                         bottom:   6 │
│                │                          width:   6 │
│                │                           left:   5 │
│                │                            top:   4 │
│                │                backgroundColor:   3 │
│                │                          title:   3 │
│                │                          right:   3 │
│                │                          color:   2 │
│                │                 separatorColor:   1 │
│                │            windowSoftInputMode:   1 │
│                │                   paddingRight:   1 │
│                │                 selectionStyle:   1 │
│                │                      textAlign:   1 │
│                │                  verticalAlign:   1 │
│                │                       editable:   1 │
│                │                          index:   1 │
│                │                       hintText:   1 │
├────────────────┼─────────────────────────────────────┤
│ Color          │                           #fff:   1 │
│                │                        #fcfcfc:   1 │
│                │                        #bcbac1:   1 │
│                │                        #f6f6f6:   1 │
│                │                           #333:   1 │
│                │                        #d9d9d9:   1 │
├────────────────┼─────────────────────────────────────┤
│ Event type     │                          click:   8 │
│                │                       dblclick:   2 │
│                │                          swipe:   2 │
│                │                         return:   2 │
├────────────────┼─────────────────────────────────────┤
│ Event listener │                    doToggleall:   2 │
│                │                       doToggle:   2 │
│                │                         doEdit:   2 │
│                │                       doDelete:   2 │
│                │                       doEdited:   2 │
│                │                          doAll:   1 │
│                │                       doActive:   1 │
│                │                    doCompleted:   1 │
│                │                          doTab:   1 │
└────────────────┴─────────────────────────────────────┘
```

## さいごに

```titanium``` コマンドの ```ti``` な様に ```smelter``` コマンドは ```sm``` がエイリアスとして登録されています。ちょっとアレな名前ですが、毎回 smelter と打つのもおっくうなので、こちらでどうぞ。

というわけで、これからもちょこちょこアップデートをしていきますので、なにか欲しい機能があれば GitHub でプルリクエストなり Issues で投げていただければと思います。