Difflock: مایگریشنهای پرخطر لاراول رو قبل از دیپلوی بگیر
خلاصهٔ کاملتر
Difflock یه پکیج لاراول از Rati Rukhadze هست که مایگریشنها رو کنار دیتابیسی که قراره تغییرش بدن بررسی میکنه. به گفتهٔ Laravel News، این پکیج کد مایگریشن رو نه لود میکنه نه اجرا، فقط سورسش رو میخونه. بعد با اسکیمای زنده و اطلاعات حجم جدولها تغییراتی رو علامت میزنه که قبل از دیپلوی باید یه نگاه دقیقتر بهشون بندازی.
دستور difflock:lint بهطور پیشفرض مایگریشنهای اجرانشده رو بررسی میکنه. یه مایگریشن مثل این تو pull request عادی به نظر میرسه:
Schema::table('orders', function (Blueprint $table) {
$table->string('channel');
$table->foreignId('customer_id')->constrained()->cascadeOnDelete();
});
Schema::table('customers', function (Blueprint $table) {
$table->dropColumn('legacy_token');
$table->renameColumn('name', 'full_name');
});روی یه دیتابیس پر از داده، Difflock ستون channel رو که nullable نیست، dropColumn() مخرب و تغییر نام ستون رو گزارش میده. میگه cascadeOnDelete() رکوردهای فرزند رو داخل خود دیتابیس پاک میکنه، یعنی model event و observer و soft delete رو دور میزنه. قانونهایی هم داره که تست روی دیتابیس خالی نمیتونه بگیره. مثلاً change-column یه ->change() رو با تعریف واقعی ستون مقایسه میکنه و redundant-index ایندکس تکراری رو پیدا میکنه.
برای پیدا کردن schema drift (یعنی وقتی اسکیمای واقعی دیتابیس با چیزی که انتظار داری فرق کرده)، Difflock اسکیمای دیدهشده رو ذخیره میکنه، نه اینکه از روی مایگریشنها بازسازیش کنه. difflock:diff --save یه فایل database/difflock/schema.json میسازه که میشه commitش کرد. بعداً میتونی دیتابیس فعلی رو با همین فایل یا دو connection مثل staging و production رو با هم مقایسه کنی. این فایل فقط ساختار رو داره، نه داده یا رمز.
نصب Difflock دستور migrate لاراول رو عوض نمیکنه. محافظت فقط وقتی فعاله که از difflock:migrate استفاده کنی. این دستور اول مایگریشنها رو بررسی میکنه و اگه یافتهها به سطح تعیینشده برسن، قبل از نوشتن تو دیتابیس متوقف میشه. برای CI هم difflock:check --ci هست که با کد خروجی 0 یعنی موفق، 1 یعنی drift یا یافتهٔ پرخطر و 2 یعنی اجرا نشد جواب میده.
difflock:mcp هم یه سرور MCP (پروتکلی که ایجنتهای هوش مصنوعی باهاش به ابزارها وصل میشن) بالا میاره. با چهار ابزارش یه ایجنت کدنویسی میتونه قبل از نوشتن فایل مایگریشن اونو با اسکیمای فعلی چک کنه. difflock:explain هم بدون صدا زدن هیچ مدل زبانی یه توضیح Markdown برای مایگریشن میسازه.
نکات کلیدی:
- Difflock 1.0.0 به PHP 8.3 نیاز داره و از لاراول ۱۲ و ۱۳ پشتیبانی میکنه
- با MySQL، MariaDB، PostgreSQL و SQLite کار میکنه
- کد مایگریشن رو اجرا نمیکنه، فقط سورسش رو با اسکیمای زنده میسنجه
- difflock:check --ci کدهای خروجی 0، 1 و 2 داره
- difflock:doctor نشون میده نقش دیتابیس اجازهٔ نوشتن داره یا نه؛ برای پروداکشن نقش read-only پیشنهاد شده




