Edited at

ドットファイルのコピースクリプトを作ってみた

More than 3 years have passed since last update.


目的

新しく環境作るとき、ドットファイル(.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);
}

# ドットファイルコピー
&copy_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();


要約すると、やっているのはこれだけ。

# ドットファイルコピー

&copy_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

作ってから思ったけど、ファイルコピーのところは、ソフトリンクにすればもっと運用楽になるかもなあ