2009-05-31 4 views
6

저는 (곧) 여러 다른 버전 (시험판, 전문가, 기업 등)으로 분기 될 프로젝트를 연구 중입니다.하나의 코드베이스에서 여러 제품을 개발하기위한 전략

저는 Subversion이 처음 출시 된 이래로 Subversion을 사용 해왔고 (그 전에는 CVS 였기 때문에) 분기와 태그의 추상 개념에 익숙합니다. 그러나 모든 개발 경험에서 저는 트렁크 코드에 대해서만 일했습니다. 드문 경우지만 일부 다른 개발자 (저장소를 소유 한 개발자)는 특정 지사에 변경 사항을 적용 해 달라는 요청을 받았고 그 사람이 저에게 무엇을 하든지 부탁했습니다. 나는 기괴한 흑인 예술을 "합치는"것을 고려하고 있으며, 나는 단지주의 깊은 감독하에 그것을 시도했다.

하지만이 경우 저는 저장소에 대한 책임이 있습니다. 이런 종류의 것은 완전히 새로운 것입니다.

코드의 대부분은 모든 제품간에 공유되므로 코드가 항상 트렁크에 있다고 가정합니다. 각 제품의 릴리스 빌드 용 태그가있는 각 버전에 대한 지점을 갖게 될 것으로 가정합니다.

그러나 그 이상으로, 나는 많이 알지 못합니다. 그리고 그것을 망칠 수천 가지 방법이 있습니다. 가능하다면, 나는 그것을 망쳐 놓는 것을 피하고 싶습니다.

예를 들어, 프로 및 엔터프라이즈 버전의 새로운 기능을 개발하고 싶지만 데모 버전에서 해당 기능을 제외하고자합니다. 나는 그것을 어떻게 성취 할 것인가?

나의 일상적인 개발에서, 나는 또한 일하면서 개발 지점을 지점에서 지점으로 (또는 다시 트렁크로) 전환해야한다고 가정합니다. 혼란을 최소화하는 방법으로이를 수행하는 가장 좋은 방법은 무엇입니까?

다른 전략, 가이드 라인 및 팁은 무엇을 제안합니까?


UPDATE :

음, 모든 바로 그때.

분기가 올바른 전략이 아닌 것처럼 보입니다. 그래서 나는 "분기"초점을 제거하기 위해 질문의 제목을 바꾸었고 나는 그 질문을 넓히고 있습니다. 나는 내 다른 옵션 중 일부를 가정

은 다음과 같습니다 : 나는 항상 모든 기능을 소프트웨어의 전체 버전을 배포 및 선택적 라이센스의 권한에 따라 기능을 사용하거나 사용하지 않도록하려면 라이센스를 사용할 수

1) . 내가이 경로를 택했다면, 어떤 종류의 싱글 톤 "라이센스 관리자"객체를 호출하는 if/else 블록의 쥐의 둥지를 상상할 수 있습니다. 이 경우 코드 스파게티즘을 피하는 가장 좋은 방법은 무엇입니까?

2) 의존성 주입을 사용할 수 있습니다. 그러나 일반적으로, 나는 그것을 싫어한다. (왜냐하면 로직을 소스 코드에서 구성 파일로 옮겨서 프로젝트를 더 어렵게 만든다). 그리고 그때도 여전히 전체 앱을 배포하고 런타임에 기능을 선택합니다. 가능하다면 엔터프라이즈 버전 바이너리를 데모 사용자에게 배포하지 않을 것입니다.

3) 플랫폼에서 조건부 컴파일을 지원하는 경우 #IFDEF 블록을 사용하고 플래그를 빌드하여 선택적으로 기능을 포함 할 수 있습니다. 그것은 GUI 패널 전체와 같이 크고 엉뚱한 기능을 위해 잘 작동합니다. 그러나 로깅이나 통계 추적과 같이 작고 교차 변형이 큰 콘서트는 어떨까요?

4) 저는 ANT를 사용하여 빌드하고 있습니다.ANT에 대한 빌드 타임 의존성 주입과 같은 것이 있습니까?

답변

2

가장 흥미로운 질문입니다. 모든 것을 배포 한 다음 라이센스 키를 사용하여 특정 기능을 사용하거나 사용하지 않도록 설정하는 것을 좋아합니다. 코드를 검토하고 사용자가 특정 기능에 대한 라이센스가 있는지 계속 확인하는 작업이 많다는 사실에 대해 적절한 우려가 있습니다. 당신이 자바에서 일하고있는 것처럼 들리니, 내가 제안하는 것은 aspect 위버를 사용하여 빌드 타임에 라이선스 검사를위한 코드를 삽입하는 방법이다. 라이센스 검사에 대한 모든 요청이 들어갈 수있는 하나의 객체가 될 것입니다. 그러나 당신이 aspect를 사용한다면 실제로는 좋지 않습니다. 좋은 연습이라고 할 수 있습니다.

대부분 면허가있는 경우 읽을 필요가 있으며 구성 요소 수가 적어서 테이블을 항상 메모리에 보관할 수 있으며 읽는 것만으로 테이블을 읽을 수 없으므로 스레딩에 많은 문제가 있습니다.

다른 대안으로 라이센스가있는 각 구성 요소에 하나씩 많은 jar를 배포 할 수 있으며 라이센스가 부여 된 클래스 만로드 할 수 있습니다. 이를 달성하려면 클래스 로더에 묶어야합니다.

2

Subversion을 통해 이것을 수행 하시겠습니까? 서브 버전을 사용하여 다른 을 유지하기 위해 (예 : 릴리스 별 브랜치, 예 : v1.0, v2.0 등)을 사용하지만 코드베이스에서 다른 버전 (시험/프로 등)을 빌드 할 것입니다.

그런 식으로 빌드를 통해 다양한 기능을 사용하거나 사용하지 않도록 설정하면 다른 지점을 동기화하는 것에 대해 걱정할 필요가 없습니다. Subversion을 사용하여 다른 릴리스와 다른 버전을 관리하는 경우 가까운 장래에 분기/태그가 폭발적으로 증가 할 수 있습니다.

전환의 경우 체크 아웃 된 코드베이스를 유지하고 svn switch을 사용하여 다른 버전을 체크 아웃 할 수 있습니다. 각 스위치에 대해 새 체크 아웃을 수행하는 것보다 훨씬 적은 시간이 소요됩니다.

+0

중간에 장애가 발생할 수 있으므로 (예 : 버전없는 파일을 손상시키지 않은 파일이있을 때) 부분적으로 전환 된 작업 복사본을 남겨두고 '스위치'사용을 권장하지 않습니다. 각 지점마다 하나의 체크 아웃을하면 혼란이 줄어 듭니다. –

1

분기 및 결합 장바구니에서 너무 빨리 뛰어 내지 마세요. 피타입니다.

다른 개발자와 내 코드를 공유하려는 경우 Subversion 저장소를 분기하려는 유일한 이유가 있습니다. 예를 들어 기능을 함께 사용하고 아직 완료하지 않은 경우 분기를 사용하여 통신해야합니다. 그렇지 않으면, 나는 가능한 한 트렁크에 머무를 것입니다.

코드베이스가 아닌 빌드의 릴리스를 차별화하기 위해 Brian의 제안을 두 번째로 추천합니다.

관련 문제