gradle/libs.versions.toml로 버전을 옮기는 중입니다. 공통 설정은 buildSrc 아래 컨벤션 플러그인에 둡니다. 버전은 한 곳에 두자는 생각이었습니다. 경우를 순서대로 놓겠습니다.
하위 프로젝트의 빌드 스크립트에서는 alias(libs.plugins.kotlin.jvm)도 libs도 잘 됩니다. 불만 없습니다.
buildSrc 자체의 빌드 스크립트는 메인 프로젝트의 카탈로그를 물려받지 않습니다. buildSrc/settings.gradle.kts에서 직접 가져와야 합니다.
dependencyResolutionManagement {
versionCatalogs {
create("libs") {
from(files("../gradle/libs.versions.toml"))
}
}
}
여기까지도 문서대로입니다. 자기 저장소의 파일이 어디 있는지 buildSrc에 일일이 알려 줘야 한다는 게 조금 이상하지만, 동작하고 접근자도 생깁니다.
세 번째부터 피곤해집니다. buildSrc 안의 미리 컴파일된 스크립트 플러그인에는 타입 안전한 libs가 없습니다. 문서는 extensions.getByType(VersionCatalogsExtension::class.java).named("libs")로 카탈로그를 이름으로 꺼낸 뒤 항목마다 별칭으로 물어보라고 합니다. 게다가 그 플러그인의 plugins 블록은 카탈로그에 아예 닿지 않습니다. 다른 플러그인을 적용하는 컨벤션 플러그인은 id로만 이름을 부르고, 버전은 buildSrc가 플러그인 아티팩트를 선언한 곳에서 옵니다.
그림이 고르지 않습니다. 제일 덜 중요한 빌드 스크립트가 제일 좋은 접근자를 받고, 공통 설정 대부분이 사는 컨벤션 플러그인은 문자열 조회를 받습니다.
결국 이름으로 꺼내야 하는 곳이 꼭 하나 남습니다. 이럴 거면 컨벤션 플러그인 안의 좌표는 그냥 문자열로 두는 편이 정직한 것 아닌가 싶습니다.