برنامه نویسی

Makefiles: استانداردی برای وظایف پروژه

من از Makefiles برای ایجاد یک رابط استاندارد CLI برای همه پروژه هایم، صرف نظر از زبان برنامه نویسی و/یا فریمورک هایی که استفاده می کنم، استفاده کرده ام.

Makefiles فایلهای پیکربندی برای GNU هستند make وظایف یک پروژه (به عنوان مثال: build، test، و غیره.).

من پروژه هایی در Bash، Elixir، Python، JavaScript و غیره دارم، و هر کدام از اینها به دستورات مختلفی برای ساخت، آزمایش، اجرا و غیره نیاز دارند، بنابراین من از Makefiles برای استاندارد کردن نحوه اجرای این وظایف استفاده کرده ام.

در زیر یک پایه است Makefile قالبی که من استفاده کردم:

.PHONY: build run test

build:    
    # here goes the command(s) to build the project

run:
    # here goes the command(s) to run the project

test:
    # here goes the command(s) to test the project
وارد حالت تمام صفحه شوید

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

اگر پروژه شما با پایگاه داده سروکار دارد، مهم نیست که کدام یک (Postgres، MySQL، SQLite، و غیره)، ممکن است بخواهید این وظایف را نیز شامل شود:

.PHONY: db.setup db.reset db.create db.migrate db.seed db.drop

db.setup:
    make db.create \
    && make db.migrate \
    && make db.seed

db.reset:
    make db.drop \
    && make db.setup

db.create:
    # here goes the command(s) to create the database

db.migrate:
    # here goes the command(s) to migrate the database

db.seed:
    # here goes the command(s) to seed the database

db.drop:
    # here goes the command(s) to drop the database
وارد حالت تمام صفحه شوید

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

به این ترتیب پروژه‌های شما می‌توانند یک «واسط استاندارد CLI» برای کارهای معمولی مانند ساختن، آزمایش، اجرا یا عملیات مشترک پایگاه داده مانند ایجاد و حذف، انتقال طرح و غیره داشته باشند.

کمی زمینه تاریخی از GNU Make

از نظر تاریخی، make برای ساخت فایل‌ها استفاده می‌شد که اغلب به معنای کامپایل کد منبع بود. هر وظیفه در واقع گروهی از دستورات مورد نیاز برای ساختن یک فایل معین در صورت عدم وجود آن بود. اگر فایل در جای خود بود، دستورات اجرا نمی شد.

یک پروژه جاوا اسکریپت را تصور کنید که دارای فایل های زیر باشد:

  • api-sdk.js (عملکردهایی برای استفاده از APIهای پشتیبان)
  • utils.js (توابع کاربردی عمومی)
  • app.js (کد اصلی برنامه وب: مسیرها، صفحات و غیره)

در webdev، این یک روش معمول است که فایل‌های JS را قبل از استقرار در تولید، بسته‌بندی کنید، بنابراین کاربران می‌توانند فایل‌های کمتری و غیره را دانلود کنند، بنابراین این پروژه Makefile می تواند شبیه این باشد:

bundle.js:
    cat utils.js api-sdk.js app.js > bundle.js
وارد حالت تمام صفحه شوید

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

این دستورات همه کدهای منبع JS در این فایل ها را به یک متصل می کند bundle.js. بنابراین، این فایل می تواند با دستور زیر ساخته شود:

$ make bundle.js
وارد حالت تمام صفحه شوید

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

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

$ make bundle.js
make: `bundle.js' is up to date.
وارد حالت تمام صفحه شوید

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

بدون خطایی، فقط این پیام – اما هیچ دستوری اجرا نشد. دلیلش این است که به طور پیش‌فرض، Make فایل‌های بیلد را می‌سازد، و اگر این فایل‌ها وجود داشته باشند، دیگر نیازی به ساخت آنها نیست.

با این حال، حذف این وابستگی عدم وجود فایل با استفاده از .PHONY هدف ویژه شما اساساً تمام کارهایی را که به وجود یا عدم وجود فایل مرتبط نیستند، به تفکیک فاصله اضافه می‌کنید:

.PHONY: bundle.js

bundle.js:
    cat utils.js api-sdk.js app.js > bundle.js
وارد حالت تمام صفحه شوید

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

به این ترتیب، Make همیشه دستورات زیر را اجرا می کند make bundle.js اجرا می شود، مهم نیست که اگر bundle.js قبلا وجود دارد یا نه برای مثال، بازسازی فایل با محتوای به روز شده ممکن است در طول توسعه مفید باشد!

بنابراین .PHONY هدف ویژه به طور کلی چیزی است که شما می خواهید از آن استفاده کنید. فقط آن را در جایی در خود نگه دارید Makefile با لیستی از تمام کارهای Make شما که مستقل از فایل هستند، و باید خوب باشد!

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

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

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

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