# Rake怎麼用
在安裝ruby時就會一併送給我們的工具程式,自動化建構軟體。
我們建立一個資料夾來處理吧
在vscode裡終端機對的目錄下處理
```
$rake
-> 跳出找不到rakefile
```
沒關係我們就來新增他要的rakefile
用vscode在該資料夾下新增rakefile
我們就可以在rakefile裏面定義我們想要的任務想要做的工作
假設我們要寄送email
在撰寫定義時
起手式會用到的
:::info
task(工作;任務) :任務名稱 do
...
end
:::
舉個例子:做一個寄送信件的任務
```ruby=
task :sendmail do
puts "sending email..."
end
# 改寫一下增加效果
sleep 2 睡兩秒 讓他演個戲
ruby=
task :sendmail do
puts "sending email..."
sleep 2
puts "done!"
end
```
定義好了我們就在終端機執行看看
```$rake sendmail```

完成第一個任務啦~
為了更完善,我們可以給任務下描述```desc "內容 "```
透過```$rake -T``` or ```rake --task```可以讓大家了解,這裡有哪些任務跟任務簡述
```ruby=
desc "postman" ->此為描述
task :sendmail do
puts "sending email..."
sleep 2
puts "done!"
end
```
```
$rake -T
有下描述的任務有哪些(目前在這裡有哪些指令哪些任務)
->rake sendmail # postman
我有一個寄信任務 #描述為郵差先生
```
看起來rake很成功,如果我們只執行rake會怎樣呢?
```
$rake
```

啊!好像不能,來看看訊息提示了些什麼?
原來```$rake```是會去**抓預設的rake**但我們尚未設定~
```ruby=
desc "postman"
task :sendmail do
puts "sending email..."
sleep 2
puts "done!"
end
task :default => :sendmail
```
我們就在最後一行加上預設指向任務,接下來執行rake不加任何參數時,就會執行我的預設

### 相依性
任務有相依性Hmmm
用任務A => 指向任務B
語意上比較像是「你要A的話,要先過B這關,才可以!」
舉個例子:下面我寫吃飯跟健康,吃飯前先過洗手這關(健康啊)
```ruby=
task :eat => :health do
puts "yummy"
end
task :health do
puts "wash your hands! "
sleep 2
end
```
當我執行```$rake eat```
先洗手才吃飯

**在rails內建有個做好的預設task**
```=> :environment```在把整個rails環境載入進來,
包含model、controller...全都載進來
### 指令通用
我們在具現化用到的指令```$rails db:migrate```
其實也是rake指令唷 在rails 5之後怕記不住 一下rake 一下rails 就把rake指令,挪一份給rails
```
$rake -T
$rake --task
$rails -T
$rails --task
$rake db:migrate ->$rails db:migrate
```
所以說效果是一樣的:)
若要 ```$rake migrate```
```ruby=
task :migrate do
puts "migration!"
end
```
但我們的db:跑去哪 這時候我們可以用namespace包一層一層,他是可以包很多層的
```ruby=
namespace :db do
task :migrate do
puts "migration!"
end
end
```
撰寫位置可參考,整包檔案的**Rakefile有說明檔**
 
:::info
新增撰寫處為:資料夾lib->task ->檔名.rake
:::