ساخت پروژه جدید خودکار با bash

حتما این ایده به فکر شما هم رسیده که یه دستور شخصی سازه شده (Custom) به ترمینال یا شِل خودتون با bash اضافه کنید که با اجرا کردنش به صورت خودکار فایل های اصلی پروژه کپی بشه و قالب پروژه آماده باشه تا وقت زیاده صرف init پروژه نشه .

اینجا قراره به این مساله بپردازیم و با استفاده از bash برای سیستم های UNIX ( لینوکس و مک … ) یک دستور جدید بسازیم که فایل های اساسی پروژه مثل کتاب خونه های Javascript و CSS رو کپی کنه و داربست (Scaffold) صفحه های مثل index.html رو برامون آماده کنه .

متاسفانه این پروسه فقط روی دستگاه های یونسکسی جواب میده و برای ویندوز توی یه پُست دیگه توضیح خواهم داد .

اضافه کردن دستور جدید به Shell

دستور های کاستوم در واقع تابع هایی (functions) هستند که روی ترمینال بارگذاری می شن که مثل هر زبان برنامه نویسی دیگه ای می تونن ورودی هایی داشته باشند.

برای این که دستور جدید بسازیم اول باید یه فایل sh توی دیرکتوری ( Directory ) اصلی ایجاد کنیم . من اسم این فایل رو میذارم custom_commands.sh . پس مسیر ذخیره میشه :

~/custom_commands.sh

که برای ایجاد کردن فایل میتوینم از دستور touch استفاده کنیم :

cd ~
touch custom_commands.sh

حالا باید کد های مربوطه رو توی فایل ایجاد شده بنویسیم .
دقت داشته باشید که اسم تابع هایی که ایجاد می کنید در نهایت دستورتون خواهد شد و ورودی های تابع به صورت ۲$ و ۱$ و … هستن.
برای ویرایش محتوای فایل ، من از ویرایش nano استفاده می کنم :

nano custom_commands.sh

اول برای مثال یه تابع ساده می نویسیم که متنی رو که وارد کردیم دوباره برامون بنویسه :

function echo_back() {
echo "You Just Entered : " $1 
}

الان یعنی یه دستور جدید به نام echo_back ایجاد کردیم . ولی فعلا کار نمی کنه چون هنوز بارگذاری نشده .
برای این که بتونیم دستور رو بارگذاری کنیم باید اول به ترمینال بگیم که از چه زبانی استفاده می کنیم . برای اینکار ، خط زیر رو به اول کدمون اضافه می کنیم :

#!/bin/bash

یعنی حالا کدمون این شکلی شده :‌

#!/bin/bash

function echo_back() {
echo "You Just Entered : " $1 
}

همونطور که گفتم خط اول به سیستم اطلاعات لازم برای اجرا برنامه رو میده که توی این برنامه داره میگه برنامه ما از نوع bash نوشته شده .
به طور مثال اگر برنامه شما با پایتون نوشته شده بود باید از خط زیر استفاده می کردید :‌

#!/usr/bin/env python

فایل رو ذخیره کنید.

پیکربندی اجازه ها و بارگذاری دستور

به صورت پیشفرض فایل های ساخته شده فقط اجازه خواندن ( Read Permission ) دارند . برای این که برنامه ما قابل اجرا شه باید به اون اجازه اجرا شدن ( Executable ) رو بدیم که برای این کار از chmod به این صورت استفاده می کنیم :

chmod +x custom_commands.sh

نکته خفن 😄 : برای این که بقیه دستور یا اسم فایل رو توی ترمینال تایپ نکنید از کلید TAB استفاده کنین .

خب . حالا دستور ما آماده بارگذاریه .
برای بارگذاری فایل ، از دستور source استفاده می کنیم :

source custom_commands.sh

حالا فقط میمونه تست !
پس یه ترمینال باز می کنیم و دستور زیر رو اجرا می کنیم :

$: echo_back hello

بله ! خروجی که می گیریم به این شکله :‌

You Just Entered : hello

خب ! حالا که یاد گرفتیم دستور کاستوم بسازیم بریم سر اصل مطلب !

ساخت خودکار پروژه

برای این کار من اول توی دیرکتوری اصلی یه پوشه به نام template ایجاد کردم و توش فایل های بنیادی پروژه رو رویختم و قالب فایل های لازم رو ایجاد کردم .
من معمولا توی اکثر پروژه هام از یکی از کتابخونه های زیر استفاده می کنم :‌

  • jQuery
  • Vue.js + Vuetify + Vue-Resource
  • Bootstrap
  • Materialize.css

برای همین فقط این کتابخانه ها رو توی پیکربندی پروژم قرار دادم و اگه لازم بشه بقیه رو به صورت دستی از cdnjs دانلود می کنم .
الان فولدر قالب من به این شکله :‌

template
├── assets
├── css
│   ├── animate.css
│   ├── bootstrap.min.css
│   ├── styles.css
│   └── vuetify.css
├── index.html
└── script
    ├── app.js
    ├── jquery-3.4.1.js
    ├── vue-resource.js
    ├── vue.js
    ├── vue.min.js
    ├── vuetify.js
    └── vuetify.min.js
قالب بندی فایل

می بینید که من هم نسخه تست و هم نسخه اصلی کتابخونه ها رو اضافه کردم و برای Deploy کردن کتابخونه های تست رو پاک می کنم.

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

function init_web() {
 echo "Starting"
 cp -a ~/template/* .
 echo "Done."
 if $1 = 'code'; then
  code .
 fi
}


حالا دوباره فایل رو با دستور source بارگذاری می کنیم و تمام !

استفاده کردن از این دستور به این صورت هست :‌

$: mkdir newproject
$: init_web code

حالا می بینیم نه تنها که فایل ها کپی شدن بلکه ادیتور مورد علاقه من یعنی Visual Studio Code هم توی مسیر پروژه باز شده !