1. 程式人生 > >管理linux下軟體的配置檔案dotfile(rc files)

管理linux下軟體的配置檔案dotfile(rc files)

在linux下,各種軟體的配置檔案大多儲存於以“.”開頭以“rc”結尾的檔案中並存放於使用者的個人目錄~/中,也就是俗稱的dotfile或者rc file,例如zsh的配置檔案.zshrc,vim的配置檔案.vimrc等等。

當我們初次使用一些軟體時經常會花大量時間對相應的dotfile(rc file)進行配置,讓軟體以符合我們期望的方式工作,在使用時也時常會對dotfile進行調整。但是當我們希望在新電腦上恢復多個軟體配置或者在多臺電腦上共享一臺電腦對dotfile的修改時,逐一對各個dotfile進行管理非常不方便。

所以我來介紹一下我管理dotfile的方式

所需軟體介紹

我在管理dotfile時用到的軟體是在Github上開源的

rc file management(rcm)軟體,這個軟體主要思想就是將所有你希望用rcm管理的dotfile移動並集中儲存在一個目錄中(預設是在~/.dotflies下),並在你的個人目錄下建立所有被rcm管理的dotfile的符號連線(symlink)。如果你熟悉這個軟體可以看看我的日常使用方法章節。

我們可以在該集中儲存目錄下建立git repository進行版本控制,同時也可託管到github或gitcafe上方便多臺機器共享。當你希望使用別人分享給你的rcm目錄下的dotfile時則rcm可以利用多目錄儲存管理功能,同時呼叫多個分享目錄下的檔案。

這套軟體主要包括了一下4個命令和一個配置dotfile檔案~/.rcrc(注意在安裝好rcm後不會有配置檔案,若要使用需手動建立)

  • lsrc:列出當前所有通過rcm管理的dotfile,以及其對應的符號連結位置
  • mkrc:將指定的dotfile移動至你的集中儲存目錄,並在~/目錄下建立相應的符號連結
  • rcup:根據rcm管理的dotfiles更新當前使用者目錄下已存在的符號連結或建立新的符號連結
  • rcdn:刪除通過rcm建立的dotfile的符號連結

安裝RCM

我主要是用Mac和Ubuntu,他們的安裝方法如下

Mac

brew tap thoughtbot/formulae
brew install rcm

Ubuntu

sudo add-apt-repository ppa:martin-frost/thoughtbot-rcm
sudo
apt-get update sudo apt-get install rcm

Arch Linux

Debian-based

wget https://thoughtbot.github.io/rcm/debs/rcm_1.2.3-1_all.deb
sha=$(sha256sum rcm_1.2.3-1_all.deb | cut -f1 -d' ')
[ "$sha" = "fb8ec2611cd4d519965b66fcf950bd93d7593773659f83a8612053217daa38b4" ] && \
sudo dpkg -i rcm_1.2.3-1_all.deb

Gentoo-based (including Funtoo)

sudo emerge layman
sudo layman -f --overlays https://github.com/bronislav/overlays/raw/master/layman.xml --add bronislav
sudo emerge rcm

OpenBSD(-current)

sudo pkg_add rcm

openSUSE/RHEL/CentOS

其他Linux發行版

這個軟體使用了標準GNU autotools,可以嘗試一下方法編譯安裝

curl -LO https://thoughtbot.github.io/rcm/dist/rcm-1.2.3.tar.gz && \

sha=$(sha256 rcm-1.2.3.tar.gz | cut -f1 -d' ') && \
[ "$sha" = "502fd44e567ed0cfd00fb89ccc257dac8d6eb5d003f121299b5294c01665973f" ] && \

tar -xvf rcm-1.2.3.tar.gz && \
cd rcm-1.2.3 && \

./configure && \
make && \
make install

RCM使用方法

接下來介紹一下我的使用方式

通過mkrc命令建立Dotfiles管理目錄

如果你是第一次在本地使用rcm,則可以通過mkrc命令來建立dotfiles管理目錄,並指定要用使用rcm管理哪些檔案.

cd ~
mkrc .zshrc .zsh-custom 

命令執行完畢後,會將你指定的dotfile預設移動到~/.dotfiles目錄下並重命名將檔名前的“.”去掉,同時在~/目錄下建立相應的符號連結,如果你的dotfile是儲存在某個資料夾下時,例如~/.example/config, 則程式會將檔案拷貝至~/.dotfiles/example/config,並在原目錄中建立符號連線

ls -l ~/dotfiles
 -rw-r--r--  1 Rain staff 1065 8 15 13:20 zshrc
 drwxr-xr-x  3 Rain staff 102B 8 15 13:20 zsh-custom

cd ~
ls -l .zshrc
 lrwxr-xr-x  1 Rain staff 35B 8 15 13:20 .zshrc -> /Users/Rain/.dotfiles/zshrc

ls -l .zsh-custom/themes/wty.zsh-theme 
 lrwxr-xr-x  1 Rain staff 61 8 15 13:20 .zsh-custom/themes/wty.zsh-theme -> /Users/Rain/.dotfiles/tag-zsh/zsh-custom/themes/wty.zsh-theme

此時你可以使用git在~/.dotfiles目錄下建立倉庫進行版本管理

cd ~/.dotfiles
git init
git add .
echo "These are my config dotfiles" >> README.md
git commit -m "initial commit"

如果你希望更改建立的dotfiles管理目錄的位置,可以通過在mkrc命令中帶上-d引數,或者
在~/.rcrc配置檔案中配置預設的目錄

mkrc -d ~/.mydotfiles .zshrc

#in ~/.rcrc file
#此引數可以設定多個目錄,為其餘幾個命令服務,對mkrc命令來說第一個目錄為預設目錄,若不填寫則~/.dotfiles為預設目錄
DOTFILES_DIRS="~/.mydotfiles"

注意事項

由於rcm軟體的設計問題,請勿對已經由rcm管理並建立的符號連線使用mkrc命令,否則會讓~/.dotfiles下的檔案變成指向自己的符號連結並丟失原始檔。

為了避免符號連結帶來的問題,我們可以在使用mkrc命令時帶上“-C”引數來改變建立符號連結的行為,或者在~/.rcrc檔案中加入如下引數,將所有建立符號連結的行為都改為拷貝,這個將影響所有的rcm命令

#in ~/.rcrc files
COPY_ALWAYS="*"

mkrc -C .zshrc

我最開始嘗試使用這個軟體的時候因為這個問題導致丟失了.zshrc,而且並未備份,又得重新配置一遍,幸好有oh-my-zsh,Orz..

但是使用符號連結的好處就是當你對~目錄下我的dotfile進行修改時,相當於直接對dotfiles管理目錄中的檔案進行了修改,這樣備份更加方便,我認為只要小心一點還是符號連結更加方便,如何取捨就看大家啦。

mkrc命令高階用法

mkrc命令還支援將dotfiles通過tags分類存放,可以方便的對不同軟體的配置檔案進行分類管理,比如通過如下命令建立dotfiles管理目錄,

cd ~
mkdir -t zsh .zshrc

此命令將會在./dotfiles目錄下建立以“tag-”開頭的目錄,效果如下

ls -l ~/.dotfiles/tag-zsh/zshrc                                                
 -rw-------  1 Rain  staff  1065  8 15 15:42 .dotfiles/tag-zsh/zshrc

mkrc還能根據hostname來進行分類管理,mkrc的更多引數請檢視man page mkrc(1)
在使用了mkrc的分類管理引數後會影響到接下來要介紹的rcup命令的行為

通過rcup命令更新dotfiles

基礎用法

當你沒有使用任何分類管理引數時,你的所有dotfile應該都儲存在~/.dotfiles目錄下,此時你只需要簡單的執行rcup命令,則rcm會在~目錄下建立所有~/.dotfiles下檔案對應的符號連結,當配置了COPY_ALWAYS=“*”時則會改為拷貝,若~目錄下存在對應檔案且內容不同時,會提示是否覆蓋。且若~、。dotfiles中的資料夾在~中不存在時會自動建立,樣例如下

rcup -v   
 identical /Users/Rain/.rcrc
 '~/.dotfiles/tag-zsh/zsh-custom/themes/wty.zsh-theme' -> '~/.zsh-custom/themes/wty.zsh-theme'
 overwrite /Users/Rain/.zshrc? [ynaq] y
 removed '/Users/Rain/.zshrc'
 '/Users/Rain/.dotfile/zshrc' -> '/Users/Rain/.zshrc'

高階用法

當不加任何引數時,rcup預設只將沒有通過tag進行分類的且如果通過hostname分類了則分類hostname與本地hostname相同的dotfiles更新至你的~目錄

當你使用tag來構建你的dotefile目錄時,你可以通過給rcup命令加上“-t”引數或者在~/.rcrc中配置TAGS=”tag1 tag2”來更新相應分類下的dotfiles,或者加上“-B”引數來指定一個hostname或在~/.rcrc檔案中配置HOSTNAME引數,從而取消自動計算hostname。

如果加了“-t”引數以後,lsrc,rcup和rcdn命令都只會載入沒有用tag分類的和“-t”引數給出的tag相關的dotfile,其他tag下的dotfiles不會被載入

你可以通過lsrc命令檢視當前rcup命令能作用於哪些dotfiles,如果要查詢有哪些tag,只需進入~/.dotfiles目錄檢視那些以“tag-”開頭的目錄即可。

lsrc
 /Users/Rain/.rcrc:/Users/Rain/.dotfiles/rcrc

lsrc -t zsh
 /Users/Rain/.rcrc:/Users/Rain/.dotfiles/rcrc
 /Users/Rain/.zshrc:/Users/Rain/.dotfiles/tag-zsh/zshrc

rcup -v -t zsh
 identical /Users/Rain/.rcrc
 '/Users/Rain/.dotfiles/tag-zsh/zshrc' -> '/Users/Rain/.zshrc'

當你希望rcup同時載入多個dotfiles管理目錄,比如當你使用他人分享給你的通過rcm建立的dotfiles管理目錄時,你可以使用rcup的“-d”引數來指定從哪個資料夾來更新~目錄下的檔案

rcup -d ~/.SarahDotfiles -t zsh
 '/Users/Rain/Download/.SarahDotfiles/tag-zsh/zshrc' -> '/Users/Rain/.zshrc'

我的日常使用方法

一般我的使用方法是,使用一個dotfiles管理目錄統一管理dotfiles,並在該目錄裡建立git repository進行版本控制

其中

  • rcm的配置dotfiles .rcrc以tag rcm分類
  • 同一個軟體的所有dotfile配置檔案都通過一個tag來分類管理
  • 在.rcrc中配置TAGS=“所有以用於分類的tags”
  • 在.rcrc中配置EXCLUDES=”忽略dotfiles管理目錄中的某些檔案”,比如github的README.md等

當遷移到新的電腦上時,將dotfiles管理目錄放置於~/.dotfiles,並採用如下方法

#1.恢復rcm的dotfile
rcup -t rcm

#2.檢視當前有哪些可以恢復的dotfiles
lsrc

#3.因為.rcrc配置中已經配置了原電腦所有的分類,則可以直接全部恢復
rcup

#4.若只想部分恢復,則指定tag
rcup -t zsh

當使用別人分享過來的dotfiles管理目錄時,採用如下方法

#1.取消自己對應的配置
rcdn -t zsh -v
 removed '/Users/Rain/.zshrc'

#2.將別人的對應配置符號連線過來,進行測試
rcup -d ~/.SarahDotfiles -t zsh
 '/Users/Rain/Download/.SarahDotfiles/tag-zsh/zshrc' -> '/Users/Rain/.zshrc'

#3.如果不滿意則取消對方的配置,並重新連結回自己的配置
rcdn -d ~/.SarahDotfiles -t zsh
rcup -t zsh

#4.如果滿意則copy對方的配置到我的~目錄,在自己重建dotfiles管理目錄中對應的檔案
rcup -d ~/.SarahDotfiles -t zsh -C
mkrc .zshrc

#5.使用git對自己的dotfiles管理目錄進行版本管理