目的
新しく環境作るとき、ドットファイル(.bashrcなど)を手動で他の環境からscpしていた。
これをgithubで管理し、導入・更新をスクリプト一発でできるようにする。(だけ)
完全に自分用(趣味)に作ったものですが、これも何かのお役に立つやもと思い。
ディレクトリ構成
自分の場合、githubに「dotfiles」リポジトリを作成し、「files」配下にドットファイル群(またはディレクトリ)を管理しています。
最新版はこちらです。
$ tree dotfiles/
dotfiles/
├── README.md
├── files
└── setup.pl
1 directory, 2 files
$ ls -a dotfiles/files/
. .. .bash_profile .bashrc .profile .vim .vimrc
コピースクリプト
perlで書きました(shellより使いやすいから)
これも、最新版はこちら
使い方は$ perl setup.pl /home/hoge(宛先。通常はホームディレクトリ)
setup.pl
#!/user/local/bin/perl
use strict;
use warnings;
use utf8;
use Term::ANSIColor qw( :constants );
$Term::ANSIColor::AUTORESET = 1;
#
# メイン処理
#
sub main
{
info('############ set up start. ############');
# 引数がない
if (@ARGV == 0) {
error("invalid argument. please assign home dir.");
&print_usage();
exit(1);
}
my $home = $ARGV[0] . '/';
# インストール先のディレクトリがない
if (!(-d $home)) {
error("invalid path. '$home' not exists");
&print_usage();
exit(1);
}
# ドットファイルコピー
©_dotfiles($home);
# colorschmeをインストール
&install_colorscheme($home);
# NeoBundleインストール
&install_NeoBundle($home);
success();
exit(0);
}
#
# dotファイルをホームディレクトリにコピーする
#
sub copy_dotfiles
{
my ($home) = shift;
my $file_root = './files';
exec_cmd("cp $file_root/.bash_profile $home");
exec_cmd("cp $file_root/.bashrc $home");
exec_cmd("cp $file_root/.profile $home");
exec_cmd("cp $file_root/.vimrc $home");
exec_cmd("cp -r $file_root/.vim $home");
}
#
# vimのカラースキームをインストールする
# TODO: 再利用性が低いサブルーチン
#
sub install_colorscheme
{
my ($home) = shift;
info(">>>> start install colorschme");
if (-f "$home/.vim/colors/molokai.vim") {
info("molokai is alerady installed.");
return 0;
}
info("now installing colorscheme");
exec_cmd("mkdir -p $home/.vim/colors");
# molokai
exec_cmd(" git clone https://github.com/tomasr/molokai");
exec_cmd("mv molokai/colors/molokai.vim ~/.vim/colors/");
exec_cmd("rm -fR molokai");
return 1;
}
#
# vimのNeoBundleプラグインをインストールする
#
sub install_NeoBundle
{
my ($home) = shift;
info(">>>> start install NeoBundle");
if (-d "$home/.vim/bundle") {
info("NeoBundle is already installed.");
return 0;
}
info("now installing NeoBundle");
exec_cmd("mkdir -p $home/.vim/bundle");
exec_cmd("git clone git://github.com/Shougo/neobundle.vim $home/.vim/bundle/neobundle.vim");
# gitでコミット実行時、利用エディタをvimに設定
exec_cmd("git config --global core.editor \"vim\"");
return 1;
}
#
# コマンドを実行する
#
sub exec_cmd
{
my ($cmd) = shift;
info($cmd);
my $output = `$cmd 2>&1`;
chomp($output);
my $status = $? / 256;
return ($status, $output);
}
#
# Usageを表示する
#
sub print_usage
{
error("*********** Usage ***********");
error("perl setup.pl /home/hoge");
}
#
# ログ出力
#
sub info { _log('INFO' , shift); } # INFO
sub error { _log('ERROR', shift); } # ERROR
sub success { _log('OK' , 'success!!!!!!!'); } # SUCCESS
sub _log
{
my ($level, $message) = @_;
print "[";
# レベル毎に色付け
if ($level eq 'INFO') {
print BLUE $level;
} elsif ($level eq 'ERROR') {
print RED $level;
} elsif ($level eq 'OK') {
print GREEN $level;
}
print "]";
print "$message\n"
}
# 処理を実行
&main();
要約すると、やっているのはこれだけ。
# ドットファイルコピー
©_dotfiles($home);
# colorschmeをインストール
&install_colorscheme($home);
# NeoBundleインストール
&install_NeoBundle($home);
実行するとこんな感じ
$ perl setup.pl ~/hoge
[INFO]############ set up start. ############
[INFO]cp ./files/.bash_profile /home/monhan/hoge/
[INFO]cp ./files/.bashrc /home/monhan/hoge/
[INFO]cp ./files/.profile /home/monhan/hoge/
[INFO]cp ./files/.vimrc /home/monhan/hoge/
[INFO]cp -r ./files/.vim /home/monhan/hoge/
[INFO]>>>> start install colorschme
[INFO]now installing colorscheme
[INFO]mkdir -p /home/monhan/hoge//.vim/colors
[INFO]git clone https://github.com/tomasr/molokai /home/monhan/hoge//.vim/colors/molokai.vim
[INFO]>>>> start install NeoBundle
[INFO]now installing NeoBundle
[INFO]mkdir -p /home/monhan/hoge//.vim/bundle
[INFO]git clone git://github.com/Shougo/neobundle.vim /home/monhan/hoge//.vim/bundle/neobundle.vim
[INFO]git config --global core.editor "vim"
[OK]success!!!!!!!
工夫したところ
- セットアップ時に、標準出力にかっこよく出力したかったので色付けした
- vim用のプラグインはgithubから取得しているので、取得済みなら何もしないようファイル/ディレクトリの存在チェックを入れた
- カラースキームはmolokai固定(笑)
運用する上で
- githubには共通の設定のみ上げておいて、環境ごとの設定は例えば
.profile.local
など、ローカルファイルに記述。それを.profile
などから読み込むようにしました
.profile
if [ -f ~/.profile.local ]; then
. ~/.profile.local
fi
作ってから思ったけど、ファイルコピーのところは、ソフトリンクにすればもっと運用楽になるかもなあ