概要: 設定ファイル類を perl と make と Subversion を使って管理する
http://playrecord.org/archive/config-files-on-Unix/myconf.html設定ファイルをまとめて管理する で Makefile を使って設定ファイルを管理する方法が紹介されてるんだけど、 Makefile を手で生成するのはめんどくせーと言うことで、 サクっと Perl で Makefile を生成するスクリプトを書いてみた。
で、以下スクリプト。
#!perl
use strict;
use warnings;
use File::Find;
use FindBin ();
my $source = $FindBin::Bin;
my @files = ();
find(
sub {
my $path = $File::Find::name;
return if ( -d $path );
if ( $path =~ m{^$source/(.+)$} ) {
my $filename = $1;
# いらないファイルを除外
return if ( $filename eq 'Makefile.PL' );
return if ( $filename eq 'Makefile' );
return if ( $filename =~ m{~$} );
push @files, $1;
}
},
$source,
);
@files = sort { $a cmp $b } @files;
my $generated = q{};
$generated .= q{TARGETS = };
$generated .= join qq{ \\\n\t}, map { "/$_" } @files;
$generated .= qq{\n\n};
$generated .= q{INSTALL = sudo /usr/bin/install -o root -m 0644};
$generated .= qq{\n\n};
$generated .= q{all: ${TARGETS}};
$generated .= qq{\n\n};
for my $path ( @files ) {
$generated .= qq{/${path}: ${path}};
$generated .= qq{\n};
$generated .= qq{\t} . q{${INSTALL} $? $@};
$generated .= qq{\n\n};
}
if ( open( my $fh, '>', 'Makefile' ) ) {
print $fh $generated;
close($fh);
}
自分の所では svk を使ってディレクトリを管理しているので、.svnディレクトリとか除外してないんだけど、
生の Subversion とかで管理してる場合は、いらないファイルを除外の部分で、
.svnディレクトリをを除外するコードを足さないとダメだと思う。
で、使い方。
使い方は簡単で
perl Makefile.PL
という感じで実行すると、実行されたディレクトリ以下のファイルを ルートディレクトリからの場所に対応させた Makefile を吐き出します。
説明しづらいしわかりづらいんで、図で説明すると
~/ config/ # 設定ファイルディレクトリ Makefile.PL # 上記スクリプト home/ nyarla/ .zshrc # /home/nyarla/.zshrcにインストールされる .vimrc # /home/nyarla/.vimrcにインストールされる etc/ apt/ source.list # /etc/apt/source.listにインストールされる
という感じです。
作業の流れとしては、
- 編集したい設定ファイルを
~/configをルートに見立ててコピー perl Makefile.PLを実行 (Makefile が生成される)- 設定ファイルを編集
makeして設定ファイルをインストール
という感じ。Makefile を手で書かなくていいからすごい楽ちんです。
まあでも複数のホストで使用する設定ファイルとか、ディレクトリ構成をルートと対応させてないとか、 そういった場合には手で Makefile を書いたほうが楽かも知れません。 まあ一つのホストだけで管理する場合にはこのスクリプトでだいぶ楽ができると思います。
ちなみにこのスクリプトを書いたとき、区切り文字であるタブ文字でちょっとはまったりした。 まあそれ以外はすんなり書けたけど。
で、実際に perl + make + svk で設定ファイルを管理してるけど、かなり楽ちんです。
設定ファイルを追加したときにperl Makefile.PLして、設定ファイルを書いたらmake、
でまた編集したらmakeで反映、という感じでかなり楽な感じ。
まあでも設定ファイルに書く設定の値がよく分かりません><になってるので、 そこら辺調べながらやってるので遅々として進まないんだけど。
まあ一応公開してみたので良かったら使ってみてください。