Rake について

前職で社内向け LT 会をしたときの Rake の発表資料を掘り出したので Qiita に移植。

# Rake 良いですよね

[Rake -- Ruby Make](https://ruby.github.io/rake/)

---

# Rake のおさらい

[library rake (Ruby 2.7.0 リファレンスマニュアル)](https://docs.ruby-lang.org/ja/latest/library/rake.html)

> Rake は Make によく似た機能を持つ Ruby で書かれたシンプルなビルドツールです

---

# ビルドツールでできること

- コンパイル
- パッケージング
- テスト実行
- 静的解析
- リリース（デプロイ）
- 文書やリリースノートを作成

---

# ビルドツール（Rake）でできること

[ビルド自動化 - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%93%E3%83%AB%E3%83%89%E8%87%AA%E5%8B%95%E5%8C%96)

- > コンパイル
  - Ruby はスクリプト言語なので不要
- パッケージング
  - Bundler（パッケージ管理システム）
- テスト実行
  - RSpec（テストフレームワーク）
- 静的解析
  - RuboCop（コードフォーマッター）
- リリース（デプロイ）
  - Capistrano（デプロイメント自動化ツール）
- 文書やリリースノートを作成
  - `rake/rdoctask`

---

# Rake のおさらい

```ruby
task default: %w(hello)

desc 'hello と出力するタスク'
task :hello do
  puts 'hello'
end
```

```shell
$ rake
# hello
```

---

# Rake のおさらい

```ruby
require 'rake/clean'

# `rake clean` でバックアップファイルを削除できる
CLEAN << './foo.txt'
# `rake clobber` でバックアップファイルと自動生成されたファイルを削除できる
CLOBBER << './foo.rb'

task default: %w(hello_world)

task :hello do
  print 'hello '
end

task world: %w(hello) do
  puts 'world!'
end

desc 'hello world! と出力する'
task hello_world: %w(hello world)

desc 'foo.txt を作成するタスク'
file :foo do |t|
  puts "create #{t.name}"
  IO.write("#{t.name}.txt", t.name)
end

desc '*.rb が存在しない場合、*.txt が存在するかを確認し、存在したら実行する'
rule '.rb' => '.txt' do |t|
  puts "create #{t.name}"
  IO.write(t.name, "puts \'#{t.name.chomp('.rb')}\'")
end

desc 'ディレクトリを作る'
directory 'bar'

namespace :gayaru do
  %w(waiwai gayagaya fumufumu doyadoya).map do |gaya|
    task gaya do |t|
      puts t.name.split(':')[1]
    end
  end

  desc '並列実行でガヤる'
  multitask multi: %w(waiwai gayagaya fumufumu doyadoya)
end
```

---

# Rake でできること 〜夢が広がる Rake の使い方〜

- [いまさら聞けないRake入門](https://www.slideshare.net/cuzic/rake)
  - 2011年なのでちょっと古いスライドだが、Rake で字幕付き動画を作成するという内容
- [Rabbit](https://rabbit-shocker.org/ja/)
  - Rabbit はプログラマ向け（主に Rubyist 向け）のプレゼンテーションツール
  - スライドの作成時およびスライド作成後の支援機能が Rake タスクとして提供されている

---

## まぁ何だったら Rails でだって Rake を使っているよね

---

# Rake のここが辛い？

普通に開発していて辛いなぁと感じることとその解決策

---

# 1. テスト書くの辛くない？

## まずテストの前に、設計を見直してみる

- Rake タスクの中で関数を定義したり、みたいなことをするのは辛い
- Rake タスクの namespace はタスクのカプセル化が目的ではなくタスクの構造化が目的
- > 新規で Rake タスクを作るときは処理を PORO に切り出して、Rake タスクからはこいつを呼ぶだけという実装にしています by morihirok

---

# 1. テスト書くの辛くない？

## テストするための下ごしらえを共通化してみるとよい

- RSpec 内で Rake タスクの実行をするときの処理を毎回書くのがちょっと大変
- 使い回せるような `shared_contexts` を定義して実行しやすくするとよい
- これで Rake タスクを実行したときに処理が呼ばれていることのテストがラクに書ける

[Rspec で rake タスクをテストする用の gem を作った - おもしろwebサービス開発日記](https://blog.willnet.in/entry/2012/11/13/074123)

---

# 2. 引数を渡して実行するの大変じゃない？

## Rake タスクに引数を渡す方法

- 1. タスク毎に引数を定義する
- 2. 環境変数を使う

```shell script
rake 'hello[Alice,Bob]'
rake person1=Alice person2=Bob hello
```

できなくはないけど、正直どちらも微妙。。

---

# 2. 引数を渡して実行するの大変じゃない？

## あなたの作ろうとしているものは、ひょっとすると CLI ツールなのでは？

[erikhuda/thor: Thor is a toolkit for building powerful command-line interfaces.](https://github.com/erikhuda/thor)

- バッチ処理実行などのタスクランナーを作りたいときは、Rake よりも Thor のほうが作りやすそうだなと思った
- 構文は Rake に似ているので、ほとんどの Rake ユーザーにはおなじみのはず

```ruby
# ./cli.rb
class MyCLI < Thor
  desc "hello NAME", "say hello to NAME"
  def hello(name)
    puts "Hello #{name}"
  end
end
```

```shell script
$ ruby ./cli hello hey
```

---

# どうして今さら Rake の LT を？

業務で普通に使ってるし...
みんな普通に知っていることでしたね。

**Rake の作者を知っていますか？**

---

# Rake の作者

[Rake -- Ruby Make](https://ruby.github.io/rake/)

> Historical
> Rake was originally created by Jim Weirich, who unfortunately passed away in February 2014. This repository was originally hosted at github.com/jimweirich/rake, however with his passing, has been moved to ruby/rake.
> You can view Jim's last commit here: github.com/jimweirich/rake/tree/336559f28f55bce418e2ebcc0a57548dcbac4025
> You can read more about Jim at Wikipedia.
> Thank you for this great tool, Jim. We'll remember you.

---

Rake は当初、残念ながら2014年2月に亡くなった Jim Weirich によって作成されました。このリポジトリは、最初は github.com/jimweirich/rake でホストされていましたが、これは ruby/rake に移動しました。
ここでジムの最後のコミットを確認できます： github.com/jimweirich/rake/tree/336559f28f55bce418e2ebcc0a57548dcbac4025
あなたは Jim についての詳細をウィキペディアで読むことができます。
このすばらしいツールをありがとう、Jim。あなたを忘れません。

---

# Jim Weirich 最後のコミット

[Put testing gems in both the development and test Gemfile groups · jimweirich/wyriki@d28fac7](https://github.com/jimweirich/wyriki/commit/d28fac7f18aeacb00d8ad3460a0a5a901617c2d4)

---

# 感じたこと

- もし自分が死んだとしても、コードやアウトプットしたものは残り続ける
- 日々使っているツールや言語は、必ず誰かが作っている
- 私たちもまた、誰かに使ってもらえるようなものを作っている

---

# まとめ

- Rake は良い
- 作り手と使い手、双方への感謝 🙏