最近流行りのネットからcurlでコードを落としてきてシェルに投げてインストールさせる
コードってどうやるのかなーってのを考えてました。
RVMの場合
$ \curl -L https://get.rvm.io | bash -s stable --ruby
でもそもそもシェルスクリプト書くの面倒だしRubyで書けないかな〜と模索していた所、__END__以下にファイルを埋め込んで保存するという方法を思いつきました。
以下サンプルです。
installer.rb
# !/usr/bin/env ruby
require 'fileutils'
data = DATA.read
file_list = data.split(/^(@@.*?)$\n/m)
description = file_list.shift
puts description
iterator = (0...file_list.size/2).map{|x| x * 2 }
for i in iterator
path = file_list[i].sub('@@','')
puts path
FileUtils.mkdir_p(File.dirname(path))
File.open(path, 'w') do |f|
f.puts file_list[i+1]
end
end
__END__
description
hogehoge
@@a.rb
p 'hello'
@@lib/hoge/b.rb
p 'good bye'
Sinatra等でよくテンプレートを埋め込んで使う方法と同じです。DATAで読み込める領域は基本的には複数ファイルに対応しておりませんが、以下の正規表現で、@@の行で中身を分割して、ファイルをどんどん保存していくという方法です。(splitに()を含めると()内でマッチした部分も返り値に含まれます。)、
file_list = data.split(/^(@@.*?)$\n/m)
ただ、この正規表現だと、一番最初の@@の部分の前に改行が含まれてしまうっぽいので、__END__直後の部分に何らかの説明を入れておくと良いかもしれません。
このコードをサーバに置いて、仮にhttp://example.com/installerで配布する場合は、
$ curl http://example.com/installer | ruby
という風に実行させると、@@以下に書いたパスへファイルをどんどん保存させていくことができます。