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

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

로컬 클론에서 작업 중이라면 훅을 한 번만 설치하십시오:

pnpm install
pnpm lefthook install

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

주요 명령어: bin/lint

pre-commit 훅을 기다리는 대신 저장소의 설정된 린터를 직접 실행하려면 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개 커밋에서 변경된 파일 및 추적되지 않는 파일을 린트합니다.
  • bin/lint --staged: 스테이징된 파일만 린트합니다.
  • bin/lint --unstaged: 스테이징되지 않은 파일만 린트합니다.
  • bin/lint --wip: 스테이징된 파일, 스테이징되지 않은 파일, 그리고 main 이후 변경된 파일을 린트합니다.
  • bin/lint --fix ...: 선택된 파일에 대해 자동 수정 도구를 실행합니다.
  • bin/lint --fix: 저장소 전체에서 사용 가능한 모든 자동 수정 도구를 실행합니다.
  • bin/lint --verbose: 기반이 되는 lefthook 명령어를 출력합니다.

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

:information_source: 마크다운 문서 파일은 현재 bin/lint의 일부가 아니므로, 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-embertemplate-* 규칙 포함)

SCSS 린팅

  • app/assets/stylesheets/**/*.scss
  • 매칭되는 플러그인 및 테마 SCSS 파일

검사 항목:

  • stylelint

YAML 및 로케일 검사

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

검사 항목:

  • yaml-lint
  • script/i18n_lint.rb

타입 검사

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

  • pnpm lint:types

이는 Discourse의 JavaScript 타입 정보를 위한 Glint/TypeScript 스타일의 검사입니다.

: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 훅과 가장 유사한 수동 equivalent입니다.
  • 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 posts were split to a new topic: Debugging linting on Discourse