概要: 設定ファイル類を perl と make と Subversion を使って管理する
で、以下スクリプト。
#!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
で反映、という感じでかなり楽な感じ。
まあでも設定ファイルに書く設定の値がよく分かりません><になってるので、 そこら辺調べながらやってるので遅々として進まないんだけど。
まあ一応公開してみたので良かったら使ってみてください。
#FIXME