종속성 관리
- 외부 종속성은 npm 레지스트리에서 제공되며, 생태계의 귀중한 코드를 활용하여 애플리케이션과 라이브러리를 더 빠르게 빌드할 수 있습니다.
- 내부 종속성을 사용하면 저장소 내에서 기능을 공유할 수 있어 공유 코드의 검색 가능성과 사용성이 크게 향상됩니다. 내부 패키지를 빌드하는 방법에 대해서는 다음 가이드에서 논의하겠습니다.
종속성 설치 모범 사례
사용되는 곳에 종속성 설치
저장소에 종속성을 설치할 때 해당 종속성을 사용하는 패키지에 직접 설치해야 합니다. 패키지의 package.json에는 패키지에 필요한 모든 종속성이 있습니다. 이는 외부 및 내부 종속성 모두에 적용됩니다.
Good to know:
패키지 관리자가 패키지와 다른 node_modules 위치를 사용하도록 선택할 수 있습니다.
여러 패키지에 빠르게 종속성을 설치하려면 패키지 관리자를 사용할 수 있습니다:
이 관행에는 여러 가지 이점이 있습니다:
- 명확성 향상: 패키지의 종속성이
package.json에 나열되어 있으면 패키지가 의존하는 것을 이해하기가 더 쉽습니다. 저장소에서 작업하는 개발자는 패키지 내에서 사용되는 종속성을 한눈에 볼 수 있습니다. - 유연성 향상: 대규모 모노레포에서는 각 패키지가 외부 종속성의 동일한 버전을 사용할 것으로 기대하는 것이 비현실적일 수 있습니다. 동일한 코드베이스에서 작업하는 많은 팀이 있을 때 대규모 운영의 현실로 인해 우선순위, 일정 및 요구 사항이 달라집니다. 사용되는 패키지에 종속성을 설치하면
ui팀이 TypeScript의 최신 버전으로 업데이트할 수 있고web팀은 새로운 기능을 제공하는 데 우선순위를 두고 나중에 TypeScript를 업데이트할 수 있습니다. 또한 여전히 종속성 버전을 동기화하려면 그렇게 할 수도 있습니다. - 더 나은 캐싱 능력: 저장소 루트에 너무 많은 종속성을 설치하면 종속성을 추가, 업데이트 또는 삭제할 때마다 Workspace 루트를 변경하여 불필요한 캐시 미스가 발생합니다.
- 사용되지 않는 종속성 정리: Docker 사용자의 경우 Turborepo의 정리 기능을 사용하여 Docker 이미지에서 사용되지 않는 종속성을 제거하여 더 가벼운 이미지를 만들 수 있습니다. 종속성이 의도된 패키지에 설치되면 Turborepo는 lockfile을 읽고 필요한 패키지에서 사용되지 않는 종속성을 제거할 수 있습니다.
루트에 종속성 적게
위의 첫 번째 원칙에 따라 사용되는 곳에 종속성 설치하면 자연스럽게 Workspace 루트에 종속성이 거의 없게 됩니다.
Workspace 루트에 속하는 유일한 종속성은 저장소 관리를 위한 도구이며, 애플리케이션과 라이브러리를 빌드하기 위한 종속성은 해당 패키지에 설치됩니다. 루트에 설치하는 것이 합리적인 종속성의 몇 가지 예는 turbo, husky 또는 lint-staged입니다.
종속성 관리
Turborepo는 종속성을 관리하지 않음
Turborepo는 종속성 관리에서 역할을 하지 않으며, 해당 작업을 선택한 패키지 관리자에 맡깁니다.
올바른 외부 종속성 버전 다운로드, 심볼릭 링크 생성 및 모듈 해결과 같은 작업을 처리하는 것은 패키지 관리자의 몫입니다. 이 페이지의 권장 사항은 Workspace에서 종속성을 관리하기 위한 모범 사례이며 Turborepo에서 강제하지 않습니다.
패키지 관리자 간 모듈 해결 차이
패키지 관리자에는 서로 다른 모듈 해결 알고리즘이 있어 예측하기 어려운 동작 차이가 발생합니다.
Turborepo 문서에서는 패키지 관리자의 예상 동작에 따라 많은 권장 사항을 제공합니다. 종속성 처리 방법에 대한 범위는 최선의 노력이며 패키지 관리자 또는 저장소의 요구 사항에 맞게 문서화된 동작을 조정해야 할 수 있습니다.
그러나 모든 패키지 관리자 또는 특정 패키지 관리자에 대해 보편적으로 잘못된 것으로 보이는 문서 문제를 발견하면 GitHub Issue를 통해 알려주시면 개선할 수 있습니다.
node_modules 위치
패키지 관리자 선택, 버전, 설정 및 Workspace에서 종속성이 설치된 위치에 따라 Workspace 내의 다양한 위치에서 node_modules와 그 안의 종속성을 볼 수 있습니다. 종속성은 루트 node_modules, 패키지의 node_modules 또는 둘 다에서 찾을 수 있습니다.
스크립트와 작업이 필요한 종속성을 찾을 수 있는 한 패키지 관리자가 올바르게 작동하고 있는 것입니다.
코드에서 `node_modules` 참조
Workspace 내 node_modules의 특정 위치는 패키지 관리자의 공개 API의 일부가 아닙니다. 즉, node_modules를 직접 참조하는 것(예: node ./node_modules/a-package/dist/index.js)은 Workspace 주변의 다른 종속성 변경으로 인해 디스크의 종속성 위치가 변경될 수 있으므로 취약할 수 있습니다.
대신 가능한 한 Node.js 생태계의 규칙을 사용하여 종속성 모듈에 액세스하세요.
동일한 버전의 종속성 유지
일부 모노레포 유지 관리자는 규칙에 따라 모든 패키지에서 종속성을 동일한 버전으로 유지하는 것을 선호합니다. 이를 달성하는 방법에는 여러 가지가 있습니다:
전용 도구 사용
이 특정 목적을 위해 syncpack, manypkg 및 sherif와 같은 도구를 사용할 수 있습니다.
패키지 관리자 사용
패키지 관리자를 사용하여 하나의 명령으로 종속성 버전을 업데이트할 수 있습니다.
pnpm 카탈로그
pnpm v9.5+에서는 카탈로그를 사용하여 종속성 버전 범위를 재사용 가능한 상수로 정의할 수 있습니다. Workspace 전체에서 동일한 값을 참조하므로 종속성을 동일한 버전으로 유지합니다.
자세한 내용은 pnpm 카탈로그 문서를 방문하세요.
IDE 사용
IDE의 리팩토링 도구를 사용하여 저장소의 모든 package.json 파일에서 종속성 버전을 한 번에 찾고 바꿀 수 있습니다. package.json 파일에서 next 패키지의 모든 인스턴스를 찾고 원하는 버전으로 바꾸려면 "next": ".*"와 같은 정규식을 사용해 보세요. 완료되면 패키지 관리자의 install 명령을 실행하여 lockfile을 업데이트해야 합니다.
다음 단계
이제 Workspace에서 효과적으로 종속성을 관리하는 방법을 알았으므로 모노레포에서 종속성으로 사용할 Internal Package를 생성해 보겠습니다.