Git管理するdotfilesのススメ - 自分の開発環境を持ち歩こう -

<img width="375" alt="スクリーンショット 2018-12-21 20.18.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/28500/a020f41c-0135-eaa4-b865-8f4f5f2f45fa.png">

## ターゲット
エンジニアたるもの、自分に最適な開発環境を組み上げることは
サービス開発速度を大きく左右する一つの大きな要素だと考えています。

shellはzsh、iTerm2を入れてテーマはicebergで、さらにあらゆるCLIをインストールする…等。
すごく楽しい作業でもありますが、なかなか時間を使ってしまう作業でもあります。
また新しく社用PCを受け取ったりすると、自分のPCの環境を再現しようとするとこれもまた手間がかかる…。

と今まで思っていた方には、きっと良い気付きの記事になるのではないかと思います！

## 筆者のリポジトリ
:smiley: [issy-s16 / dotfiles](https://github.com/issy-s16/dotfiles)
↑のリポジトリは`git clone`してREADMEのコマンドを打つだけで、
Mac/CentOS/Fedora/RedHatなどの環境に合わせて、環境構築をばばっと行ってくれます！

丸コピしていただいてもよし、フォークいただいてもよし、自由にお使いください:v:

## dotfilesとは
俗に、なにかしらの設定ファイルのことを指します。
(.bashrc / .vimrc / .gitconfig)といったもの。

また、例えばiTerm2といったGUIツールの環境設定ファイルを含んでいます。
※大抵の設定ファイルが頭に.がつくことから、このように呼ばれています。

今回はそれら設定ファイルをGit管理して、`git clone`すれば環境構築ができるといった状態にしていきます。

## 自分用のdotfilesを作ってみよう
### :beginner: 簡単に始める
dotfilesについては、とりあえず設定ファイルをGit管理するだけでもすごく便利になります！
まずは、さくっと始める方法について記述します。

#### リポジトリを作成する
1. `mkdir ~/dotfiles`
2. `cd ~/dotfiles && git init`
3. `git commit -m 'initial commit' && git push`

#### 設定ファイルをdotfiles配下に移行する
例: .bashrc
1. `mv ~/.bashrc ~/dotfiles`
2. `ln -s ~/dotfiles/.bashrc ~/.bashrc`

※手順2のlnコマンドでdotfiles配下の.bashrcをシンボリックリンクし、
~/.bashrcを参照したときに、dotfiles配下の.bashrcを参照するようにしています。
リンクしておくことで、なにか修正を加えたときに**Git反映されるというメリット**があります。 一元管理！

また、README.mdを作成して、これらの手順をメモしておくとよいです！

#### 一通り設定が移行が終わったら、忘れずに`git push`
1. `git push`

### :thumbsup: がっつり構築する
こちらはがっつり構築編。
「簡単に始める」側では、ただGit管理をするだけでしたが、
こちらでは設定ファイルの配置、他のソフトウェアインストールまで自動化させていきます！

#### setup.shを作成する
1. `vim ~/dotfiles/setup.sh`

```
echo "DOTFILES SETUP START!"

for f in .??*; do
    [ "$f" = ".git" ] && continue
    ln -snfv ~/dotfiles/"$f" ~/
done

echo "DOTFILES SETUP FINISHED! bye."
```

※上記のshellでは、ホームディレクトリ配下にcloneしたdotfilesリポジトリ配下の設定ファイルを
全てホームディレクトリ配下にシンボリックリンクするShellです。これだけでめちゃ便利。

#### ツール系もインストールしてみる

```
echo "run brew doctor..."
which brew >/dev/null 2>&1 && brew doctor

echo "run brew update..."
which brew >/dev/null 2>&1 && brew update

echo "ok. run brew upgrade..."

brew upgrade

formulas=(
wget
curl
tree
openssl
z
colordiff
peco
hub
tig
)

echo "start brew install apps..."
for formula in "${formulas[@]}"; do
    echo "---------------------------"
    echo "installing ${formula}"
    echo "---------------------------"
    brew install $formula || brew upgrade $formula
    echo ""
done

brew cleanup
```

#### OSに合わせて処理を分けてみる
```
setup_mac() {
    if [ "$(uname)" == 'Darwin' ]; then
        # Mac
        echo "Setup for Mac"
        # 何かしらの処理
    fi
}

setup_debian() {
    if   [ -e /etc/debian_version ] || [ -e /etc/debian_release ]; then
        # Check Ubuntu or Debian
        if [ -e /etc/lsb-release ]; then
            # Ubuntu
            echo "Setup for Ubuntu"
            # 何かしらの処理
        else
            # Debian
            echo "Setup for Debian"
            # 何かしらの処理
        fi
    fi
}

setup_redhat() {
    if [ -e /etc/fedora-release ]; then
        # Fedra
        echo "Setup for Fedora"
        # 何かしらの処理
    elif [ -e /etc/redhat-release ]; then
        if [ -e /etc/oracle-release ]; then
            # Oracle Linux
            echo "Setup for Oracle Linux"
            # 何かしらの処理
        else
            # Red Hat Enterprise Linux
            echo "Setup for Red Hat Enterprise Linux"
　　　　　　　　　　　　　　　　　　　　　　　　# 何かしらの処理
        fi
    fi
}

setup_arch() {
    if [ -e /etc/arch-release ]; then
        # Arch Linux
        echo "Setup for Arch Linux"
        # 何かしらの処理
    fi
}

setup_suse() {
    if [ -e /etc/os-release -o -e /etc/SuSE-release ]; then
        # OpenSUSE
        echo "Setup for OpenSUSE"
        # 何かしらの処理
    fi
}

setup_mandriva() {
    if [ -e /etc/mandriva-release ]; then
        # Mandriva Linux
        echo "Setup for Mandriva Linux"
        # 何かしらの処理
    fi
}

setup_gentoo() {
    if [ -e /etc/gentoo-release ]; then
        # Gentoo Linux
        echo "Setup for Gentoo Linux"
        # 何かしらの処理
    fi
}

setup() {
    setup_mac
    setup_debian
    setup_redhat
    setup_arch
    setup_arch
    setup_suse
    setup_mandriva
    setup_gentoo
}

setup
```

テンプレートチックに紹介させていただいたのですが、
実際に動いているものをみたい方は[筆者のリポジトリ](#筆者のリポジトリ)をご覧ください！

## 最後に
記事執筆にあたって、
他にも様々なやり方で環境構築をハックされている方がいらっしゃり、大変勉強になりました。
色んな方のリポジトリや記事を見ることで、僕自身もっとハックしていきたいと思います！

読んでいただき、ありがとうございました！:relaxed: