콘텐츠로 이동

대규모 프로젝트에서 Biome 사용하기

Biome는 모노레포 또는 여러 프로젝트를 포함하는 워크스페이스와 같은 대규모 프로젝트에서 올바르게 사용할 수 있도록 도와주는 몇 가지 도구를 제공합니다.

Biome의 기능을 사용할 때(명령줄 인터페이스 또는 LSP를 통해), 도구는 현재 작업 디렉터리를 기준으로 가장 가까운 구성 파일을 찾습니다.

만약 현재 디렉터리에서 구성 파일을 찾지 못하면, 파일 시스템의 디렉터리 위로 계속 탐색하여 구성 파일을 찾아냅니다.

이 기능을 활용해 프로젝트/폴더에 따라 다른 설정을 적용할 수 있습니다.

예를 들어 백엔드 애플리케이션과 새로운 프론트엔드 애플리케이션이 포함된 프로젝트가 있다고 가정해봅시다.

  • app - backend - biome.json - package.json - frontend - biome.json - legacy-app - package.json - new-app - package.json

이는 app/backend/package.json에서 스크립트를 실행할 경우, Biome가 app/backend/biome.json 구성 파일을 사용한다는 의미입니다.

반면 app/frontend/legacy-app/package.json 또는 app/frontend/new-app/package.json에서 스크립트를 실행할 경우, Biome는 app/frontend/biome.json 구성 파일을 사용하게 됩니다.

extends 구성 옵션을 사용하면 구성 옵션을 파일 간에 분리할 수 있습니다.

다음과 같은 요구사항이 있다고 가정해봅시다:

  • legacy-app 프로젝트는 공백(스페이스)을 사용하여 포맷해야 함;
  • backendnew-app 프로젝트는 탭을 사용하여 포맷해야 함;
  • 모든 프로젝트는 줄 너비를 120으로 설정해야 함;
  • backend 프로젝트는 추가 검사가 필요함;

먼저 app/biome.json에 새로운 구성 파일을 만들고, 공유되는 옵션들을 여기에 넣어줍니다.

app/biome.json
{
"formatter": {
"enabled": true,
"lineWidth": 120
}
}

다음으로 app/frontend/biome.jsonapp/frontend/legacy-app/이동합니다. 왜냐하면 이곳에서 다른 형식을 사용해야 하기 때문입니다.

app/frontend/legacy-app/biome.json
{
"formatter": {
"indentStyle": "space"
}
}

그리고 이제 biome.json 파일에서 주 구성 파일인 app/biome.json의 모든 옵션을 상속하도록 지시합니다. 이때 extends 속성을 사용합니다.

app/frontend/legacy-app/biome.json
{
"extends": ["../../biome.json"],
"formatter": {
"indentStyle": "space"
}
}

이제 app/backend/biome.json으로 이동하여 린팅을 활성화합니다.

app/backend/biome.json
{
"extends": ["../biome.json"],
"linter": {
"enabled": true,
"rules": {
"recommended": true
}
}
}

모노레포는 하나의 큰 저장소 안에 여러 라이브러리를 저장하고 유지 관리하는 특수한 형태의 저장소입니다. 각 라이브러리는 자체적인 프로젝트로, 서로 다른 구성 설정을 가질 수 있습니다.

Biome는 일부 내부 구성 파일 해석의 제한으로 인해 모노레포를 잘 지원하지 않습니다. 버그 관련 논의에 참여하고 지원할 수 있습니다.

현재 제한에도 불구하고 최상의 개발 경험을 위해, 모노레포의 루트에 biome.json을 두고, overrides 설정을 사용하여 특정 패키지에서의 Biome 동작을 변경하는 것이 권장됩니다.

다음 예시에서는 packages/logger 패키지 내에서 규칙 suspicious/noConsoleLog를 비활성화합니다.

biome.jsonc
{
"linter": {
"enabled": true,
"rules": {
"recommended": true
}
},
"overrides": [
{
"include": ["packages/logger/**"],
"linter": {
"rules": {
"suspicious": {
"noConsoleLog": "off"
}
}
}
}
]
}