fix(rte.rdt): 버전 업데이트가 프로퍼티로 지정된 dependency 의 version 을 실제 값으로 덮어써 모듈 버전이 갈리는 문제 수정 - #156
Conversation
… 버전이 갈리는 문제 수정 PomObject.changeVersion() 이 <version> 엘레멘트를 항상 실제 버전 문자열로 덮어써서, 프로퍼티로 버전을 관리하는 pom 에서는 해당 dependency 만 값이 박히고 프로퍼티는 옛 버전으로 남았다. 같은 프로퍼티를 쓰는 다른 모듈은 갱신되지 않아 한 번의 업데이트로 spring-core 6.2.11 + spring-beans 6.2.9 처럼 버전이 갈렸다. 설치된 버전이 이 pom 의 <properties> 로 지정된 것이면 기존 changeProperty(key, value) 로 프로퍼티를 고치도록 했다. isPropertyVersion() 은 이 pom 의 properties 에서 값을 찾았을 때만 true 이므로 부모 pom 의 프로퍼티는 이 경로로 들어오지 않는다. 버전이 리터럴이면 종전대로 <version> 을 고친다.
프로퍼티로 버전을 관리하는 pom 에서 changeVersion 이 프로퍼티를 갱신하고 <version> 표기를 유지하는지, 같은 프로퍼티를 쓰는 다른 모듈이 같은 버전으로 남는지 검증한다. 리터럴 버전은 종전대로 <version> 이 바뀌는지도 함께 확인한다. 수정 전 PomObject 에서는 앞의 2건이 실패한다.
changeVersion 이 프로퍼티 값을 고치는 경로에 세 가지 결함이 있었다.
- 바꿀 버전의 원본 문자열을 기록해, 마스터 pom 의 버전이 같은 키의 프로퍼티 참조이면
<spring.version>${spring.version}</spring.version> 처럼 자기 자신을 가리키게 됐다.
실제 버전을 기록한다.
- 프로퍼티가 다른 프로퍼티를 참조하면 연쇄의 첫 키를 리터럴로 덮어써, 실제 값을 가진
프로퍼티는 옛 버전으로 남았다. Version 이 연쇄의 마지막 키를 기억하게 하고 그 키를 고친다.
- 프로퍼티를 고쳐도 dependency 의 Version 은 옛 실제 버전을 들고 있어, 같은 프로퍼티를
쓰는 dependency 를 이어서 처리하면 더 낮은 버전으로 다시 덮어썼다. changeProperty 가
실제 버전을 다시 해석하게 하고, 바꿀 버전이 현재 값보다 높을 때만 프로퍼티를 고친다.
Refs: #156
changeVersion 이 프로퍼티 값을 고치면 그 프로퍼티를 쓰는 모든 dependency 의 버전이 함께 바뀐다. 서로 다른 라이브러리가 프로퍼티 하나를 함께 쓰는 pom 에서는, 서비스 하나를 업데이트했을 뿐인데 선택하지 않은 라이브러리가 마스터 pom 과 다른 버전이나 존재하지 않는 버전으로 올라갔다. 마스터 pom 의 dependency 맵을 받는 changeVersion 을 추가하고 TableList 가 이를 쓰게 했다. 같은 프로퍼티를 쓰는 dependency 가 모두 마스터에서 바꿀 버전과 같은 버전일 때만 프로퍼티를 고치고, 마스터에 없거나 버전이 다른 dependency 가 섞여 있으면 해당 dependency 의 version 만 실제 버전으로 고친다. Refs: #156
프로퍼티로 지정된 버전의 갱신은 PomObject.changeVersion 이 담당하게 되어, 같은 목적으로 만들어졌으나 어디에서도 호출되지 않던 TableList.changeProperty(Version) 는 같은 로직의 중복으로만 남았다. 연쇄 프로퍼티의 첫 키를 고치는 옛 방식이기도 해서 남겨 두면 잘못 쓰일 수 있다. 메서드와 그것만 쓰던 import 를 제거한다. Refs: #156
|
기여해 주셔서 감사합니다. 프로퍼티로 버전을 관리하는 pom에서 모듈 버전이 갈리는 문제를 정확히 짚어 주셨고, 머지한 뒤에, 리뷰 과정에서 실제로 재현된 경계 조건들을 후속 커밋 1: 188fc9d (프로퍼티에 잘못된 값이 기록되던 세 가지 경우)1) 바꿀 버전이 같은 키의 프로퍼티 참조이면 자기 참조가 기록되던 문제
2) 프로퍼티가 다른 프로퍼티를 참조하는 연쇄에서 첫 키만 덮어쓰던 문제 <spring.version>6.2.9</spring.version>
<lib.version>${spring.version}</lib.version>
3) 캐시된 실제 버전 때문에 공유 프로퍼티가 더 낮은 버전으로 다시 덮이던 문제
이와 관련하여 테스트 5건을 추가했습니다( 후속 커밋 2: fb0e4da (서비스와 무관한 dependency의 버전까지 바뀌던 문제)프로퍼티를 고치면 그 프로퍼티를 쓰는 모든 dependency의 버전이 함께 바뀝니다.
기존의 2-인자 테스트 5건을 추가했습니다. 후속 커밋 3: 81382e5 (
|
수정 사유 Reason for modification
소스를 수정한 사유가 무엇인지 체크해 주세요. Please check the reason you modified the source. ([X] X는 대문자여야 합니다.)
수정된 소스 내용 Modified source
문제
PomObject.changeVersion()이 dependency 의<version>엘레멘트를 항상 실제 버전 문자열로 덮어씁니다.프로젝트 pom 이
<version>${spring.framework.version}</version>처럼 프로퍼티로 버전을 관리하고 있으면,TableList.InstallDependency()의 업데이트 경로에서 그 dependency 만 값이 박히고 프로퍼티는 옛 버전으로 남습니다. 같은 프로퍼티를 쓰는 나머지 모듈은 갱신되지 않아, 한 번의 업데이트로 라이브러리 모듈 버전이 서로 갈립니다.재현
프로퍼티로 spring 버전을 관리하는 pom(설치 6.2.9, master 6.2.11)에 현재 코드를 그대로 적용한 결과입니다.
업데이트 한 번에 spring-core 6.2.11 + spring-beans 6.2.9 로 갈립니다.
수정
설치된 버전이 이 pom 의
<properties>로 지정된 것이면<version>대신 프로퍼티를 고치도록 했습니다. 이미 있는changeProperty(key, value)를 그대로 사용합니다.Version.isPropertyVersion()은 이 pom 의<properties>에서 값을 찾았을 때만 true 이므로, 부모 pom 의 프로퍼티처럼 이 pom 에서 고칠 수 없는 경우에는 이 경로로 들어오지 않습니다. 버전이 리터럴이면 종전대로<version>을 고칩니다.JUnit 테스트 JUnit tests
JUnit 테스트 JUnit tests
수동 테스트 Manual testing
결함 재현 테스트 2건과 리터럴 버전 회귀 테스트 1건을
PomObjectTest에 추가했습니다. 수정 전 코드에서는 재현 테스트 2건이 실패(Tests run: 6, Failures: 2), 수정 후 6건 전부 통과합니다.저장소의 기존 테스트도 그대로 통과합니다 —
VersionTest,DependencyTest5건,PomObjectTest6건,SecureSAXBuilderTest7건.함께 확인하다 발견한 것 (이 PR 범위 밖)
TableList.changeProperty(Version)은 같은 목적으로 만들어져 있으나 현재 어디에서도 호출되지 않습니다. 이 수정으로changeVersion이 프로퍼티까지 다루게 되므로 그 메서드를 정리하는 편이 좋을지 의견 주시면 별도 PR 로 올리겠습니다.PomObject.assayDependency()는<dependencies>와 첫<dependency>사이에 공백 텍스트가 있다고 가정합니다(getContent(indexOf(lastDependency) - 1)). 줄바꿈 없이 한 줄로 쓰인 pom 에서는 파싱 자체가IndexOutOfBoundsException으로 실패합니다. 필요하다고 보시면 별도 PR 로 올리겠습니다.테스트 브라우저 Test Browser
Eclipse 플러그인(RCP) 코드라 브라우저가 관여하지 않습니다. JDK 21 · JUnit 4.7 로 테스트했습니다.
테스트 스크린샷 또는 캡처 영상 Test screenshots or captured video
UI 화면이 아닌 pom 파일 변경 결과라, 실제 pom 을 파싱해
changeVersion을 호출하고 저장한 결과를 위 "재현"·"수정 후" 블록으로 갈음합니다.참고: 같은 판정 경로의
Version.compareTo자리별 비교 수정은 #155 로 따로 올렸습니다. 두 PR 은 파일이 겹치지 않아 서로 독립적으로 적용할 수 있습니다.