커밋 전 코드 린트 및 포맷 자동 실행

Discourse는 git 훅에 lefthook을 사용하며, 동일한 검사를 수동으로 실행하기 위한 주요 CLI 진입점으로 bin/lint를 사용합니다.

로컬 클론에서 작업하고 있다면 훅을 한 번만 설치하십시오:

pnpm install
pnpm lefthook install

이후에는 git commit 시 스테이지된 파일이 자동으로 검사됩니다.

주요 명령어: bin/lint

pre-commit 훅을 기다리지 않고 저장소의 구성된 린터(linter)를 직접 실행하려면 bin/lint를 사용하십시오.

일반적인 예시:

bin/lint
bin/lint path/to/file.rb path/to/file.gjs
bin/lint --recent
bin/lint --staged
bin/lint --unstaged
bin/lint --wip
bin/lint --fix path/to/file.rb
bin/lint --fix --recent
bin/lint --fix

각 모드의 동작

  • bin/lint: 저장소의 모든 지원 파일을 린트합니다
  • bin/lint path/to/file ...: 지정된 파일만 린트합니다
  • bin/lint --recent: 지난 50개 커밋에서 변경된 파일 및 추적되지 않는(untracked) 파일을 린트합니다
  • bin/lint --staged: 스테이지된 파일만 린트합니다
  • bin/lint --unstaged: 스테이지되지 않은(unstaged) 파일만 린트합니다
  • bin/lint --wip: 스테이지된 파일, 스테이지되지 않은 파일, 그리고 main 이후 변경된 파일을 린트합니다
  • bin/lint --fix ...: 선택된 파일에 대해 자동 수정(auto-fixer)을 실행합니다
  • bin/lint --fix: 저장소 전체에서 사용 가능한 모든 자동 수정기를 실행합니다
  • bin/lint --verbose: 기반이 되는 lefthook 명령어를 출력합니다

명시적으로 파일을 전달하면, bin/lint는 lefthook을 호출하기 전에 지원되는 린팅 가능 파일 유형으로 필터링합니다.

:information_source: 마크다운 파일은 docs/developer-guides/ 하위에서만 린트됩니다. 다른 마크다운 파일에 bin/lint path/to/doc.md를 실행하면 아무것도 린트되지 않았다고 보고됩니다.

린트 대상

정확한 구성은 lefthook.yml에 있습니다. 작성 시점 기준으로 bin/lint는 다음을 포함합니다:

Ruby

  • **/*.{rb,rake,thor}
  • bin/**/* 하위의 Ruby 스크립트
  • Gemfile

검사 항목:

  • rubocop
  • syntax_tree (stree check)

JavaScript, GJS, CSS, SCSS 포맷팅

  • app/assets/stylesheets/**/*.{css,scss}
  • frontend/**/*.{js,gjs,scss,css,cjs,mjs}
  • 일치하는 플러그인 및 테마 자산 파일

검사 항목:

  • prettier/pprettier

JavaScript 및 GJS 린팅

  • frontend/**/*.{js,gjs}
  • 일치하는 플러그인 및 테마 JS 파일

검사 항목:

  • eslint (.gjs 파일의 템플릿 부분을 다루는 eslint-plugin-ember의 template-* 규칙 포함)

SCSS 린팅

  • app/assets/stylesheets/**/*.scss
  • 일치하는 플러그인 및 테마 SCSS 파일

검사 항목:

  • stylelint

YAML 및 로케일(locale) 검사

  • config/database.yml을 제외한 **/*.{yaml,yml}
  • **/{client,server}.en.yml

검사 항목:

  • yaml-lint
  • script/i18n_lint.rb

타입 검사

파일 인자 없이 bin/lint를 실행하면 전체 저장소 린트와 함께 다음도 실행됩니다:

  • pnpm lint:types

이것은 Discourse의 타입 정보를 위한 Glint/TypeScript 스타일의 검사입니다. TypeScript의 strict 모드에서 실행되며 게시용 선언(declarations)도 생성합니다.

:information_source: bin/lint path/to/file과 pre-commit 훅은 전체 타입 검사를 실행하지 않습니다. 저장소 전체에 걸친 완전한 린트 패스를 원할 때는 단순히 bin/lint를 사용하십시오.

자동 수정 가능한 항목

bin/lint --fix는 많은 문제를 자동으로 수정할 수 있지만, 모든 문제는 아닙니다.

자동 수정은 다음에 구성되어 있습니다:

  • prettier --write
  • eslint --fix
  • stylelint --fix
  • rubocop -A
  • syntax_tree (stree write)

실제로 이는 --fix가 다음과 같은 재포맷 및 재작성을 수행할 수 있음을 의미합니다:

  • Ruby
  • JavaScript / GJS
  • CSS / SCSS

다음 검사들은 bin/lint --fix에 의해 자동 수정되지 않습니다:

  • YAML 구문 검증
  • client.en.yml / server.en.yml에 대한 i18n 린팅
  • Glint/타입 검사

git 훅과의 관계

pre-commit 훅은 bin/lint와 동일한 lefthook 구성을 사용하지만, 스테이지된 파일에만 대해 실행됩니다.

즉:

  • 스테이지된 파일이 린팅을 통과하지 못하면 커밋이 실패할 수 있습니다
  • bin/lint --staged는 pre-commit 훅과 가장 가까운 수동 등가 명령입니다
  • bin/lint --fix --staged는 곧 커밋할 내용을 정확히 복구하는 좋은 방법입니다

실용적인 워크플로우

일상적인 개발을 위해 가장 유용한 명령어는 다음과 같습니다:

# 몇 개의 변경된 파일을 커밋하기 전에
bin/lint --fix path/to/file1.rb path/to/file2.gjs

# pre-commit 훅이 검사할 내용과 정확히 동일하게 확인
bin/lint --staged

# 현재 진행 중인 모든 작업을 정리
bin/lint --fix --wip

# 타입 검사를 포함한 전체 저장소 린트 스위트 실행
bin/lint

이 문서는 버전 관리됩니다 - 변경 제안은 GitHub에서 가능합니다.

11개의 좋아요

7개의 게시글이 새 주제 Discourse에서 린팅 디버깅으로 분리되었습니다.