قابلیتها
بهروزرسانی ccam
این صفحه بهصورت ماشینی از انگلیسی ترجمه شده است. پیشنهاد اصلاح را با کمال میل میپذیریم. ویرایش این صفحه در GitHub
ccam update یک نسخه ccam را از GitHub دانلود میکند، آن را با checksums.txt همان نسخه بررسی میکند و فایل اجرایی در حال اجرا را با یک تغییر نام جایگزین میکند. اگر ccam را با اسکریپت نصب یا از یک فایل فشرده نصب کردهاید، از این فرمان استفاده کنید. ccam هرگز خودش به دنبال بهروزرسانی نمیگردد: فقط این فرمان با GitHub ارتباط میگیرد، بنابراین همه فرمانهای دیگر بهصورت آفلاین هم همانطور کار میکنند.
استفاده
ccam update # install the latest release
ccam update --check # only say whether a newer release exists
ccam update --version v0.3.0 # install that release, also an older one
ccam --dry-run update # show what would be downloaded and replaced$ ccam update --check
ccam 0.5.0 is available (you have 0.4.0). Run `ccam update`.
$ ccam --dry-run update
Would update ccam 0.4.0 → 0.5.0:
download https://github.com/jhyunwoo/ccam/releases/download/v0.5.0/ccam_linux_amd64.tar.gz
verify with https://github.com/jhyunwoo/ccam/releases/download/v0.5.0/checksums.txt
replace /home/you/.local/bin/ccam
$ ccam update
→ downloading https://github.com/jhyunwoo/ccam/releases/download/v0.5.0/ccam_linux_amd64.tar.gz
✓ Updated ccam 0.4.0 → 0.5.0 (/home/you/.local/bin/ccam)وقتی نسخه جدیدتری وجود نداشته باشد، ccam پیام ccam 0.4.0 is up to date. را چاپ میکند و چیزی را تغییر نمیدهد. اگر با --version همان نسخهای را بدهید که اکنون اجرا میکنید، ccam 0.4.0 is already installed. را چاپ میکند.
گزینهها
| گزینه | کاری که انجام میدهد | پیشفرض |
|---|---|---|
--check |
فقط گزارش میدهد که نسخه جدیدتری وجود دارد یا نه | خاموش |
--version <tag> |
این برچسب نسخه را نصب میکند، مانند v0.3.0، چه جدیدتر و چه قدیمیتر از نسخه فعلی |
آخرین نسخه |
--dry-run |
پشتیبانی میشود: آخرین برچسب را پیدا میکند (مگر اینکه --version برچسبی را نام ببرد)، همان بررسیها را روی فایل اجرایی انجام میدهد و مسیرهای دانلود، checksum و جایگزینی را بدون دانلود چاپ میکند |
خاموش |
--check و --version را نمیتوان با هم استفاده کرد. برچسب باید به شکل vMAJOR.MINOR.PATCH باشد و میتواند یک پسوند پیشانتشار یا build هم داشته باشد؛ میتوان v ابتدای آن را حذف کرد. هر چیز دیگری خطا میدهد، برای مثال --version takes a release tag such as v0.3.0, not "1.2".
متغیر محیطی CCAM_RELEASES_URL برای یک mirror یا برای آزمونها جایگزین https://github.com/jhyunwoo/ccam/releases میشود. ساختار آن باید یکسان باشد: <url>/latest به <url>/tag/<tag> هدایت میشود و فایلها در <url>/download/<tag>/<asset> قرار دارند.
چگونه کار میکند
کد در internal/update است که فقط ccam update آن را import میکند. مسیر اجرا هرگز آن را فراخوانی نمیکند.
cli.updateCmdفایل اجرایی در حال اجرا را باos.Executableپیدا میکند و پیوندهای نمادین را باfilepath.EvalSymlinksدنبال میکند. همین مسیر واقعی است که جایگزین میشود.- بدون
--version،Updater.Latestنشانی<releases>/latestرا بدون دنبال کردن هدایت درخواست میکند و برچسب را از سرآیندLocation(…/tag/v0.5.0) میخواند. این روش بهجای API GitHub از صفحه نسخهها استفاده میکند، بنابراین محدودیت ۶۰ درخواست در ساعت API شامل آن نمیشود. این جستوجو ۱۰ ثانیه فرصت دارد. parseVersionبرچسب را با یک الگوی سختگیرانه بررسی میکند. برچسب در نشانیهای دانلود و در یک فرمان shell چاپشده قرار میگیرد، پس هیچ چیزی که/،%، فاصله یا نویسههای shell داشته باشد پذیرفته نمیشود.compareVersionsآن را با نسخه در حال اجرا مقایسه میکند؛ یک پیشانتشار پیش از نسخه نهایی خود قرار میگیرد.managed()وwritable()تعیین میکنند که آیا ccam اصلاً اجازه دارد فایل اجرایی را جایگزین کند یا نه (پایینتر را ببینید).Updater.Fetchفایلهایccam_<os>_<arch>.tar.gzوchecksums.txtرا همزمان دانلود میکند و برای هر دو روی هم ۲ دقیقه فرصت دارد. حجم هر دانلود حداکثر ۲۵۶ MB است.- پیش از هر کار دیگری، SHA-256 فایل فشرده باید با خط مربوط به آن در
checksums.txtیکی باشد. نبودن خط یا متفاوت بودن checksum بهروزرسانی را باnothing was changedمتوقف میکند. extract()فایل tar را میخواند و نخستین فایل عادی با نامccamرا برمیدارد. پوشهها، پیوندها و دیگر ورودیها نادیده گرفته میشوند و حجم فایل اجرایی هم حداکثر ۲۵۶ MB است.Updater.Installفایل اجرایی جدید را باfsutil.AtomicWriteمینویسد: یک فایل موقت.ccam.tmp*کنار فایل اجرایی، با بیتهای مجوز فایل قبلی، که روی دیسک ذخیره و سپس با تغییر نام جایگزین فایل قبلی میشود.
کل این فرایند، از یافتن برچسب تا تغییر نام:
فایل فشرده و checksums.txt کنار هم دانلود میشوند و تا وقتی checksum مطابقت نداشته باشد چیزی نوشته نمیشود. تغییر نام اتمی است، بنابراین یک خرابی یا پر شدن دیسک یا فایل اجرایی قبلی را باقی میگذارد یا فایل جدید را، هرگز نیمی از یکی را. فرمانهای میانبر مانند ~/.local/bin/ccwork پیوندهای نمادین به فایل اجرایی ccam هستند، بنابراین بدون هیچ تغییری نسخه جدید را اجرا میکنند.
نصبهای مدیریتشده با بسته
ccam نصبشده از .deb متعلق به apt است و جایگزین کردن آن بدون اطلاع apt پایگاه داده بستهها را نادرست میکند. ccam پیش از دانلود بررسی میکند که فایل اجرایی متعلق به کیست:
- فایل اجرایی در
/usr/bin،/bin،/usr/sbinیا/sbinمدیریتشده با بسته به حساب میآید. - در جاهای دیگر، اگر
dpkgنصب باشد وdpkg -S <path>موفق شود، آن هم مدیریتشده با بسته به حساب میآید. - در غیر این صورت ccam یک فایل موقت
.ccam-update-*کنار فایل اجرایی میسازد و حذف میکند تا مطمئن شود میتواند در آنجا بنویسد.
برای فایل اجرایی مدیریتشده با بسته، ccam متوقف میشود و گامهای apt را چاپ میکند:
$ ccam update
ccam: /usr/bin/ccam was installed by a package, so `ccam update` leaves it alone.
To update the .deb, download ccam_0.5.0_linux_amd64.deb from https://github.com/jhyunwoo/ccam/releases/tag/v0.5.0 and run:
sudo apt install ./ccam_0.5.0_linux_amd64.deb
Or install a copy in ~/.local/bin with the install script:
curl -fsSL https://raw.githubusercontent.com/jhyunwoo/ccam/main/install.sh | shدر سیستمهایی غیر از Linux، فقط خط اسکریپت نصب چاپ میشود. وقتی پوشه قابل نوشتن نباشد، ccam پیشنهاد میکند اسکریپت نصب را دوباره اجرا کنید که ccam را در ~/.local/bin نصب میکند.
ایمنی و حالتهای خاص
- یک build توسعه نسخه خود را
devگزارش میکند و نسخهای برای مقایسه ندارد، بنابراینccam updateوccam update --checkآن را رد میکنند.ccam update --version vX.Y.Zیک نسخه را روی آن نصب میکند. - دانلود ناموفق، نبودن فایل مخصوص پلتفرم شما یا عدم تطابق checksum، فایل اجرایی نصبشده را دستنخورده باقی میگذارد.
- نسخهای که وجود ندارد با
there is no release <tag>خطا میدهد. وقتی GitHub با HTTP 403 یا 429 درخواست را رد کند، ccam میگوید احتمالاً محدودیت نرخ درخواست است و از شما میخواهد بعداً دوباره امتحان کنید. --checkفقط میخواند. بررسی نمیکند که فایل اجرایی مدیریتشده با بسته یا قابل نوشتن است.- استفاده از
--versionبا یک برچسب قدیمیتر، راه بازگشت به نسخه قبلی است.