!Ubuntu-20.04.1 !ruby-2.7.1p83
これは講義用のまとめサイトです。見た人は是非LGTMを押しといてください。
やったこと
- rake
- command_line
rake
rakeとは、makeコマンドのruby板である
makeコマンドとは、MakeFileに記述したコマンドを一挙に実行するコマンド
rakeも同様にRakeFileにコマンドを書いておけばいちいちいくつもコマンドを打たなくてもいいというものらしい
つまり、gitにアップロードするときに毎回「git pull~」「git add~」「git commit~」「git push~」と打ってたのを一発で実行できるようにしたりできる。こう言われると確かに嬉しい気がする
とりあえずコピペ
task :default do
system 'rake -T'
exit
end
desc 'hello NAME'
task :hello do
name = ARGV[1]
puts "Hello #{name}!"
exit
end
で、
>rake hello World
>Hello Wordl
となる。これはつまりRakefileの中の「hello」というtaskを実行したことになる。
なお、「desc 'hello NAME'」のdescって何?机?と思って調べたら、descはdescription、つまり単にtaskの説明を書いてるものらしく、なくてもよかった
(12/16追記)
先生からのコメントによると、descを書いておくことでhelpなどで説明が出るようになるので(暗黙的に)なくてはならない物だそうです。
gitの操作を一発でできるようにしよう
system callで実用的なtaskを作っておこう
desc 'git push'
task :push do
p comm = "git pull origin main"
system comm
p comm = "git add -A"
system comm
p comm = "git commit -m \'commit\'"
system comm
p comm = "git push origin main"
system comm
exit
end
これはgitにアップロードする際の一連のコマンドをまとめたtaskである。これをRakefileに書き込んでおけば、さっきと同じ要領で
> rake push
とするだけでなんとgitにアップロードできちゃうのです。こりゃだいぶ楽になった
しかも変数も使えるらしく、例えばコメントのところは毎回違う内容を入れたいならARGV[0]で入力を受け付けてやれば実現できる
command_line
上ではsystem関数を呼び出して無事gitのアップロードが楽になりましたと言いたいところだが・・・このやり方はsystemで外部のコマンドを呼び出してるので高速ではないらしい
そこで組み込み関数を学んでプログラムを高速化することを考える
標準出力を得たい
目標:組み込み関数を使ってほかの人のREADME.orgの情報を得てデータを成形し、標準出力を取り出す
その前に
> gem install command_line
でcommand_lineというgemをインストールしておく。これは標準出力を取り出すためのもので、ruby2.4以上じゃないと使えないらしいけど、一応確認すると2.7.1を使ってるので無問題
とりあえず最初の5人分テストで取り出してみることにする
require 'command_line/global'
desc 'make list'
task :mk_list do
targets = "../**/README.org"
# systemを使った場合
# system 'ls -1 {#targets}'
# p targets
# command_lineを使った場合
Dir.glob(targets)[0..4].each do |file|
p file
res = command_line "grep qiita_id #{file}"
p res.stdout
end
exit
end
targetsに拾ってきた各人のREADME.orgへのパスが入る。
組み込み関数のDir.globはsystem関数でlsで呼び出してた動作を代替している。ここではとりあえず0番目から4番目を呼び出してる
取得した各ファイルについて、eachでファイル名、そして各ファイル内にあるqiita_idを出力させている
結果
"../0922tooy/README.org"
"#+qiita_id: 0922tooy\n"
"../acoe5781/README.org"
"#+qiita_id: Acoe\n"
"../adchello/README.org"
"#+qiita_id: adchello\n"
"../batamon-427/README.org"
"#+qiita_id: batamon-427\n"
"../createiveIKEP/README.org"
"#+qiita_id: creativeIKEP\n"
はい、5人分のqiita_idが取得できましたね。まあsystemで全員分のREADME.org呼び出す操作を実行したところで、この程度の人数なら見た目では別に差はないんですが
参考記事
チャート式ruby-appendix-IV(rake) Rakeで自動化&Export
- source ~/MasahiroOba/grad_members_20f/members/MasahiroOba/chapter8.org