# 建立 .dotfiles 以便在任何 Macbook 上都可以擁有相同的開發環境 ###### tags: `開發環境` ## .dotfiles 是什麼? 一般來說軟體的設定檔案都會在 Home directory(家目錄)建立隱藏 directory(檔名開頭為 `.` 開頭),這些隱藏檔案裡面就會有軟體的設定檔案,比如說目前開發使用的 `Neovim`,就會在 Home directory 的 `.config` 建立 `nvim`,在 `nvim` 裡面就是 `Neovim` 設定檔案存放的地方。 ![](https://hackmd.io/_uploads/S1n3QgF4i.png) (`.` 開頭為隱藏檔案) .dotfiles 其實就是一個 directory,達配指令就可以把設定檔案移到 .dotfile 內,並且同時「連結」到 Home directory,我們就可以把 .dotfile 內的設定檔案推上雲端帶著走,確保在每個裝置上都可以保持相同的 workflow。 ![](https://hackmd.io/_uploads/HyedQgK4s.png) (家目錄) ## 取得使用 `Homebrew` 下載的軟體清單 `Homebrew` 是 macOS 的套件管理工具,使用 macOS 的電腦推薦下載 `Homebrew`,並且「儘量」透過 `Homebrew` 下載軟體。 > A key practice is to install EVERYTHING possible using brew, brew cask, or mas. Even things like fonts! > 但不要使用 `Homebrew` 下載 `nvm`(管理 Node 檔案的工具),因為官方有說明使用 `Homebrew` 下載 `nvm` 會出現一些問題,因此 `nvm` 還是上網找怎麼不使用 `Homebrew` 下載 > 可以查看 [Homebrew 筆記](https://pjchender.dev/app/homebrew/) 內有基本 `brew` 指令 ### 建立 `Brewfile` `brew bundle dump --describe` 可以透過指令建立 `Brewfile`(裡面是所有透過 `Homebrew` 下載的檔案清單) ![](https://hackmd.io/_uploads/SJxIreFEi.png) ### 更新 `Brewfile` > 記得先移動到 `.dotfiles` 再建立 `Brewfile` `Brewfile` 已經存在但想要更新的話就要下另一組指令 `brew bundle dump --force` or `brew bundle dump --describe --force` 其餘的 `Brewfile` 的說明可以看這篇 [Brew Bundle Brewfile Tips](https://gist.github.com/ChristopherA/a579274536aab36ea9966f301ff14f3f) ## 把在 Home directory 的設定檔移到 `.dotfiles` 內 `mv sourceFile targetDirectory` 可以把檔案移到想要的地方,比如說 `mv ~/.zshrc ~/.dotfiles/zsh/` 那麼原本在 Home directory 的 `.zshrc` 就會移到 `~/.dotfile/zsh/` 的 directory 之內了。 ## 快速地將 `.dotfiles` 的設定檔連結到 Home directory 之內 因為軟體還是會從 Home directory 找設定檔案,當我們把設定檔案移到 `.dotfiles` 的話就會造成軟體吃不到設定,所以需要使用另一個指令連結 `.dotfile` 內的設定檔案 `ln -s sourceFile targetDirectory` > `ln` (stands for link) > `-s` (stands for symbolic) 比如說使用 `ln -s ~/dotfiles/.zshrc ~/.zshrc` 那麼就會把 `.dotfile` 內的 `.zshrc` 連結到 Home director。所以在 Home directory 就會出現被連結的 `.zshrc` ![](https://hackmd.io/_uploads/ryebHbFVi.png) (被連結的 `.zshrc` 在 Finder 中會出現小小的箭頭標示) ![](https://hackmd.io/_uploads/HkdVBZYEj.png) (用終端機看也可以發現 `.zshrc` 有顯示連結資訊) ## 用 GNU Stow 可以更快速地連結檔案 使用 [stow](https://formulae.brew.sh/formula/stow) 可以更快速地連結檔案,==但是要注意檔案結構要與 Home directory 相同== 一樣透過 `Homebrew` 下載 `brew install stow` ### `.dotfiles` 是一個外層檔案夾,每個直接放在 Home directory 的設定檔多用一層包起來就可以 ![](https://hackmd.io/_uploads/By2aIWF4s.png) - `.dotfiles` 是一個裝檔案的容器 - 為每個設定檔建立 directory - 如果該設定檔原本在 Home directory 就直接裸露(沒有任何 directory 包覆)那麼就建立一層 directory 即可 ```shell= /Users/liuweilun ├── .dotfiles │ ├── zsh │ │ └── .zshrc ├── .zshrc ``` - 如果該設定檔本來在 Home directory 是巢狀的結構,那麼在 `.dotfiles` 內建立第一層 directory 後就要模仿 Home directory 的結構 ```shell= /Users/liuweilun ├── .dotfiles │ ├── nvim │ └── .config │ └── nvim | ├── init.lua | ├── lua | └── spell ├── .config | └── nvim | ├── init.lua | ├── lua | └── spell ``` > 可以看到 `.dotfiles/nvim/` 的結構跟原先 Home directory 相同 ### 使用指令 `stow` 快速建立連結 完成設定檔移到 `.dotfiles` 內的工作後,就可以用 GNU Stow 提供的指令快速在 Home directory 建立連結 1. `stow directoryName` 依照 `directoryName` 在 Home directory 建立連結 > `stow zsh` 那麼在 Home directory 就會建立其連結 2. `stow */ # Everything (the '/' ignores the README)` ==但要記得在新的電腦事先安裝 `stow`!== > 教學 Youtube > 1. [Manage your dotfiles across multiple machines with GNU Stow and Git](https://www.youtube.com/watch?v=90xMTKml9O0) > 2. [Manage Your dotfiles Like A Superhero](https://www.youtube.com/watch?v=FHuwzbpTTo0&t=1380s) ## 拿到新電腦後該如何快速建立舊有的開發環境 ### Step 1: 下載 `Homebrew` ### Step 2: 下載 `nvm` > 可以參考 [[NodeJS] 透過 NVM 安裝與使用 Node.js](https://pjchender.dev/nodejs/nvm/) ### Step 3: `clone` Github 上建立 `dotfiles` repo 至本機端 > `git clone Repo ~/.dotfiles` > clone repo 至 `~/.dotfiles` ### Step 4: 下載 `stow` `brew install stow` ### Step 5: 下載 `Brewfile` 中所有的 packages `brew bundle --file ~/myFolder/Brewfile` *ref. [Manage all your installed software at one place with Homebrew Bundle](https://pumpingco.de/blog/brewfile/)* (根據這個人分享,這樣子 `Homebrew` 就會自動下載 `Brewfile` 中的所有 packages 了) 或者 `brew bundle install` (但這個指令會需要 `Brewfile` 在以下 path: `~/Brewfile`) #### 別擔心,並不會重複下載已經有的 packages > It will automatically skip software that’s already installed. *ref. [Easy macOS Loads By Way of Homebrew Bundle - Casey Liss](https://www.caseyliss.com/2019/10/8/brew-bundle)* 另外,如果卡住要等一段時間的話也是很正常的,就慢慢等吧。 ## iTerm 配置 ![](https://hackmd.io/_uploads/HkGPEwKNi.png) ![](https://hackmd.io/_uploads/BJMP4DF4j.png) ![](https://hackmd.io/_uploads/Skzv4DtNj.png) ## Gitlab 建立 SSH key 讓 sourcetree 可以直接 clone gitlab 的專案 可以參考這邊的[教學](https://sinyilin.github.io/git/20191024/1014042378/) 1. clone 的時候選擇 `ssh` ![](https://hackmd.io/_uploads/BJY8C6Ayh.png) 2. 把複製的 `ssh` 貼上 source url,sourcetree 就會自動填入資訊 ![](https://hackmd.io/_uploads/B1AjAaAJn.png) ## 如果 tmux 無法刪除文字可以試試這個方法 [Backspace not working in tmux command prompt](https://stackoverflow.com/questions/51488920/backspace-not-working-in-tmux-command-prompt) ## tmux 記得要手動下指令下載套件 ## 如果發現 `brew bundle install` 多一層,就必須把裡面的東西拿出來 ``` .dotfile/ -> 設定檔案(v) .dotfile/ -> dotfile/ -> 設定檔案(x) ``` ## Mos 設定 ![截圖 2024-03-11 20.35.17](https://hackmd.io/_uploads/BkLTcOnT6.png) ![截圖 2024-03-11 20.35.23](https://hackmd.io/_uploads/SkIpqOhT6.png) ## 參考資訊 1. [Setting up new M1 Max MacBook Pro - Apps that I use for my app dev](https://www.youtube.com/watch?v=RNqDkF17ogY) -> 內有基本安裝 Homebrew 及 iterm2 後抓 dotfiles 的流程 2. [Manage Your dotfiles Like a Superhero](https://www.jakewiesler.com/blog/managing-dotfiles) 3. [Using GNU Stow to Manage Symbolic Links for Your Dotfiles](https://systemcrafters.net/managing-your-dotfiles/using-gnu-stow/) 4. [brew-bundle-brewfile-tips.md](https://gist.github.com/ChristopherA/a579274536aab36ea9966f301ff14f3f) => brewfile 的 tips