fastlaneのpluginを作成方法をまとめてみた

## はじめに
(特に)iOS開発者にとってかかせない存在のfastlaneですが、本体にあるactionとは別のことをやりたいことがあったりするかと思います。

その場合は以下の方法があります。
 
 - 独自actionを作成
   - 参考：[fastlaneで独自actionを追加する](http://qiita.com/tarappo/items/7b92cdb33bbfa5cf10e7)
 - pluginを作成

独自actionだと、そのactionがあるプロジェクトのみの利用になりますが、pluginの場合は他の人も簡単に利用することができます。

今回は、pluginの作成にあたっての初めの一歩として「どのように作るか」の説明を自身のメモの意味も兼ねて書きます。

## plugin作成の流れ
pluginの作成は以下の流れになります。

 - 雛形の作成
 - 実装
   - actionの実装
   - テストコードの実装
 - pluginの公開


## 雛形の作成
以下のコマンドにより雛形を作ることができます。

```shell:command
fastlane new_plugin [plugin_name]
```

コマンドをうつと以下を聞かれます。
またplugin_nameにはfastlaneやpluginという単語を含むことはできません。

 - plugin name
 - short summary
 - detailed description


全て答えると以下の雛形が作成されます。

```text:構成
 - .gitignore
 - .rspec
 - .rubocup.yml
 - .travis.yml
 - circle.yml
 - Gemfile
 - LICENSE
 - Rakefile
 - README.md
 - fastlane-plugin-[plugin_name].gemspec
 - fastlane/
   - Fastfile
   - Pluginfile
 - lib/fastlane/plugin/
   - [plugin_name]/
     - actions/
       - [plugin_name]_action.rb
     - helper/
       - [plugin_name]_helper.rb
     - version.rb
   - [plugin_name].rb
 - spec/
   - [plugin_name]_action_spec.rb
   - spec_helper.rb
```

## 実装
実装をする前に、まずbundlerを使ってインストールをおこなっておきます。

```shell:command
bundle install --path vendor/bundle
```

### plugin本体
実装する箇所はlib/fastlane/plugin以下にあります。
pluginのバージョンはverion.rbに書きます。

#### actions/
 - [plugin_name]_action.rb

action本体のコードはここに実装します。
デフォルトだとself.run(params)に以下のように実装されています。

```ruby
def self.run(params)
  UI.message("The sample_for_you plugin is working!")
end
```
この実装だと上記のメッセージが表示されるだけになります。


#### helper/
 - [plugin_name]_helper.rb

actionで利用するhelperになります。
作成したmethodは以下のように呼び出すことができます。

```ruby
Helper::[YourPluginName]Helper.[your_method]
```

#### 動作確認
fastlane/Fastfileには以下のように書かれています。

```
lane :test do
  [action名]
end
```

そのため、作成しているpluginは以下のコマンドで試すことができます。

```shell:command
bundle exec fastlane test
```


### テストコード
作成するpluginのテストコードはspec/以下になります。

 - [plugin_name]_action_spec.rb
  - テストを実装する箇所
 - spec_helper.rb


テスト自体は以下のコマンドで動かすことができます。

```shell:command
bundle exec rspec
```

テストコードの書き方については、既存のactionのテストコードなどを参考にすると良いかもしれません。

 - [fastlane本体のactionのテスト](https://github.com/fastlane/fastlane/tree/master/fastlane/spec/actions_specs)


### Rakefile
Rakefileが用意されており、以下のコマンドで実行できます。
defaultのtaskはspec、rubocupになっています。

```shell:command
bundle exec rake
```

上記コマンドで、テストと併せてrubocupでコーディングルールのチェックもしてくれます。
設定されている内容については.rubocup.ymlを確認するとわかります。


## pluginの公開
作成が終わったら、RubyGemsに登録することが推奨されています。

公開までの流れは、[公式のドキュメント](https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Plugins.md)に書かれています。
流れとしては以下のとおりです。

 - RubyGems.orgにアカウントを作っておく
 - plugin自体をGithubに公開しておく
 - fastlane-plugin-[plugin_name].gemspecのhomepageを上記のGithubのURLにしておく
 - 以下のコマンドでリリース

```
bundle install
bundle exec rake install
bundle exec rake release
```


## pluginの利用
最後に作成したpluignの利用についてですが、世に公開しなくても当然利用することはできます。

 - 「自身のPC環境にコードがある場合」
   - 開発時などに
 - 「githubで公開されている場合」
   - 社内利用などに
 - 「リリースされている場合」

pluginを利用するにはfastlane/Pluginfile(とGemfile)に記述する必要がありますが、上記それぞれの書き方は以下のとおりです。

```
#自身のPC環境にある場合
gem "fastlane-plugin-[plugin_name]", path: "../[dir_name]"

#githubで公開されている場合
gem "fastlane-plugin-[plugin_name]", git: "https://github.com/[userid]/[repository_name]"

#リリースされている場合(バージョン指定をする場合)
gem "fastlane-plugin-[plugin_name]", "[version_number]"

#リリースされている場合
gem "fastlane-plugin-[plugin_name]"
```


## 参考
 - https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Plugins.md