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 شما که مستقل از فایل هستند، و باید خوب باشد!