لینت Lint
یا لینتر Linter
ابزاری است که به ما کمک میکنه تا سورس کد نوشته شده را آنالیز کنیم و خطا های برنامه نویسی ، هشدار های مربوط به سبک کد نویسی Stylistic errors
و در کل خطا های احتمالی را به صورت خودکار تشخیص دهیم.اصطلاح لینت هم از یک ابزار نوشته شده مبتنی بر Unix
برای زبان C
گرفته شده است.
ممکنه براتون سوال پیش بیاد که با وجود Integrated development environment
های امروزی چه نیازی به ابزار لینت است و چرا باید ازش استفاده کنیم. در ابتدا باید گفت بسیاری از IDE
ها شامل ابزار لینت هستن که در هسته اصلی خودشون برای راهنمایی بیشتر از آن استفاده میکنند ولی مسئله اصلی اینه که در پروژه های بزرگ امکان استفاده از IDE
بسیار کم بوده و با توجه به اینکه پروژه ها تیمی زیادی وجود داشته و در خیلی از موارد کنترل ابزار توسعه افراد سخت بوده و از ابزار های متفاوتی استفاده میکنند، اینجاست که ابزار لینت به کمک ما میاد تا خطا های احتمالی را کاهش، خوانایی و کیفیت کلی کد را افزایش دهیم.
یکی از معمول ترین بررسی هایی که توسط لینتر انجام میشود، خطاهای نحوی هستند. بعضی از زبان های برنامه نویسی از این قابلیت به صورت پیش فرض پشتیبانی میکنند. به صورت مثال کد زیر را در نظر بگیرید که با زبان PHP
نوشته شده است و در فایل mail.php
ذخیره شده :
<?php
Class Mail{
public static function send() {
try {
// ... Sending
}catch(\Exception $e) {
// ... Throws exception
}
}
}
برای بررسی خطاهای نحوی کد میتوانید از طریق خط فرمان دستور زیر را اجرا کنید:
php -l mail.php
در قطعه کد بالا کلمه try
به صورت صحیح نمی باشد. بدون اجرا کد، کد بررسی و در نتیجه پیغام زیر را مشاهده میکنیم:
PHP Parse error: syntax error, unexpected '{' in mail.php on line 4
Errors parsing mail.php
بعد از تصحیح کد و اجرای مجدد دستور خروجی زیر را مشاهده میکنید :
No syntax errors detected in mail.php
یکی دیگه از قابلیت هایی که توسط بعضی از لینترها میتونه صورت بگیره بررسی رعایت استاندارد کد هست. این مورد در کارهایی تیمی نقش بسزایی دارد تا کد با یک سبک استاندارد نوشته شود.
به صورت مثال کد زیر را درJavaScript
در نظر بگیرید ES6
:
let sum = (a, b)=>a + b
حال با استفاده از ابزار ESLint
کد بالا را آنالیز می کنیم که خروجی آن برابر است با :
Missing space before =>.
Missing space after =>.
'sum' is assigned a value but never used.
در پیکربندی لینتر استفاده از فاصله در قبل و بعد از =>
ذکر شده است اما در کد بالا این مورد رعایت نشده و باعث نمایش پیغام های متناسب شده است.
در پیکربندی اکثر ابزار های لینتر شما می توانید تابع های طولانی ( از نظر خط)، هشدار های امنیتی، تعاریف تکراری و بسیاری از هشدار و خطا های احتمالی را شناسایی کنید.
همانطور که گفتم برای زبان های مختلف ابزار های مختلفی وجود دارد اما ممکن است این ابزارها به تنهایی پاسخگو نیاز شما نباشند و نیاز به ترکیب یا نوشتن ابزار خاص خود را داشته باشید.
خوب برای اینکه بیشتر ویژگی های لینتر آشنا بشیم با استفاده از PHAN
که یک static analyzer
برای زبان PHP
هست کدها را آنالیز میکنیم. قبل از شروع باید به این نکته توجه کرد که لینتر ها نوعی static analyzer
هستند.
برای نصب PHAN
با composer
از دستور زیر استفاده می کنیم:
composer require phan/phan
بعد از نصب نیاز داریم تا فایل پیکربندی مورد نیاز را بسازیم (به طور معمول اکثر ابزاری های لینتر از یک فایل پیکربندی پیروی می کنند) .
در نظر داشته باشید برای استفاده از PHAN
نسخه PHP
شما باید PHP 7.1
یا بالاتر باشد و php-ast extension
نصب شده باشد. البته شما میتوانید بدون نصب php-ast
نیز برنامه را با استفاده از گزینه --allow-polyfill-parser
اجرا نمایید.
یکی از موارد مهمی که باید در ساخت فایل کانفیگ به آن دقت کنید نسخه PHP
سورس کد نوشته شده میباشد. این مورد به ما کمک می کند تا در صورتی که از قابلیت های حذف شده و یا از قابلیت هایی که در این نسخه پشتیبانی نمیشود استفاده کرده باشیم از آن مطلع شویم.
در فایل کانفیگ باید مسیر کد های نرم افزار قرار داده شود که ما مسیر src
را وارد میکنیم. پوشه vendor
نیاز به بررسی ندارد برای همین در لیست exclude
قرار میگیرد. ما فایل کانفیگ خود را در مسیر config/phan.php
ذخیره میکنیم.
برای اطلاعات بیشتر میتوانید از این صفحه استفاده کنید.
در نظر داشته باشید ابزار اجرایی در مسیر /vendor/phan/phan
قرار دارد و شما میتوانید آن را به PATH
سیستم عامل خود اضافه کنید تا بدون نوشتن مسیر از آن استفاده نمایید.
خوب کد زیر را در نظر بگیرید که در src/index.php
ذخیر شده است:
<?php
function demo($param, $arg) : ?int {
// Phan can infer types, detect missing elements,
// and detect incorrect calls.
global $argc;
var_export(new my_class());
$cond = $param > 5;
if (!($arg instanceof SplObjectStorage)) { return $argc; }
$arg->attach($cond);
$arg->atach(new stdClass());
$arg->attach(
new MyClass($argc),
[],
'extra'
);
// Phan can detect redundant/impossible conditions
// and unused variables.
$always_true = is_bool($cond);
echo "Missing variable is $argv\n";
return $arg;
}
class MyClass {
public function __construct(string $x = null) {
// and detect undeclared properties, etc.
$this->x = $x;
}
}
demo(2, new SplObjectStorage());
حال برای آنالیز کد خود از دستور phan --allow-polyfill-parser -k config/phan.php
استفاده میکنیم که خروجی زیر در خط فرمان ظاهر میشود:
src/index.php:6 PhanUndeclaredClassMethod Call to method __construct from undeclared class \my_class (Did you mean class \MyClass)
src/index.php:10 PhanTypeMismatchArgumentInternalProbablyReal Argument 1 ($obj) is $cond of type bool but \SplObjectStorage::attach() takes object
src/index.php:11 PhanUndeclaredMethod Call to undeclared method \SplObjectStorage::atach (Did you mean expr->attach())
src/index.php:12 PhanParamTooManyInternal Call with 3 arg(s) to \SplObjectStorage::attach(object $obj, $inf = unknown) which only takes 2 arg(s)
src/index.php:13 PhanTypeMismatchArgument Argument 1 ($x) is $argc of type int but \MyClass::__construct() takes ?string defined at src/index.php:25
src/index.php:20 PhanUndeclaredVariable Variable $argv is undeclared (Did you mean $arg or $argc or (global $argv))
src/index.php:21 PhanTypeMismatchReturnReal Returning type \SplObjectStorage but demo() is declared to return ?int
src/index.php:27 PhanUndeclaredProperty Reference to undeclared property \MyClass->x
در خط اول آنالیز کد مشخص میشود که کلاس صدا زده شده در خط 6 برنامه وجود ندارد و کلاس MyClass
را به عنوان مورد صحیح پیشنهاد کرده است. همچنین به ترتیب در خطوط بعدی ناسازگاری های نوع ورودی، استفاده از توابع تعریف نشده، ارسال آرگومان اشتباه، تشخیص شرط ثابت ( غیر ممکن)، متغیر استفاده نشده، استفاده از متغیر تعریف نشده، ناسازگاری خروجی تابع ها، استفاده از مشخصه های تعریف نشده را به ما نشان میدهد.
امیدوارم در این مقاله تونسته باشم به خوبی شما را با ابزار لینتر آشنا کنم.