2022/01/11

مدیریت دات‌فایل‌ها با stow

دات‌فایل‌ها، فایل‌های متنی هستند که برای پیکربندی و تنظیمات برنامه‌هایی که روی ترمینال اجرا میکنید، استفاده می‌شوند. آنها در دایرکتوری $HOME شما قرار دارند و مثلا تعیین میکنند که ویرایشگر متون‌تان از چه رنگ بندی استفاده کند.
وقتی به کامپیوتر دیگری میروید، داشتن آنها بروی مخزنی در git کمک زیادی خواهند بود تا براحتی بدون نیاز به ویرایش تک تک شان، آنها را یکجا به سیستم جدید منتقل کنید.

دات‌فایل منیجرهای زیادی وجود دارند که به زبان‌های مختلفی نوشته شده‌اند، در اصل همه آنها با ایجاد سیم‌لینک به دات‌فایل‌ها در home directory کار میکنند و واقعا برای همچین چیزی ساده‌ای (لینک کردن فایل‌ها و پوشه‌ها) نیاز به استفاده از یک دات‌فایل منیجر نداریم |:

مخزن گیت

در ابتدا یک مخزن گیت میسازیم و یک دات‌فایل ساده را درون آن قرار میدهیم:

$ mkdir ~/.dotfiles
$ cd ~/.dotfiles
$ git init
$ git remote add origin [repo-url]
$ echo "this is a dotfile." > .mydotfile
$ git add --all
$ git commit -m "my dotfiles repository"
$ git push -u origin master

حالا ما یک مخزن داریم با یک دات‌فایل نمونه درون آن و فقط باید یک سیم‌لینک به home directory برایش بسازیم.

$ cd
$ ln -s .dotfiles/.mydotfile .mydotfile

به این ترتیب سیم‌لینکی با نام .mydotfile که به فایلی با همان نام در مخزن دات‌فایل‌ها ساختیم، ایجاد کردیم. میتواینم این سیم‌لینک را باز کرده و ویرایش کنیم همان طور که فایل اصلی را ویرایش میکردیم و با ویرایش این سیم‌لینک، فایل اصلی نیز تغییر میکند ولی اگر سیم‌لینک را پاک کنیم، فایل اصلی حذف نمیشود و باقی می‌ماند.
اساسا هدف از ساخت مخزن دات‌فایل‌ها همین است ولی اگر تعداد دات‌فایل‌هایتان زیاد باشد، سیم‌لینک کردن تک تک آنها دردسر است و وقت زیادی از ما میگیرد و در ضمن امکان این که دستوری را اشتباه زده و خطایی ایجاد کنیم زیاد است. یک راه حل اینست که اسکریپتی بسازیم تا این کار را برایمان انجام دهد ولی راه حل بهتری هم وجود دارد:

GNU Stow

stow در واقع یک مدیر لینک است که فایلها و پکیج‌های نرم افزاری مختلف را که درپوشه‌هایی با آدرس‌های مختلف قرار دارند را بگونه‌ای لینک میکند که در یک مکان بنظر برسند.(تعریف واضحی نیست)
برای روشن شدن بهتر کار با یک مثال ادامه میدهیم:
فرض کنید در آدرس ~/.dotfiles بالایی هستیم با این تفاوت که تعدادی دات‌فایل دیگر هم به آن اضافه کردیم. دستور tree -a ساختار درخت گونه ای از محتوای پوشه .dotfiles با فایل‌های مخفی درونش را به ما نشان میدهد:

$ tree -a ~/.dotfiles
.
├── bash
│   ├── .bashrc
│   └── .bash_profile
└── vim
    └── .vimrc

حالا ما تعدادی دات‌فایل واقعی در این پوشه داریم. تعدادی برای bash shell و یکی هم برای ویرایشگر vim داریم.
برای سیم‌لینک کردن این دات‌فایل‌ها میتوانیم آنها را به روش بالاتر بصورت دستی سیم‌لینک کنیم یا راه حل ساده‌تر را استفاده کنیم:

$ cd ~/.dotfiles
$ stow vim

چه اتفاقی افتاد

  1. ما دستور stow vim را اجرا کردیم.
  2. stow فایل .vimrc را یافته
  3. سیم‌لینکی به این فایل در یک پوشه بالاتر به آن ایجاد کرده است و حالا ما یک سیم‌لینک به فایل ~/.dotfiles/vim/.vimrc در home directory به این آدرس ~/.vimrc داریم.

برای واضح تر شدن اگر بخواهیم برای openbox همین کار را انجام دهیم. باید پوشه openbox را به این آدرس منتقل کنیم:

~/.dotfiles/openbox/.config/openbox

و با اجرای دستور زیر آن را سیم‌لینک کنیم

$ cd ~/.dotfiles
$ stow openbox

و سیم‌لینکی در آدرس ~/.config/openbox به پوشه ~/.dotfiles/openbox/.config/openbox ساخته میشود.

از این به بعد نیازی نیست با رفتن پای یک کامپیوتر دیگر تک تک دات‌فایل‌هایتان را ویرایش کنید یا آنها را یک به یک سیم‌لینک کنید، با stow * در یک زمان همه آنها را سیم‌لینک کرده و فایل‌های‌تان را در یک حرکت و یکجا بازگردانید.

["linux"]