EditorConfig 로 코딩 스타일 일관성 지키기(maintain consistent coding styles)
개요
세상에는 다양한 editor 와 IDE 가 있고 수많은 문자 encoding 방식이 존재합니다.
어떤 OS 는 줄 바꿈을 의미하는 개행 문자를 LF(line feed) 만 쓰고 어떤 OS 는 CR + LF(Carriage Return + Line Feed) 를 쓰기도 합니다.
대부분의 코딩 작업은 다수간의 협업이기 때문에 사용하는 도구는 취향대로 써도 되지만 작성하는 source code는 표준을 만들고 이를 준수해야 합니다.
표준이 없고 누구는 개행을 LF 로 쓰고 누구는 CR + LF 로 쓴다면 한 쪽에서 커밋한 소스를 다른 쪽에서 내려받는다면 CR + LF 문제로 인해 소스 코드의 변경이 없어도 변경되었다고 표시될수 있습니다.
누구는 들여쓰기를 tab 으로 쓰고 누구는 space 4칸, 다른 이는 space 2칸을 쓴다면 다른 이의 작업을 내려받으면 늘 늘 변경되었다고 표시되고 커밋 대상으로 나오게 됩니다.
과거에는 이런 문제를 해결하기 위해 특정 에디터를 강제하거나 IDE 를 포함해서 개발 환경을 배포하는 등 여러 가지 불편함과 비효율이 많았습니다.
EditorConfig 는 환경(Editor, OS, fIle encoding)에 따라 코딩 스타일의 일관성이 깨지는 문제를 해결하기 위한 표준으로 character encoding, 개행 처리 방법, 들여쓰기 방법(tab인지 space 인지) 등을 정의하고 있으므로 Editorconfig 를 지원하는 에디터를 사용한다면 프로젝트 참여자들의 일관된 코딩 스타일을 유지할 수 있습니다.
설치
사전 설치
에디터나 플랫폼에 따라 editorConfig 기능을 지원하는 경우가 있습니다.
Pre installed 에서 목록을 볼 수 있으며 IntelliJ 나 Visual Studio(Code 말고!), Pycharm 등이 별도 설치없이 editorConfig 를 지원합니다.
Plugin 설치
위 목록에 없는 에디터나 IDE 라면 별도로 플러그인을 설치해야 합니다.
download 에서 사용하는 환경에 맞는 플러그인을 설치해 주면 되며 다음은 대표적인 editor 용 plugin 페이지입니다.
사용
프로젝트 root 에 .editorconfig 파일을 만들고 프로젝트 참여자들간의 일관성 유지를 위해 이 파일을 버전 관리에 추가해 주면 됩니다.
대괄호안에 적용할 파일 확장자를 기술해주고 설정 값을 적어줍니다. * 로 할 경우 모든 파일에 대해서 적용합니다.
다음은 모든 파일 인코딩을 UTF-8 을 사용하고 들여쓰기는 space 4칸, 개행은 LF 를 사용하고 yaml 파일에 대해서는 들여쓰기를 2 칸으로 하는 예졔입니다.
# top-most EditorConfig file root = true # Unix-style newlines with a newline ending every file [*] charset = utf-8 end_of_line = lf insert_final_newline = true indent_style = space indent_size = 4 trim_trailing_whitespace = true [*.{yml,yaml}] indent_size = 2
# EditorConfig is awesome: https://EditorConfig.org # top-most EditorConfig file root = true # Unix-style newlines with a newline ending every file [*] charset = utf-8 end_of_line = lf insert_final_newline = true indent_style = space indent_size = 4 trim_trailing_whitespace = true [*.md] trim_trailing_whitespace = false [*.{yml,yaml}] indent_size = 2 # Matches multiple files with brace expansion notation # Set default charset [*.{js,py}] charset = utf-8 # 4 space indentation [*.py] indent_style = space indent_size = 4 # Tab indentation (no size specified) [Makefile] indent_style = tab # Matches the exact files either package.json or .travis.yml [{package.json,.travis.yml}] indent_style = space indent_size = 2