16
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

楽に配布可能なインストーラーをRubyで作る方法

Last updated at Posted at 2012-10-29

最近流行りのネットから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

という風に実行させると、@@以下に書いたパスへファイルをどんどん保存させていくことができます。

16
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?