LoginSignup
2
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-07-17

目的

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

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

2
1
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
2
1