버전 관리에서 동일한 코드베이스에서 두 개의 개별 소프트웨어 버전 유지


45

동일한 소프트웨어 / 프로그램 / 응용 프로그램 / 스크립트의 두 가지 버전을 작성하여 버전 관리하에 저장한다고 가정 해 봅시다. 첫 번째 버전은 무료 "기본"버전이고, 두 번째 버전은 무료 버전의 코드베이스를 가져 와서 부가 가치 부가 기능으로 확장 된 유료 "프리미엄"버전입니다. 새로운 패치, 픽스 또는 기능은 두 버전 모두를 찾아야합니다.

현재 유료 버전의 측면 및 분기 와 함께 기본 코드베이스 (무료 버전)에 대한 사용 masterdevelop분기를 고려 하고 있습니다 . 무료 버전을 변경하고 지점에 병합하면 ( 물론 철저한 테스트 후 ) 추가 테스트 를 위해 명령을 통해 지점으로 복사 된 다음에 병합됩니다 .master-premiumdevelop-premiummasterdevelopdevelop-premiumcherry-pickmaster-premium

이 상황을 처리하기위한 최고의 워크 플로우입니까? 알아야 할 잠재적 인 문제,주의 사항 또는 함정이 있습니까? 내가 이미 생각 해낸 것보다 더 나은 분기 전략이 있습니까?

귀하의 의견은 대단히 감사합니다!

추신 이것은 Git에 저장된 PHP 스크립트를위한 것이지만, 모든 언어 나 VCS에 답이 적용되어야합니다.

답변:


83

공통 기반을 가진 두 개의 코드 버전을 사용하는 대신, 다른 코드 기반이 아니라 구성에 의해 이러한 프리미엄 기능을 플러그 가능하고 구동 할 수있는 방식으로 애플리케이션을 설계해야합니다.

프리미엄 버전 (구성으로 비활성화)을 기본 버전과 함께 제공하는 것을 두려워하는 경우 최종 빌드 / 패키지 단계에서 해당 코드를 제거하고 두 개의 빌드 프로파일 만 가질 수 있습니다.

이 디자인을 사용하면 5 가지 맛을 배송하고 매우 유연 해져 타사가 기여할 수도 있습니다.


2
예, 이것이 내가 자기 전에 지난 밤에 생각하기 시작했던 것입니다. 감사!
Joseph Leedy

3
최신 Windows는 이러한 방식으로 설계되었으며 모든 버전에는 동일한 코드가 있으며 사용중인 라이센스 키에 따라 잠금이 해제 된 기능이 있습니다.
Mooing Duck

39

이 목적으로 분기를 사용 하지 않는 것이 좋습니다 . 일반적으로 나중에 다시 합쳐질 (또는 나중에 브랜치 중 하나의 개발을 중단하는 릴리스 브랜치) 항목에 대해 브랜치를 고려해야합니다. 귀하의 경우 "기본"및 "프리미엄"버전을 함께 병합하지 않으며, 둘 다 무기한으로 유지되므로 브랜치는 적합하지 않습니다.

대신, 하나의 공통 버전의 소스 코드를 유지하고 조건부 컴파일 (예 : #ifdefC / C ++에서 PHP에 해당하는 것이 무엇인지 확실하지 않음)을 사용하여 "기본"과 "프리미엄"이 다른 코드 섹션을 포함하거나 제외하십시오.

PHP에는 그러한 조건부 컴파일 기능이 내장되어 있지 않을 수 있으므로 C 프리 프로세서 ( cpp아마도 이미 가지고 있음)를 사용하여 공통 소스 코드를 사전 처리하고 그로부터 "기본"및 "프리미엄"을 생성 할 수 있습니다. 전 처리기 지시문이없는 버전. 물론,이 작업을 선택 make하면 전 처리기 실행 프로세스를 자동화하기 위해 이와 비슷한 것을 사용해야합니다 .


당신이 가지에 대해 말하는 것은 완전히 의미가 있습니다! 아마도 프리미엄 코드 만 포함하는 별도의 저장소를 만들고 일종의 릴리스 스크립트 또는 하위 모듈을 사용하여 기본 코드와 결합 할 수 있습니까? 그러나 이것은 TDD를 더욱 어렵게 만들 수 있습니다.
Joseph Leedy

14
다른 리포지토리를 만드는 것은 브랜치를 만드는 것보다 훨씬 나쁩니다! 버전이 지정된 코드의 복제가 가장 적은 솔루션을 선택하려고합니다.
Greg Hewgill

2
두 번째 저장소의 요점은 전체 코드의 다른 사본이 아닌 추가 코드 만 저장 하는 것입니다.
Joseph Leedy

1
아, 그건 기본 코드가 플러그인을로드하고 실행할 수있는 "플러그인"모델과 비슷할 것입니다. 플러그인 코드는 분리되어 있으며 프리미엄 기능을 제공합니다.
Greg Hewgill

4
@Joseph : 두 코드베이스의 버전이 서로 거의 독립적 인 경우에만 두 개의 repos를 사용하는 것이 적절합니다. 그 경우가 아니라면, 난 강력하게 그렉 쓴 모든 것을 유지하는 일을하는 것이 좋습니다 것이 하나 개 의 repo. 내가 다시 생각할 유일한 것은 "C 프리 프로세서"를 사용하는 것입니다. 나는 당신이 선택한 언어로 작성된 작은 스크립트 (PHP 자체는 괜찮습니다, Perl 또는 Python이 더 좋습니다)는 프리미엄 기능이없는 코드 사본을 만드는 것이 트릭입니다.
Doc Brown

8

우리는 기본 프로젝트와 기본 프로젝트에 의존하는 프리미엄 프로젝트의 두 가지 프로젝트를 사용하고 있습니다. 브레이크를 사용하지 마십시오. 일반적으로 피처에 사용됩니다.


빌드 스크립트를 사용하여 기본 및 프리미엄 프로그램 생성을 자동화 할 수 있기 때문에이 점이 매력적입니다.
neontapir

1
일반적으로 3 개의 프로젝트가 필요합니다. 공통 파트 (보통 라이브러리로 구성됨)와 두 가지 버전의 사용자 정의 파트입니다.
Andriy Tylychko

3

대부분의 최신 답변은 브랜치 대신 조건부 컴파일을 선호하지만 브랜치 사용에 분명한 이점이있는 한 가지 시나리오가 있습니다. 버전 내역을 제외한 모든 프리미엄 기능을 제외하면 브랜치 접근 방식으로 수행 할 수 있지만 단일 브랜치 및 조건부 컴파일로는 수행 할 수 없습니다.

체리 피킹에 대해 조언하고 대신 기본 버전의 모든 변경 사항을 프리미엄 버전으로 병합 하십시오 . 기본 버전에는 포함되어 있지만 프리미엄 버전에는없는 기능이나 버그 수정이 없어야합니다. 가능한 한 고통없이 만들려면 프리미엄 브랜치가 공통 파일을 가능한 한 적게 수정해야합니다. 따라서 프리미엄 브랜치는 대부분 추가 ​​파일과 지침을 작성하기위한 약간의 수정 사항을 포함해야합니다. 이렇게하면 기본 버전의 변경 사항이 충돌없이 자동으로 병합됩니다.

Greg의 답변 은“나중에 다시 합쳐질 (또는 다시 합쳐질) 지점을 고려하십시오”라고 제안했습니다. 방금 설명한 접근법을 사용하면 모든 커밋의 최종 분기 가 (실제로 ) master-premium아닌 것을 제외 하고는이 경우 입니다.mastermaster-basic

물론 서브 모듈도 옵션입니다. 빌드 프로세스에 따라 다르지만 기본 버전을 모듈로 사용하는 프로젝트로 프리미엄 버전을 만들 수 있다면 괜찮습니다. 그러나 어느 시점에서 프리미엄 지점에서 기본 지점으로 피처를 선택하기로 결정하면 시간이 더 어려울 수 있습니다. 하위 모듈을 사용하면 이러한 변경 사항이 두 가지 커밋으로 표시되는 반면 분기를 사용하면 기본 버전에 대한 단일 커밋이되고 다음에 프리미엄 버전으로 병합하면 이러한 변경 사항이 이미 포함되어 있지 않으며 다시 병합됩니다.


0

"하드웨어"에서이 작업은 종종 수행되며, 시스템은 혼란을 제어하기 위해 판매되는 시스템입니다. 죄송합니다.

"중간 범위"세탁기가 출시되면 몇 개월 후 배송되는 "저가형"세탁기에서 동일한 코드가 변경되는 경우에도 매우 중요한 버그 수정 이외의 코드는 변경되지 않습니다.

고객들은 이미 가져온 세탁기로 업그레이드를 기대하지 않으며, 새로운 모델도 몇 달마다 배송되지 않습니다.

우리 대부분은 그 세상에 살고 있지 않으므로 세탁기 용 소프트웨어를 작성하지 않는 한 Greg의 말을 따르십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.