برنامه نویسی

یک آموزش گام به گام برای نوشتن اسکریپت نصب کننده Bash برای برنامه خود

مقدمه

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

توجه: در اینجا من بیشتر روی برنامه های کنسولی که روی 🐧 Linux و MacOS اجرا می شوند تمرکز می کنم.

برنامه های CLI می توانند یا از دایرکتوری که باینری در آن قرار دارد اجرا شود و در مرحله توسعه خوب است یا اگر برنامه خود را با تیم خود به اشتراک بگذارید ، اما به عنوان یک کاربر نهایی ، می خواهید استفاده از برنامه تا حد امکان ساده باشد. اخیراً ، من برنامه ای برای استخراج تصاویر از اسناد PDF تهیه کردم پی دی که برای استفاده دستی و ادغام در خطوط لوله پردازش داده ها در نظر گرفته شده بود.

آن را اینگونه صدا می کند

/Users/qwe/code/cli_apps/pdfjuicer/bin/pdfjuicer
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

یک روش مناسب برای اجرای برنامه نیست. من می خواهم کاربران بتوانند مانند سایر افراد بتوانند با برنامه تماس بگیرند ، به سادگی نام آن را در ترمینال تایپ کنند

pdfjuicer
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

به این ترتیب ، هم برای کاربران راحت است و هم برای تماس با برنامه از نرم افزار دیگر بدون اینکه در مورد مکان برنامه زحمت بکشید.

تجزیه و تحلیل مسئله

اجرای برنامه به سادگی با فراخوانی نام خود در یک ترمینال با اضافه کردن مسیر برنامه شما به مسیر محیط ، حاصل می شود. همچنین می توانید برنامه خود را به مخازن نرم افزاری مانند مخازن APT ، Homebrew و غیره اضافه کنید. با این وجود ، به خصوص در مراحل اول ممکن است یک کار بیش از حد باشد و ممکن است بخواهید تعادل بین راحتی نصب و سهولت حفظ راه حل را برقرار کنید. در اینجا ، گزینه تهیه یک اسکریپت نصب سفارشی را بررسی می کنم.

عمل

با این حال ، در اینجا ما باید در مقیاس بزرگتر به وضعیت نگاه کنیم و سؤالات زیر را در نظر بگیریم:

  • مخاطبان ما چقدر فن آوری هستند؟

  • آیا ارائه دستورالعمل های دستی کافی است؟

  • مراحل نصب چیست؟

  • در صورت انتخاب نصب خودکار ، آیا باید کل فرآیند نصب به صورت خودکار انجام شود؟

  • آیا می توانیم قبل از نصب برنامه ، فرآیند نصب را آزمایش کنیم؟

  • از چه ابزاری یا زبانی برای اتوماسیون استفاده می شود؟

همه این سؤالات به طور طبیعی یکی از دیگری بوجود می آیند. اول ، ما باید درک کنیم که روند چقدر پیچیده است. ما باید به این سؤال پاسخ دهیم که آیا مخاطب هدف ما تخصص کافی برای پیروی از دستورالعمل های دستی یا اتوماسیون دارد. اگر یک مسیر خودکار انجام شود ، شاید همه مراحل به صورت خودکار انجام شود ، گزینه های کاربر یا محافظت از کاربر در برابر تغییرات ناخواسته در تنظیمات سیستم. و در آخر ، اگر چیزی اشتباه پیش بیاید ، آیا می توانیم با انجام نصب تست مسائل بالقوه را از قبل پیدا کنیم؟

کار کردن در طرح

بنابراین قدم بعدی من دریافت پاسخ به این سؤالات بود.

مخاطبان ما چقدر فن آوری هستند؟

شما ممکن است فکر کنید که کاربران برنامه های کنسول عمدتاً از نظر فن آوری هستند ، با این حال ، بیشتر شبیه یک طیف است. برنامه های CLI مانند را در نظر بگیرید ffmpeg یا imagemagic که می تواند توسط طیف گسترده ای از کاربران انجام شود که وظایفی مانند تبدیل فیلم ها به قالب های خاص یا تغییر اندازه عکس از Family Photoarchive را انجام می دهند. من مورد من پی دی برای کاربرانی که نیاز به استخراج صفحات از پرونده های PDF دارند به عنوان تصاویر با اندازه تصویر سفارشی ، قالب و تولید تصویر کوچک ساخته شده است. مخاطب اصلی هدف مربیان و سازندگان محتوا است. کاربران در این دسته ها همیشه نمی خواهند یا وقت خود را برای حفر پیچیدگی های تنظیم برنامه دارند. حتی اگر کاربرانی مانند مهندسین DevOps و مهندسین نرم افزار را در نظر بگیریم ، آنها همچنین از راه های سریع و آسان برای نصب یک برنامه به جای ورود به مستندات و فهمیدن چگونگی انجام این کار ، قدردانی می کنند.

آیا ارائه دستورالعمل های دستی کافی است؟ 📄

این سؤال به طور طبیعی از مطلب قبلی بوجود می آید و تصمیم من این بود که با مسیر دستی پیش بروم. حتی بسیاری از کاربران با استفاده از فناوری با استفاده از یک راه حل خودکار آماده به جای نصب برنامه به صورت دستی یا توسعه اسکریپت اتوماسیون خود ، صرفه جویی در وقت را دارند. با این حال ، با طی کردن مسیری که شامل اسکریپت نصب خودکار است ، مشکل پنهان کردن فرآیند نصب وجود دارد که ممکن است برخی از کاربران را نگران کند: بعد از نصب چه اتفاقی خواهد افتاد؟ برنامه کجا نصب خواهد شد؟

راه حل برای چاپ پیام ها در هنگام نصب است که نشان می دهد اکنون مراحل با اطلاعات اضافی مانند نام پرونده و پوشه که در فرآیند نصب ، وضعیت اسکریپت (شروع ، پایان ، خطا) شرکت می کنند ، انجام می شود. همچنین اضافه کردن حالت تست یا dry-run حالت لایه دیگری از راحتی و ایمنی را برای کاربر که از نگرانی هایی مانند آن جلوگیری می کند ، معرفی می کند واقعاً بعد از اجرای فیلمنامه چه اتفاقی خواهد افتاد؟ و به سوال ما پاسخ می دهد آیا می توانیم قبل از نصب برنامه ، فرآیند نصب را آزمایش کنیم؟

همچنین کاربر می تواند کد منبع یک اسکریپت نصب را بررسی کند تا فرآیند با جزئیات بیشتری بررسی شود. و سرانجام ، ساخت خروجی اسکریپت با کدهای فرار ANSI ، وضوح بیشتری را به پیام های خروجی اضافه می کند ، به عنوان مثال ، اطلاعات تشخیصی را سبز و خطاهای قرمز می کند.

مراحل نصب 💻

ابتدا بیایید مراحل را که باید برای نصب برنامه CLI با ملاحظات مختصر برای هر مرحله انجام دهیم ، قرار دهیم:

باینری یک برنامه را پیدا کنید – با وارد کردن مسیری به باینری می توان به عنوان یک پارامتر به اسکریپت نصب یا برنامه را با اسکریپت نصب در همان فهرست قرار داد.

باینری را به دایرکتوری بن منتقل کنید – در این مرحله 2 سؤال جدید بوجود می آید.

بیایید به هر دو بپردازیم.

از آنجا که این برنامه از مخازن رسمی نصب نشده است و می تواند به عنوان نرم افزار سفارشی در نظر گرفته شود ، خاص کاربر ~/bin به نظر می رسد مانند یک انتخاب ارجح است. همچنین از مشکلات مجوزهایی که ممکن است هنگام نصب در سیستم بوجود بیاید جلوگیری می کند bin و درگیری های احتمالی برای نوشتن باینری ها در آنجا. به طور کلی ، در این حالت ، سفارشی ~/bin مدیریت برنامه را ساده می کند و از خطرات دخالت در سیستم عامل جلوگیری می کند.

با توجه به اینکه بهتر است با دودویی حرکت یا کپی کنید – بهتر است کپی را انتخاب کنید. به این ترتیب ، در صورت عدم موفقیت نصب ، می توان دوباره شروع کرد ، در غیر این صورت ، اگر باینری منتقل شود ، کاربر باید باینری را از آن استفاده کند ~/bin و آن را در یک پوشه اصلی قرار دهید یا دوباره آن را بارگیری کنید تا فرآیند نصب را امتحان کنید.

همچنین ، همراه با کاربر خاص ~/bin دایرکتوری ایجاد می کند مرحله اضافی اختیاری اگر من وجود نداشته باشم ، چنین دایرکتوری ایجاد می کنم.

مجوزها را به باینری تنظیم کنید – باینری باید قابل اجرا باشد و مجوز اجرای آن محدود به صاحب آن خواهد بود زیرا این برنامه در فهرست باینری خاص کاربر نصب شده است ، که می تواند با استفاده از آن حاصل شود chmod u+x app_binary که باعث می شود کاربر (مالک) u حق اجرای x باینری

اضافه کردن باینری به مسیر – این مرحله با فراخوانی آن با نام در ترمینال ، برنامه را اجرا می کند. برای دستیابی به آن مسیر به برنامه باید به پرونده پیکربندی پوسته (.bashrc ، .bash_profile ، .profile یا .zshrc) اضافه شود. export فرمان export PATH="$PATH:$target_bin_dir"بشر به منظور اعمال تغییرات کاربر نیاز دارد ترمینال بارگیری مجدد که می تواند با اجرای آن انجام شود source ~/.bashrc (یا هدف قرار دادن یک فایل مناسب دیگر برای پیکربندی پوسته خاص کاربر).

آیا باید کل فرآیند نصب خودکار باشد؟

در اینجا تمرکز روی مراحلی که بیشترین عدم اطمینان در نتیجه تولید شده و خطر دخالت در عملکرد سیستم عملکرد را دارند بسیار مهم است و به کاربر اجازه می دهد این مراحل را مدیریت کند. در این فرآیند نصب ، این آخرین مرحله اضافه کردن برنامه به مسیر است. بهتر است به کاربر اجازه دهید فایل پیکربندی پوسته را به صورت دستی ویرایش کند ، انتخاب کنید که مسیر جدید را اضافه کنید – از مسیرهای دیگر پیش بروید یا آن را به عنوان آخر تبدیل کنید. همچنین به جلوگیری از خطرات رونویسی احتمالی تنظیمات موجود یا تنظیمات کپی یا نوشتن در پرونده پیکربندی پوسته اشتباه کمک می کند.

از کدام ابزار یا زبان برای اتوماسیون استفاده می شود؟

زبان را انتخاب کنید

برای سازگاری نصب در بین سیستم های Linux ، Mac Os و BSD ، اجرای نصب با استفاده از آن منطقی است bash فیلمنامه با این حال ، برنامه من در نظر گرفته شده است نه تنها توسط کاربران بلکه توسط سایر نرم افزارها با سناریوهای برنامه نصب شده در VPS یا ظروف Docker ، از جمله ظروف سبک بر اساس سیستم های عامل مانند الپین لینوکس، که فقط فراهم می کند sh اما نه bashبشر

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

در مورد سایر زبانهای اسکریپت چیست؟

می توان پرسید که گزینه های دیگری برای زبان های اسکریپت وجود دارد که این کار را انجام می دهد ، مانند پایتون ، روبی یا لوا و از نظر نحو ، آنها اسکریپت را آسان تر می کنند و در صورت نیاز به ارتقاء و پسوندها ، حفظ آن آسان تر می شوند. با این حال ، ما قیمت پیچیدگی قابلیت حمل را پرداخت خواهیم کرد. انتخاب sh (بورن شل) به ما اجازه می دهد تا حد امکان در مورد محیط سیستم عامل کاربر آگنوستیک باشیم. اگر انتخاب کنیم bash، ما یک لایه از عدم اطمینان اضافه می کنیم: اگر فقط سیستم عامل میزبان داشته باشد چه می شود sh نصب شده؟

با سایر زبانهای اسکریپت مانند پایتون ، روبی یا لوا عدم اطمینان حتی بیشتر می شود. اکنون باید از نسخه مترجم مراقبت کنیم (پایتون 2 و 3) ، حدس بزنید که زبان اسکریپت انتخابی Wether به هیچ وجه بر روی دستگاه کاربر نصب شده است ، در صورت عدم ارائه در سیستم عامل ، موقعیت هایی مانند نصب زبان اسکریپت را مدیریت کنید که به طور قابل توجهی پیچیدگی نصب را افزایش می دهد ، زمان نصب اضافی ، نیاز به بارگیری بسته های اضافی ، بیشتر خطرات مربوط به مراحل اضافی به دلیل نصب در مورد نصب را انجام می دهد.

بنابراین در این حالت انتخاب من این است sh – بیشترین زبان برنامه نویسی در سیستم های مانند یونیکس ، از جمله حداقل توزیع کننده های مورد استفاده در ظروف داکر.

اجرای

برای قالب بندی پیام ، کدهای فرار ANSI را اضافه کنید

بازپا="\ 033[0m"
bold="\033[1m"
color_green="\033[32m"
color_red="\033[31m"
Enter fullscreen mode

Exit fullscreen mode

In this script we will use green and red colors, bold font and also reset code that will return output format to default.

Red color will be used to notify user that installation script is running in testing mode when no actual operations are performed. Green will be used to print message about installation success. Bold text will be used in large chunks of text to highlights key moments.

Set work directory

workdir=$(pwd)
Enter fullscreen mode

Exit fullscreen mode

Multiple flags

Since script has 2 flags --dev and --dry-run and they can be used either both or just one of them and in any order to check for current flag the following construction will be used which will check whether target flag is 1st or the 2nd argument:

if [ "$1" = "--flag" ] || [ "$2" = "--flag" ]؛ پس
    ...
فای
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

پرچم

علاوه بر نصب منظم ، اسکریپت از حالت دیگری پشتیبانی می کند که توسط --dev پرچم و در نظر گرفته شده است که هنگام تهیه برنامه از منبع استفاده می شود.
برنامه در GO نوشته شده است و پروژه حاوی دایرکتوری BIN است که باینری کامپایل شده در آن ذخیره می شود. در حالت منظم ، اسکریپت نصب انتظار دارد که باینری در همان فهرست با اسکریپت باشد ، یا در صورت تماس با نصب. sh از کد منبع (اسکریپت در ریشه پروژه قرار دارد) – Dev Flag مسیر اضافه کردن باینری را اضافه می کند و با اضافه کردن کار فعلی/سطل فعلی به عنوان پوشه.

if [ "$1" = "--dev" ] || [ "$2" = "--dev" ]; then
  binary_file="bin/pdfjuicer"
else
  binary_file="pdfjuicer"
fi
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

خشک

بررسی کنید که آیا این یک آزمایش/اجرای خشک است:

dry_run=false
if [ "$1" = "--dry-run" ] || [ "$2" = "--dry-run" ]; then
    printf "${bold}${color_red}This is dry run, no actual actions will be performed. Use this for testing installation script.${reset}\n"
    dry_run=true
fi
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

اگر اجرای خشک پیام را در مورد آن به رنگ قرمز و با آن فعال کنید سرزنده رنگ با استفاده از کدهای فرار ANSI که قبلاً تعریف شده بود.

تنظیم مسیرها به هدف مسیری که در آن کپی خواهد شد (~/bin) و مکان باینری اصلی.

target_bin_dir="$HOME/bin/"

source="$workdir/$binary_file"
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

ایجاد کردن ~/bin دایرکتوری اگر وجود نداشته باشد

echo "Creating directory $target_bin_dir for binary (if not exist)"
if ! $dry_run; then
  mkdir -p "$target_bin_dir"
fi
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

باینری به ~/bin

echo "Copying $source to $target_bin_dir"
if ! $dry_run; then
  cp "$source" "$target_bin_dir"
fi
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

مجوز اجرای را با استفاده از اضافه کنید chmod، در پیام به کاربر اسکریپت نام کاربری را نشان می دهد که با استفاده از باینری قادر به اجرای باینری است whoami فرمان اگر همه چیز به درستی در حال اجرا باشد ، نام کاربر را که اسکریپت را اجرا می کند نشان می دهد.

echo "Adding execute permission for user $(whoami)"
if ! $dry_run; then
  chmod u+x "$target_bin_dir$binary_file"
fi
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

و سرانجام اسکریپت نصب دستورالعمل هایی را برای مرحله نهایی نشان می دهد که کاربر به صورت دستی انجام خواهد داد: اضافه کردن باینری به مسیر.

تماس با اسکریپت نصب

اسکریپت نصب دارای 2 حالت در حال اجرا است: نصب واقعی و تست (خشک) وقتی کاربر پیام را برای هر مرحله از یک فرآیند نصب می بیند اما هیچ عملیاتی واقعی انجام نمی شود.

# testing script
bash ./install.sh --dry-run

# actual installation
bash ./install.sh
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

و در صورت نصب باینری کامپایل شده از کد منبع:

# testing script
bash ./install.sh --dev --dry-run

# actual installation from 
bash ./install.sh --dev
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

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

نتیجه گیری

برنامه حمل و نقل با اسکریپت نصب ، نصب برنامه را در مقایسه با ارائه دستورالعمل های دستی ساده می کند. در عین حال مهم است که مراحل را که بهتر است به دلایل ایمنی نصب انجام شود ، شناسایی کنید. در این حالت کاربر به صورت دستی برنامه را به مسیر اضافه می کند تا از اشتباهات و درگیری های احتمالی در پیکربندی پوسته جلوگیری شود. داشتن یک اسکریپت نصب ، تعادل بین تنظیم دستی و افزودن برنامه به مخازن رسمی را فراهم می کند که می تواند به ویژه در مراحل اولیه توسعه برنامه یا زمان توسعه برنامه برای استفاده داخلی در یک شرکت ، وقت گیر باشد.

کد منبع کامل اسکریپت نصب را می توان در پروژه pdfjuicer در اینجا یافت: نصب

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا