開発環境の設定を短縮できるdotfilesを作成したいと思い、いろいろ調べています。
今回は、dotfilesをとりあえず作ってみて、大まかな手順を記録していきます。
dotfilesを作成する流れ
GitHub
で新しいリポジトリdotfiles
を作成する
- Githubにログインしてマイページに進み
repositories
メニューに進む -
New
ボタンから、リポジトリ新規作成画面Create a new repository
に進む -
Repository name
の箇所にdotfiles
と入力する - その他の設定は特にいじらなくてもOK(外部公開したくない場合は
private
を選択) -
Create repository
ボタンでリポジトリ作成完了
作成したdotfiles
リポジトリをホームディレクトリ直下にgit clone
する
- Githubで作成したリポジトリ
dotfiles
をGit管理するために、まずはcloneしてローカルに落としていきます。 - Githubで作成した
dotfiles
リポジトリの画面にて、Quick setup — if you’ve done this kind of thing before
という項目にある、SSH
ボタンを選択します。 - おそらく
git@github.com~~
から始まるユーザー名・リポジトリ名が記載されたコードが表示されるので、そのコードをコピーします。 - 次に、以下のコマンドを順番に実行することで自身のPCローカルリポジトリにcloneしてくることができます。
$ cd ~/ (もしくは cd だけでもOK)
$ git clone git@github.com:[ユーザー名]/[リポジトリ名].git
$ cd dotfiles
$ git init
※ cd ~/
cloneしてくる場所はPCのホームディレクトリ直下です。
※ git clone
はGithubからクローンするGitコマンドです。
※ クローンしたらcd dotfiles
コマンドで対象のディレクトリdotofiles
に移動します。
※ git init
はGitコマンドの一つで、新たにリポジトリを作成するときに使います。
※ git init
コマンドを実行すると、現在のディレクトリに.git
というディレクトリが作成され、その中にGitのリポジトリに必要なデータ構造が作られます。
※ つまり、git init
を実行することで、このリポジトリがGit管理となることを意味します。
なお、git clone
をした段階で、以下のようなファイルが構成されました。
$ tree -a
コマンドを実行
.
├── .DS_Store
└── .git
├── HEAD
├── config
├── description
├── hooks
│ ├── applypatch-msg.sample
│ ├── commit-msg.sample
│ ├── fsmonitor-watchman.sample
│ ├── post-update.sample
│ ├── pre-applypatch.sample
│ ├── pre-commit.sample
│ ├── pre-merge-commit.sample
│ ├── pre-push.sample
│ ├── pre-rebase.sample
│ ├── pre-receive.sample
│ ├── prepare-commit-msg.sample
│ ├── push-to-checkout.sample
│ └── update.sample
├── info
│ └── exclude
├── objects
│ ├── info
│ └── pack
└── refs
├── .DS_Store
├── heads
└── tags
※ 今回、私の場合は、$ git init
を実行した際、このような表示が出ました。
Reinitialized existing Git repository in /***/*****/dotfiles/.git/
リポジトリを再初期化した
という意味のようで、ドキッとしましたが、特にファイルの中身が変わった様子ではなかったです。git clone
した時点で初期化は済んでいて、git init
は今回は不要だったのかな、、、?
ともかく、これでdotfiles
リポジトリをGit管理する下準備ができました。
dotfilesで管理するファイルを選ぶ
- 本題である
何の設定をdotfilesで管理するのか?
ということですが、、、 - 今回は
zsh
のコマンド設定ファイル.zshrc
を保存しましょう。 - 現在保存されている場所はホームディレクトリ直下
~/.zshrc
となっています。
【補足】Zshとは?
- 「ズィーシェル」と読む(もしくは「ゼットシェル」?)。
- ZshはUnixシェルの一つで、シェルスクリプトの実行やコマンドラインでの操作を可能にするツールである。
- Bashと同様に広く使われているが、Zshはより高度な設定やカスタマイズが可能であったり、ユーザーフレンドリーな特性を持っている。
-
.zshrc
ファイルは、Zshの設定ファイルである。 - Zshを使うときに自動的に読み込まれる。
- パスの設定やエイリアスの定義、関数の定義など、Zshの動作をカスタマイズするコードを書くことが多い。
- 保存されるパスは一般的にルートディレクトリ直下
~/.zshrc
であることが多い。 - Mac OSでは隠しファイルなので、
cmd + shift + .
で隠しファイルを表示させないと閲覧・編集できない(FinderやVScodeなどでファイルを開く時)。
※ シェルやシェルスクリプトについては、こちらの記事でまとめています。
【補足】.zshrcに記述しているコード
一応、.zshrc
にどんな設定がなされているかも確認しておきます。
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init - zsh)"
export PATH="$HOME/.nodenv/bin:$PATH"
eval "$(nodenv init -)"
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv init -)"
- このコードは
rbenv(Rubyのバージョン管理ツール)
、nodenv(Node.jsのバージョン管理ツール)
、pyenv(Pythonのバージョン管理ツール)
をセットアップするための設定を行っている。 -
export PATH="$HOME/.rbenv/bin:$PATH"
:rbenvのバイナリ
があるディレクトリをPATH環境変数
に追加している。これにより、どのディレクトリからでもrbenvコマンド
を使えるようになる。 -
eval "$(rbenv init -)"
では、rbenv
を初期化し、シェル
にrbenv
の設定を読み込ませるためのコマンドだ。 -
export PATH="$HOME/.nodenv/bin:$PATH"
これは、nodenvのバイナリ
があるディレクトリをPATH環境変数
に追加している。これにより、どのディレクトリからでもnodenv
コマンドを使えるようになる。 -
eval "$(nodenv init -)"
これは、nodenv
を初期化し、シェル
にnodenv
の設定を読み込ませるためのコマンドである。 -
export PYENV_ROOT="$HOME/.pyenv"
とexport PATH="$PYENV_ROOT/bin:$PATH"
これは、pyenvのルートディレクトリ
とバイナリ
があるをディレクトリをPATH境環変数
に追加している。これにより、どのディレクトリからでもpyenvコマンド
を使えるようになる。 -
eval "$(pyenv init --path)"
とeval "$(pyenv init -)"
これは、pyenv
を初期化し、シェル
にpyenv
の設定を読み込ませるためのコマンドである。
dotfilesに管理したいファイルを保存する
dotfilesで管理するファイルを決めたら、実際にファイルを移動させていきます。
-
mvコマンド
で.zshrc
をdotfiles
にコピーする(念の為、移動ではなくコピーにして、元のファイルも残しておくことにしました。正しいかどうかは正直わからないですが、、、)。
$ mv ~/.zshrc ~/dotfiles/.zshrc
もう一度、tree -a
コマンドで確認してみましょう。
.
├── .DS_Store
├── .git
(中略)
│ ├── heads
│ └── tags
+ └── .zshrc # dotfilesに設定ファイルをコピーできました。
元の場所(パス)ににシンボリックリンクを作成する。
- シンボリックリンクは、Windowsで言うところのショートカットのことです。
-
ln
コマンドは、ディレクトリやファイルへのリンクを登録するコマンドです。 - オプションで
-s
を指定することでシンボリックリンクを作成します。
$ ln -s ~/dotfiles/.zshrc ~/.zshrc
- シンボリックリンクがうまく出来ると、このようにファイルのアイコンに矢印が出来ます。
Git管理しなくて良いファイルを.gitignore
に指定する
- 自分の場合、Mac環境を使っているので、
DS_store
をGitのコミット対象から除外したいです。 - そのため、
dotfiles
ディレクトリに新しく.gitignore
ファイルを作成します。
$ touch .gitignore
- 作成した
.gitignore
ファイルにコミット対象から除外したいファイルを記述します。
# macOS
.DS_Store
-
git status
で確認すると、DS_Storeが変更差分から外れました。これでひとまずOKとします。
$ git status
Untracked files
(use "git add <file>..." to include in what will be committed)
- .DS_Store(コミット対象から外れた)
.gitignore
.zshrc
コミット 〜 プッシュを実施
- ひとまずこれで、コミットし、Githubのリポジトリにプッシュしていきます。
$ git add .
$ git commit -m "initial commit"
$ git push
- これで、dotfilesをGit管理にすることができました。
- あとは、PC環境が変わった際などに、
git clone
し、シンボリックリンクを作成すればOKということになります。
【補足】 make -C
コマンドについて
$ make -C ~/dotfiles
-
make -C ~/dotfiles
というコマンドは、~/dotfiles
ディレクトリに移動してからmakeコマンド
を実行するという意味である。 - この
-C
オプションは、指定したディレクトリでMakefile
を探し、そのディレクトリでmakeコマンド
を実行する機能を持っている。 - だから、
~/dotfiles
ディレクトリにMakefile
が存在する場合、そのMakefile
に書かれたタスクが実行される。 -
$ make -C ~/dotfiles
コマンドは必ずしも実行する必要はない。 - このコマンドは、
~/dotfiles
ディレクトリ内のMakefile
に書かれたタスクを実行するもの。 - なので、
Makefile
が存在しない場合や、Makefile
を使わずにdotfiles
を設定したい場合はこのコマンドを使わなくても大丈夫です。
参考サイト
ようこそdotfilesの世界へという記事を投稿された@yutkat 様のdotfilesは、非常に参考になるかと思います。
また、@rainbartown 様の記事で紹介されていたdotfilesも参考になるので、ぜひご覧ください。
dotfilesを作成する手順について、細かく解説されているこちらの記事も参考になりました。