俺のガチってるdotfiles紹介

2024/12/18に公開

はじめに

どうもです。3-shakemelanmeg です

今回は dotfiles 紹介です。

エンジニアにとっては、dotfiles は作業効率を上げるための 自分用チートシート のように感じています。もしくは これまで コツコツと積み上げてきた財産 ...ですかね。

普段から使い慣れた環境をどこでも再現できるようにしておくことで、複数の端末で素早く自分好みの環境を用意できます!

シェルやVSCodeのカスタマイズ、Gitの便利設定、そして新しいVMでの簡単なセットアップ方法を紹介します。dotfiles管理の魅力を共有し、皆さんの環境構築がもっと楽しくなればと思います🙇

私の dotfiles リポジトリはこちら👇

https://github.com/melanmeg/dotfiles

それでは、私自身が日々使い込んでいるdotfilesについて説明していきます。

1. そもそもdotfilesとは?

みなさんご存知だと思いますが、設定や構成情報を保存するために使用される隠しファイルや隠しフォルダのことです。 ls -a で表示がされるドットで始めるあれです。

dotfilesのメリット

自分用VSCodeやシェルのAlias、自前のセットアップスクリプトで環境を素早く構築できるところだと思ってます。新しい端末を支給された場合、高速に環境セットアップすることで、業務にも役立ちます。

2. 環境とツール

使用環境はざっとこんな感じです。

種類 名前
OS Ubuntu 24.04
エディタ VSCode
シェル bash

端末はWindowsです。端末はMac, LinuxよりWindows派です。

3. dotfilesの構成

  • こちらディレクトリ構成です
ディレクトリ構成
.
├── .bashrc
├── .bin
│   ├── Makefile.multipass
│   ├── clear_ssh_folder_cache.bat
│   ├── dotfiles
│   ├── dotfiles_arm
│   ├── gen_tls_certs.sh
│   ├── install-clis.sh
│   ├── install-cloudflared.bat
│   ├── install-golang.sh
│   ├── install-recommended-vscode-extensions.sh
│   ├── setup-libs.sh
│   ├── setup-ubuntu.sh
│   └── setup-zsh.sh
├── .colorrc
├── .env.sample
├── .gitconfig_shared
├── .github
│   └── workflows
│       └── check.yml
├── .gitignore
├── .gitignore_global
├── .mise.toml
├── .my
│   ├── aliases
│   │   ├── infra
│   │   │   ├── ansible.sh
│   │   │   ├── docker.sh
│   │   │   ├── kubernetes.sh
│   │   │   ├── mise.sh
│   │   │   └── terraform.sh
│   │   ├── my.sh
│   │   ├── shell
│   │   │   ├── env.sh
│   │   │   ├── main.sh
│   │   │   └── terminal.sh
│   │   └── tools
│   │       ├── database.sh
│   │       ├── k6.sh
│   │       ├── language.sh
│   │       └── stat.sh
│   ├── bak
│   │   └── default.ubuntu24.bashrc
│   ├── cheatsheet.infra.sh
│   ├── cheatsheet.k8s.sh
│   ├── cheatsheet.sh
│   ├── cheatsheet.vim.sh
│   ├── nodejs
│   │   ├── .gitignore
│   │   ├── package-lock.json
│   │   └── package.json
│   ├── poetry
│   │   ├── poetry.lock
│   │   └── pyproject.toml
│   └── zsh
│       └── base.zsh
├── .vim
│   ├── colors
│   │   └── molokai.vim
│   ├── functions.vim
│   ├── keymaps.vim
│   ├── lets.vim
│   └── options.vim
├── .vimrc
├── .vscode
│   ├── extensions.json
│   ├── launch.json
│   └── settings.json
├── .zpreztorc
├── .zshrc
├── LICENSE
├── README.md
└── develop
    ├── .gitignore
    ├── Cargo.lock
    ├── Cargo.toml
    ├── Dockerfile
    ├── README.md
    ├── docker-compose.yml
    └── src
        ├── README.md
        ├── handlers
        │   ├── args_handler.rs
        │   ├── cmd_handler.rs
        │   └── mod.rs
        └── main.rs

19 directories, 68 files

いつの間にかこれほどボリューミーになってました...

ディレクトリ構造の説明

※重要なディレクトリ、ファイルをピックアップ

ディレクトリ 説明
.bin 環境セットアップ系スクリプト
.my エイリアスのすべて
.vscode vscode設定のすべて
develop rustで開発したdotfiles(バイナリ)開発用
.mise.toml mise設定ファイル
  • 一応 zsh 系ファイルも置いてあるが使ってない

4. おすすめ設定の紹介

.mise.toml

まずは mise について

miseをご存知でしょうか?Rust製パッケージ管理ツールで、あらゆるインフラツールをファイルで一括インストールできる優れものです。

バージョン管理もできるし、ダウンロードも高速です

ここにダウンロードできる一覧があります

https://mise.jdx.dev/registry.html

.vscode/

次に vscode/ です

VSCodeを使っている人は settings.jsonextensions.json これがないと仕事にならなくなるんじゃないですかね。自分だけかもしれません。

とりあえず言語周りやdocker, terraform, ansible, nginx, jinja とか適当に突っ込んどけば、syntaxが効いて便利だと思ってます。

Dependiってツールとかバージョンが新しいかチェックしてくれて面白いと思ってます。

.gitconfig_shared

これはそのままの意味で、gitの共通設定を入れるファイルです。
pager設定やrebase設定など、突っ込んで置きたい設定を入れておくのが良いです。

[core]
  pager = delta
[interactive]
  diffFilter = delta --color-only
[delta]
  diff-so-fancy=true
  keep-plus-minus-markers=true
  minus-emph-style="bold 94 89"
  plus-emph-style="bold 29 29"
  hunk-header-style="omit"
  line-numbers=true
[pull]
	rebase = true

.bin/

これはスクリプトを配置してます。
真っ新なUbuntuに最初にインストールするためのセットアップ用スクリプトが用意されています。

  • setup-libs.sh
    ここでは、miseでインストールしていない、必要なライブラリすべてインストールする処理を入れています。
    (例:docker, ansible, mise, rust ...)

  • install-clis.sh
    ここでは、miseでインストールしていない、必要なツールすべてインストールする処理を入れています。
    (例:poetryでインストールするもの, npmでインストールするもの, その他便利ツール ...)

.my/

最後に .my/ です

これは膨大になりすぎて、説明が大変なので簡単に紹介します。
ほとんどは .bashrc から読み込ませるエイリアスをすべて記載している感じです。

例えば terraform だとこのように

alias tf='terraform'
alias tfi='terraform init'
alias tfs='terraform show '
alias tfl='terraform state list'
alias tfp='terraform plan'
alias tfa='terraform apply --auto-approve'
alias tfd='terraform destroy --auto-approve'
alias tfr='terraform refresh' 

ansible だと

alias play="ansible-playbook --key-file ~/.ssh/main -i hosts playbook.yml"
alias playc="ansible-playbook --key-file ~/.ssh/main -i hosts playbook.yml -C"

docker だと

# docker
alias d='docker'
alias dp='docker ps -a'
alias drm='docker rm -f $(docker ps -aq)'
alias drmi='docker rmi -f $(docker images -q)'
alias deli='sh -xc "docker rm -f $(docker ps -aq); docker volume prune -a -f; docker system prune -a -f"'
alias dsys='docker system df'

# docker-compose
alias dc='docker-compose'
alias dcp='docker-compose ps -a'
alias dcu='docker-compose up -d'
alias wdcp='watch docker-compose ps -a'
alias dcb='docker-compose build'
alias dcd='docker-compose down'
alias dceli='docker-compose down --rmi all --volumes --remove-orphans'

kubernetes だと

# shellcheck disable=SC1090
if command -v kubectl &> /dev/null; then
  source <(kubectl completion bash)
  alias k='kubectl'
  complete -F __start_kubectl k
fi

alias kcv='kubectl config view -o jsonpath='\''{.users[*].name}'\'''
alias kgn='kubectl get node -A'
alias kgp='kubectl get pod -A'
alias kgpw='kubectl get pod -A -o wide'
alias kgs='kubectl get svc -A'
alias kgd='kubectl get deployment -A'
alias kgstate='kubectl get statefulset -A'
alias kgsc='kubectl get storageclass -A'
alias kgname='kubectl get namespace -A'
alias kak='kubectl apply -k ./'
alias kd='kubectl describe'

他にもcheatsheet.sh ファイルにコマンドのメモを書いて置いたりしています。

更にこれらの他にも紹介しきれてないファイルはシェル読み込みのロジック、環境変数の管理手法など、もありますが、今回は紹介はしてません。

もし興味のある方はGithubのコードを見て頂けたなら嬉しいです。

5. 俺のガチってるポイント

背景

dotfilesの運用は少し難しいです;;

下手に既存のドットファイルを上書きすれば大変ですし、シェルでドットファイルをコピー、バックアップするのは少しやりずらいです。

私も初めは、シェルスクリプトで運用してましたが、多少複雑化したり条件文やループ、配列を扱いだす内に予期せぬ挙動がよく起こりました。

悩んでいたところ RustでCLIアプリ化しちゃお!!

てな感じにできたのが、dotfiles(バイナリ)です。

dotfiles(バイナリ)の使い方

  • 使い方
git clone https://github.com/melanmeg/dotfiles.git
./dotfiles/.bin/dotfiles --backup --gitconfig-shared

# ARMで動かす場合
./dotfiles/.bin/dotfiles_arm --backup --gitconfig-shared
  • Help
$ ./dotfiles -h
Rust CLI for Dotfiles.

Usage: dotfiles [OPTIONS]

Options:
  -f, --force             Force overwrite
  -b, --backup            Backup dotfiles
  -l, --link              Link to homedir
  -g, --gitconfig-shared  git config (.gitconfig_shared)
  -h, --help              Print help
  -V, --version           Print version

基本的に ./dotfiles -b または ./dotfiles -bg だけしか私は使ってないです。

  • -bを付けると、ドットファイル(ディレクトリも)だけを ~/.dotbackup にバックアップ
  • -gを付けると、.gitconfig_shared ファイルを ~ にコピーする

また、デフォルトの動作は Gitのルートディレクトリ( .bin/ の一つ上の階層)にあるドットファイルをホームディレクトリ(~)にコピーします。

例えば ./dotfiles -bgであれば以下の挙動になります

  1. ドットファイル(ディレクトリも)だけを ~/.dotbackup にバックアップ
  2. Gitのルートディレクトリにあるドットファイルをコピーする
  3. .gitconfig_shared ファイルを ~ にコピーする

dotfiles(バイナリ)の開発

develop/ が開発ディレクトリです。

言語は Rustclap というCLI開発を楽にするライブラリを使用してます。
ぶっちゃけRustは勉強中でいわゆるクソコードになっている可能性大ですw

ですが、Rustで作るとやはり実行速度は速いなと実感しました。
また clap が便利だったり、型安全なRustは CLI開発に向いている気がしました。あとメモリ安全も

6. まとめ

私にとって開発効率は命。とまでは行きませんが、今後も作業効率、生産性を上げていきたいです。

最終的には、こうなれればいいな~とか思います。

...そんな簡単な話ではないと思いますがw

紹介は以上です、ご一読ありがとうございました

Discussion