سهولت برنامه نویسی تیمی با EditorConfig
یکی از اولین مشکلات کار تیمی هماهنگ کردن Code Style بین برنامه نویس هاست. یکی Tab دوست داره یکی Space. یکی روی ویندوز کار میکنه یکی لینوکس. توسعه یک پروژه و کنترل نسخه در این شرایط خیلی سخت میشه. ولی راه ساده ای برای برطرف کردن این مشکلات وجود داره.
تمیز بودن کدهای یک پروژه از مهم ترین ویژگی هایی که باید رعایت بشه. میتونید در این Gist خلاصه ای مفید از تعریف کد تمیز مطالعه کنید :
EditorConfig چیه ؟
وقتی شما یک پروژه در حال توسعه دارید ٬ افراد مختلفی روی اون کار می کنن که هرکدوم سیستم عامل و IDE متفاوتی هم ممکنه داشته باشن. انجام امور فنی در چنین شرایطی خیلی سخته چون خروجی کار هرکدام از افراد مجموعه ممکنه استایل متفاوتی با دیگر اعضا داشته باشه. اینجا است که EditorConfig به کمک ما میاد و تنها با نوشتن یک فایل میتونیم قوانین پیشفرضی رو برای پروژه مون تعریف کنیم.
روش کار به چه صورته ؟
در حال حاضر IDE ها کاملا از EditorConfig پشتیبانی می کنند. یکسری ها پیشفرض این قابلیت را دارند و یکسری ها هم با نصب Plugin به این قابلیت دست پیدا می کنند ( در انتها لیست کامل ذکر شده ).
و اما خود EditorConfig ... در اینجا ما هیچ تنظیمات خاصی وجود نداره و همه چیز فقط با استفاده از یک فایل انجام میشه. دقیقا همانند چیزی که در gitignore داریم.
اینجا فایلی با نام .editorconfig
در محل اصلی پروژه میسازیم و تنظیمات خودمون رو در اون قرار میدیم. به محض اینکه یک پروژه را باز کنیم Plugin به جستجوی این فایل میپردازه و پس از اون گزینه های مورد نظر اعمال میشه.
ساختار فایل
قالب این فایل مشابه ini بوده و گزینه های خیلی زیادی هم وجود نداره که در ادامه بهشون میپردازیم. این یک فایل نمونه است :
root = true
[*]
end_of_line = lf
insert_final_newline = true
[*.py]
indent_style = tab
[lib/**.js]
indent_style = space
indent_size = 2
همه چیزی که اینجا وجود داره اینه :
- برای تمام فایل ها EOL روی
lf
تنظیم بشه - در انتهای هر فایل یک خط خالی قرار داده بشه
- برای فایل ها با پسوند
py.
فرورفتگی های به صورت tab باشه - برای تمام فایل ها با پسوند
js.
در پوشه یlib
فرورفتگی ها به صورت space معادل ۲ فاصله باشه
گزینه ها
در ادامه لیست کل گزینه های موجود رو مشاهده می کنید :
گزینه | مقدار قابل تنظیم | توضیحات | هدف |
indent_style | tab , space |
مشخص کردن نوع فرورفتگی ها | |
indent_size | integer, tab |
مشخص کردن سایز فرورفتگی. اگر روی tab تنظیم بشه برابر با مقداری tab_width خواهد بود. در صورتی که این مقدار در فایل تعریف نشده باشه ٬ از مقدار مشخص شده در IDE استفاده میشه. |
|
tab_width | integer | مشخص کردن عرض هر کارکتر tab | |
end_of_line | lf , crlf , cr |
تنظیم EOL برای فایل ها. جهت اطلاعات بیشتر به این لینک مراجعه کنید | |
charset | latin1 , utf-8 ,utf-16be , utf-16le ,utf-8-bom |
مشخص کردن character encoding | |
trim_trailing_whitespace | true , false |
حذف کارکتر خالی اضافه در انتهای خط های فایل | |
insert_final_newline | true , false |
قرار دادن یک خط خالی در انتهای فایل ها | |
max_line_length | integer, off |
مشخص کردن نهایت طول هر خط که پس از آن به طور خودکار شکسته شده و به خط بعدی می رود. این گزینه ممکنه در بعضی IDE ها کار نکنه و از تنظیمات خود برنامه استفاده بشه | |
quote_type | single , double , auto |
کارکتر انتخابی برای پوشش رشته ها به صورت ' یا " |
رشته های موجود در کد |
c_include_path | لیست پوشه های جدا شده با علامت : |
اختصاص پوشه مربوط به فایل های Header برای بعضی زبان های خاص. جهت جلوگیری از خطاهای رایج | زبان های خانواده C |
java_class_path | لیست مسیر های جدا شده با علامت : |
اختصاص CLASSPATH مورد نیاز برای بعضی Plugin ها |
زبان جاوا |
curly_bracket_next_line | true , false |
تنظیم اینکه براکت توابع یا کلاس ها جلوی نام آن ها قرار بگیرد یا در خط بعدی | زبان های خانواده C |
spaces_around_operators | true , false , hybrid |
تنظیم اینکه اطراف اپراتور ها فاصله خالی قرار بگیرد یا نه | |
spaces_around_brackets | none , inside , outside ,both |
تنظیم اینکه اطراف براکت ها فاصله قرار بگیرد و اینکه فاصله در کجا باشد | |
indent_brace_style | K&R , Allman , GNU ,Horstmann و غیره |
اعمال استایل برای نوع فرورفتگی ها. جهت اطلاعات بیشتر به این لینک مراجعه کنید | زبان های خانواده C |
الگوهای انتخاب حوزه
حالا که با تمام گزینه های موجود آشنا شدید وقتشه که به مبحث انتخاب حوزه بپردازیم. همونطور که در فایل نمونه مشاهده کردید ما میتونیم برای پوشه های مختلف یا حتی فایل های با فرمت خاص ٬ قوانین متفاوتی تعریف کنیم. اینجا اکثر قوانین شبیه به فایل gitignore
هستند.
*
: برابر با هر رشته ای از کارکتر ها به جز/
**
: برابر با هر رشته ای از کارکتر ها به جز?
: برابر با هر کارکتری[name]
: برابر با هر کارکتر موجود در رشتهname
[!name]
: برابر با هر کارکتری که در رشتهname
نباشد{s1,s2,s3}
: برابر با هرکدام از رشته های موجود در لیست{num1..num2}
: برابر با هر عددی بین num1 و num2
برای مثال به این موارد نگاه کنید :
[*.{js,py}]
charset = utf-8
در اینجا حوزه ما تمام فایل ها با پسوند py یا js تنظیم میشه.
[{package.json,.travis.yml}]
indent_style = space
indent_size = 2
در اینجا تنظیمات دقیقا روی دو فایل package.json
و .travis.yml
اعمال میشه.
لیست IDE ها
همونطور که در ابتدای مطلب گفتم ٬ یکسری از IDE ها و محیط ها به صورت پیشفرض از EditorConfig پشتیبانی میکنن و نیاز به نصب هیچ چیز اضافی نیست. مانند این موارد :
و در ادامه برای استفاده از EditorConfig در این موارد نیاز به نصب Plugin جدایی دارید :