Linting & Formatting — ruff และ black
eslint + prettier → ruff
หัวข้อที่มีชื่อว่า “eslint + prettier → ruff”ในโลก TypeScript คุณต้องเซ็ต tool สองตัว คือ eslint คุมกฎด้าน code quality และ prettier คุม style ทั้งคู่มี config คนละไฟล์ คำสั่ง CLI คนละชุด และบางทีก็ตีกันเองด้วย
นักพัฒนา Python แต่ก่อนก็ใช้วิธีแยกเหมือนกัน: flake8 (lint) + black (format) แต่ ruff — เปิดตัวในปี 2022 และเขียนด้วย Rust — ตอนนี้แทนที่ทั้งคู่ หนึ่ง tool หนึ่ง section config ใน pyproject.toml และรันใน milliseconds บน codebase ทั้งหมด
การติดตั้งและรัน
หัวข้อที่มีชื่อว่า “การติดตั้งและรัน”รันในเทอร์มินัลของคุณ — ไม่ต้องใช้ Playground สำหรับคำสั่ง CLI
# ติดตั้ง (เพิ่มใน dev dependencies ของ project)pip install ruff# หรือด้วย uv:uv add --dev ruff
# Lint ทั้ง projectruff check .
# แก้ไข lint violations ที่แก้ได้อัตโนมัติruff check --fix .
# Format ทั้ง project (แทนที่ black)ruff format .
# ตรวจสอบ formatting โดยไม่เขียนไฟล์ (โหมด CI)ruff format --check .การตั้งค่า ruff เทียบกับ eslint
หัวข้อที่มีชื่อว่า “การตั้งค่า ruff เทียบกับ eslint”// .eslintrc.js (or eslint.config.js)module.exports = { parser: '@typescript-eslint/parser', plugins: ['@typescript-eslint'], rules: { 'no-unused-vars': 'error', '@typescript-eslint/no-explicit-any': 'warn', },};
// .prettierrc{ "singleQuote": true, "semi": false, "printWidth": 88}# pyproject.toml — ไฟล์เดียวสำหรับทุกอย่าง[tool.ruff]line-length = 88indent-width = 4
[tool.ruff.lint]# E/W = pycodestyle F = pyflakes I = isort UP = pyupgradeselect = ["E", "F", "I", "UP"]ignore = ["E501"] # line-too-long (จัดการโดย formatter)
[tool.ruff.format]quote-style = "double" # ตรงกับค่าเริ่มต้นของ blackblack — formatter แบบ opinionated
หัวข้อที่มีชื่อว่า “black — formatter แบบ opinionated”ก่อนจะมี ruff format ตัว black คือมาตรฐาน de-facto และยังเจอได้ทั่วไปในโปรเจกต์ Python ที่มีอยู่เดิม จุดขายคือ opinionated โดยตั้งใจ ปรับแต่งได้แทบไม่มีอะไรเลย เหมือน prettier ที่ล็อก --no-semi ไว้ตายตัว ถ้ารับช่วงโปรเจกต์ที่ใช้ black อยู่แล้วก็ใช้ต่อไป อย่าเอาสองตัวมาผสมกัน
pip install black
# Format ไฟล์เดียวblack src/main.py
# Format ทั้ง projectblack .
# โหมด check-only สำหรับ CIblack --check .Workflow การย้ายแบบใหม่
หัวข้อที่มีชื่อว่า “Workflow การย้ายแบบใหม่”# Node / TypeScript workflownpx eslint src/ --fixnpx prettier src/ --write
# หรือด้วย script รวมใน package.json:# "lint:fix": "eslint src/ --fix && prettier src/ --write"# Python workflow — ruff ทำทั้งสองอย่างruff check --fix .ruff format .
# หรือในครั้งเดียว (check แล้ว format):ruff check --fix . && ruff format .
# Makefile target (pattern ที่พบบ่อย):# lint:# ruff check --fix . && ruff format .Playground note:
ruffและblackทำงานกับไฟล์และต้องการ terminal environment รันคำสั่งข้างต้นในไดเรกทอรี project ของคุณ