build.gradle 하나를 봤는데 로직의 절반이 실행 중에 delegate를 바꿔 끼우는 클로저 안에 있었어요. 뭐가 뭘 뜻하는지 알아내는 데 한참 걸렸어요.
Groovy에서는 이게 너무 쉬워요. 클로저는 기본적으로 한정되지 않은 이름을 owner에서 먼저 찾고, DSL은 resolveStrategy를 Closure.DELEGATE_FIRST로 바꿔서 순서를 뒤집어요. 문서가 있는 설정 블록이라면 괜찮아요. 다른 파일의 헬퍼가 delegate를 바꿔 버려서 그냥 쓴 version이 슬그머니 다른 걸 가리키기 시작하면 괴로워요.
빌드 스크립트는 쓰는 것보다 읽히는 일이 훨씬 많고, 읽는 사람은 대개 의존성 하나 올리러 온 사람이에요. 그래서 제 규칙은 지루해요. 스크립트에는 선언형 블록만 둬요. 반복문이나 조건이 들어가는 건 이름과 테스트가 있는 플러그인 클래스로 옮겨요. 빌드에서 metaClass 장난은 절대 안 돼요.
파일이 늘어난다는 반론이 늘 나와요. 네, 늘어나요. 그래도 다음 사람이 디버거로 빌드를 한 줄씩 따라가지 않고 version이 뭘 가리키는지 알 방법은 그것뿐이에요.