소스 제어에 타사 라이브러리 저장


83

애플리케이션이 의존하는 라이브러리를 소스 제어에 저장해야합니까? 내 한 부분은해야한다고 말하고 다른 부분은 안된다고합니다. 앱에서 몇 가지 기능에 의존하기 때문에 전체 앱을 축소하는 20MB 라이브러리를 추가하는 것은 잘못된 느낌입니다 (비록 상당히 많지만). 단지 jar / dll을 저장해야합니까, 아니면 배포 된 프로젝트의 zip / tar를 저장해야합니까?

다른 사람들은 무엇을합니까?

답변:


28

저장소에 타사 라이브러리가있을뿐만 아니라 향후 라이브러리 업데이트에서 쉽게 추적하고 병합 할 수있는 방식으로 수행하는 것이 좋습니다 (예 : 보안 수정 등). Subversion을 사용하는 경우 적절한 공급 업체 분기를 사용하는 것이 좋습니다.

제 3 자의 코드를 수정하기 전에 지옥에서 추운 날이 될 것이라는 것을 알고 있다면 (@Matt Sheppard가 말했듯이) 외부가 합리적이며 전환이 매우 쉬워진다는 추가 이점을 제공합니다. 최신 버전의 라이브러리는 보안 업데이트 또는 필수 새 기능으로 인해 바람직합니다.

또한 필요한 경우 길고 느린로드 프로세스를 저장하는 코드베이스를 업데이트 할 때 외부 항목을 건너 뛸 수 있습니다.

@Stu Thompson은 소스 제어에 문서 저장 등을 언급합니다. 더 큰 프로젝트에서는 송장 / 청구서 / 회의록 / 기술 사양 등을 포함하여 소스 제어에 전체 "클라이언트"폴더를 저장했습니다. 전체 촬영 경기. 비록, 에헴, 당신이 사용할 수있게 할 저장소와는 별개의 저장소에 이것들을 저장하는 것을 기억하십시오 : 다른 개발자들; 클라이언트; 당신의 "브라우저 소스 뷰"... 기침 ... :)


3
설치 프로그램을 통해 각 개발자 워크 스테이션에서 타사 라이브러리의 라이선스를 받아야하는 경우는 어떻습니까?
jpierson 2010

+1,하지만 git 또는 hg와 같은 분산 SC는 어떻습니까? PS : 최고의 SO 아바타 아이콘 .... 이제까지
slf

@slf이 문서에서 자식에 분기 공급 업체를 수행하는 두 가지 방법 : happygiraffe.net/blog/2008/02/07/vendor-branches-in-git
MattCan

48

10 년 후 프로젝트를 빌드하는 데 필요한 모든 것을 저장합니다.

2017 년 편집 :이 답변은 나이가 들지 않았습니다 .-). ant 또는 make와 같은 오래된 것을 여전히 사용하고 있다면 위의 내용이 여전히 적용됩니다. 종속성 관리와 함께 maven 또는 graddle (예 : .net의 Nuget)과 같은 더 현대적인 것을 사용하는 경우 버전 제어 서버와 함께 종속성 관리 서버를 실행해야합니다. 두 가지 모두에 대한 좋은 백업이 있고 종속성 관리 서버가 이전 종속성을 삭제하지 않는 한 괜찮습니다. 종속성 관리 서버의 예는 Sonatype Nexus 또는 JFrog Artifcatory 등을 참조하세요 .


18
그렇다면 Eclipse 또는 Visual Studio가 포함됩니까?
jpierson 2010

2
아니. vs에 대해 모르지만 프로젝트를 빌드하는 데 이클립스가 필요하지 않으며 올바른 JDK 만 있으면됩니다. 이것은 Hudson / Jenkins 또는 기타 CI 솔루션을 사용하여 최근에 훨씬 쉽게 시행 할 수있었습니다. 모든 프로젝트가 자동으로 ... 상관없이, 한 달에 한 번 얼마나 오래된 빌드 없습니다
토니 BenBrahim에게

1
그래서 질문이 남아 있습니다. JDK를 소스 제어 저장소에도 저장합니까? 어디에 선을 그리나요?
jpierson 2011-06-23

5
@jperson, 예전. 자동화 된 주기적 빌드를 사용하면 현재 JDK에서 테스트를 빌드 / 통과하는 한 원래 JDK가 필요하지 않습니다. 나는 '자동화 된 빌드 시스템이 여전히 매달이 프로젝트를 구축 할 수 있습니다'에 선을 그립니다
토니 BenBrahim에게

20

라이브러리를 저장하지 마십시오. 엄격히 말해서 프로젝트의 일부가 아니며 리비전 제어 시스템에서 쓸데없는 공간을 차지합니다. 그러나 프로젝트에서 사용하는 외부 라이브러리의 버전을 추적 하려면 maven (또는 ant 빌드의 경우 Ivy )을 사용하십시오. 조직 내에서 백업 된 저장소의 미러를 실행하여 항상 종속성을 제어 할 수 있도록해야합니다. 이것은 당신에게 두 세계의 장점을 제공해야합니다. 프로젝트 외부의 외부 jar이지만 여전히 안정적으로 사용 가능하고 중앙에서 액세스 할 수 있습니다.


인터넷에 연결되지 않은 곳에서 SW를 구축해야하는 드문 사용 사례의 경우이를 저장 (예 : "git clone"후 로컬에서 사용 가능)하는 것은 필요한 악입니다. 고객에게 "현장에서"SW를 구축 할 수 없기 때문에 하루가 지났다고 말하고 싶지는 않습니다.
기수

18

소스 코드를 확인하고 빌드 스크립트를 실행하여 프로젝트를 빌드 할 수 있기를 원하기 때문에 라이브러리를 소스 제어에 저장합니다. 최신 정보를 얻고 한 단계로 빌드 할 수없는 경우 나중에 문제가 발생할뿐입니다.


13

타사 바이너리를 소스 제어에 저장하지 마십시오. 소스 제어 시스템은 동시 파일 공유, 병렬 작업, 병합 작업 및 변경 내역을 지원하는 플랫폼입니다. 소스 제어는 바이너리 용 FTP 사이트가 아닙니다. 타사 어셈블리는 소스 코드가 아닙니다. SDLC 당 두 번 정도 변경됩니다. 작업 공간을 깨끗하게 정리하고 소스 제어에서 모든 것을 끌어 내고 빌드하려는 욕구가 타사 어셈블리가 소스 제어에 갇혀 있어야 함을 의미하지는 않습니다. 빌드 스크립트를 사용하여 배포 서버에서 타사 어셈블리 가져 오기를 제어 할 수 있습니다. 특정 타사 구성 요소를 사용하는 응용 프로그램의 분기 / 버전을 제어하는 ​​것이 걱정되는 경우 빌드 스크립트를 통해서도 제어 할 수 있습니다. 사람들은 Java 용 Maven을 언급했으며 .Net 용 MSBuild를 사용하여 유사한 작업을 수행 할 수 있습니다.


결코 말하지 마십시오-위의 내 의견을 참조하십시오. 더 나은 솔루션이 있으면 기뻐할 것입니다.
기수

20-30 년 전에 웹에서 더 이상 사용할 수없는 수많은 이상한 것들을 사용하여 코드를 작성한 조직이 있습니다. 오래된 소스 코드를 빌드해야한다면 쉽게 구할 수없는 것이있는 것이 가장 좋습니다. 당신의 메이븐 프로세스가 지금부터 20 년 후에 작동할지 누가 알겠습니까? 실생활에서 그 시나리오를 접했습니다.
AminM

8

나는 일반적으로 저장소에 저장하지만 크기를 줄이려는 당신의 바람에 동정합니다.

리포지토리에 저장하지 않으면 어떻게 든 아카이브 및 버전 관리가 필요하며 빌드 시스템은이를 가져 오는 방법을 알아야합니다. Java 세계의 많은 사람들이 종속성을 자동으로 가져 오기 위해 Maven을 사용하는 것처럼 보이지만 저는 사용하지 않았으므로 실제로 권장하거나 반대 할 수 없습니다.

한 가지 좋은 옵션은 타사 시스템의 별도 저장소를 유지하는 것입니다. Subversion을 사용하는 경우 Subversion의 외부 지원을 사용하여 다른 저장소에서 라이브러리를 자동으로 체크 아웃 할 수 있습니다. 그렇지 않으면 빌드 시스템이 요구 사항을 자동으로 가져올 수있는 내부 익명 FTP (또는 유사한) 서버를 유지하는 것이 좋습니다. 분명히 모든 이전 버전의 라이브러리를 유지하고 저장소와 함께 모든 라이브러리를 백업하고 싶을 것입니다.


별도의 저장소 아이디어를 좋아합니다. 원격 사용자가 소스 제어에만 액세스 할 수있는 문제를 해결합니다 (즉, 익명의 FTP 또는 타사 항목을 넣은 다른 곳에 액세스 할 수 없음). 나는 소스 제어에서 변하지 않는 거대한 바이너리를 갖는 것이 일종의 망가 졌음을 인정하지만, 이것은 적어도 그것들을 단일 저장소로 격리시킨다.
overthink

5

내가 가진 것은 모든 타사 라이브러리가 저장된 인트라넷 Maven과 같은 저장소입니다 (라이브러리뿐만 아니라 문서, Javadoc 및 모든 것이 포함 된 해당 소스 배포). 그 이유는 다음과 같습니다.

  1. 변경되는 파일을 관리하도록 특별히 설계된 시스템에 변경되지 않는 파일을 저장하는 이유는 무엇입니까?
  2. 그것은 체크 아웃을 극적으로 고정
  3. 소스 제어하에 저장된 "something.jar"를 볼 때마다 "어떤 버전입니까?"라고 묻습니다.

4

JDK와 IDE를 제외한 모든 것을 소스 제어에 넣었습니다.

Tony의 철학은 건전합니다. 데이터베이스 생성 스크립트와 데이터 구조 업데이트 스크립트를 잊지 마십시오. 위키가 나오기 전에는 문서를 소스 제어에 저장하기도했습니다.


4

내 취향은 종속성 저장소에 타사 라이브러리 (저장하는 것입니다 Artifactory메이븐 오히려 서브 버전에서 그들을 유지하는 것보다 예를 들어).

타사 라이브러리는 소스 코드처럼 관리되거나 버전이 지정되지 않기 때문에 이들을 혼합하는 것은 의미가 없습니다. 원격 개발자는 또한 많은 공용 저장소에서 더 쉽게 얻을 수있을 때 느린 WPN 링크를 통해 큰 라이브러리를 다운로드 할 필요가 없다는 점을 높이 평가합니다.


2

이전 고용주에서 우리는 소스 제어에 애플리케이션을 구축하는 데 필요한 모든 것을 저장했습니다. 새로운 빌드 머신을 가동하는 것은 소스 컨트롤과 동기화하고 필요한 소프트웨어를 설치하는 문제였습니다.


1
나에게는 "필요한 소프트웨어"와 "응용 프로그램을 구축하는 데 필요한 모든 것"사이에 약간의 회색 영역이있는 것 같습니다. 응용 프로그램을 빌드하는 데 컴파일러가 필요하지 않습니까? 또한 많은 SDK 및 타사 라이브러리를 개발자 워크 스테이션에 설치해야합니다. 일반적으로 GAC에있을 것으로 예상되는 타사 .NET 라이브러리는 어디에서 선을 그리고 어떻게 소스 제어에 저장됩니까?
jpierson 2010

1

새 개발 환경에서 코드를 체크 아웃 할 때 사용할 수 있도록 타사 라이브러리를 소스 제어에 저장합니다. 빌드 스크립트에있을 수있는 모든 "포함"또는 빌드 명령은 이러한 "로컬"복사본도 참조해야합니다.

의존하는 타사 코드 또는 라이브러리를 항상 사용할 수 있도록 보장 할뿐만 아니라 새로운 개발자가 팀에 합류 할 때 코드를 새 PC 또는 사용자 계정에 (거의) 빌드 할 준비가되었음을 의미해야합니다.


1

도서관을 보관하십시오! 저장소는 언제든지 프로젝트를 빌드하는 데 필요한 스냅 샷이어야합니다. 프로젝트에 다른 버전의 외부 라이브러리가 필요하므로 이러한 라이브러리의 최신 버전을 업데이트 / 체크 할 수 있습니다. 이렇게하면 이전 릴리스 등을 패치해야하는 경우 이전 스냅 샷과 함께 사용할 올바른 버전을 모두 얻을 수 있습니다.


1

개인적으로 내 프로젝트의 일부로 의존성 폴더가 있고 거기에 참조 된 라이브러리를 저장합니다.

여러 다른 프로젝트에서 작업 할 때 종종 동일한 버전의 라이브러리가 필요한 상호 의존적 인 부분을 사용하여 작업을 더 쉽게 할 수 있습니다. 즉, 주어진 라이브러리의 최신 버전으로 업데이트하는 것이 항상 가능하지는 않습니다.

각 프로젝트에 대해 컴파일 타임에 모든 종속성을 사용한다는 것은 일이 진행될 때까지 몇 년이 지나도 다른 부분을 망칠 염려없이 프로젝트의 모든 부분을 빌드 할 수 있음을 의미합니다. 새 버전의 라이브러리로 업그레이드하는 것은 단순히 파일을 교체하고 관련 구성 요소를 재 구축하는 경우이며 필요한 경우 관리하기가 그리 어렵지 않습니다.

그러나 내가 참조하는 대부분의 라이브러리는 비교적 작은 무게가 약 수백 kb로, 거의 크지 않기 때문에 소스 제어에 붙이는 것이 문제가되지 않습니다.


1

git 하위 프로젝트를 사용하고 타사 라이브러리의 기본 git 저장소에서 참조하거나 (없는 경우) 각 필수 라이브러리에 대해 새 git 저장소를 만듭니다. 하나의 git 저장소로 제한되는 이유는 없으며 다른 사람의 프로젝트를 자신의 디렉토리로 사용하는 것은 권장하지 않습니다.


0

프로젝트를 빌드하는 데 필요한 모든 것을 저장하면 아무것도하지 않고 확인하고 빌드 할 수 있습니다.

(그리고 고통을 경험 한 사람으로서-컨트롤을 설치하고 개발 플랫폼에서 작업하는 데 필요한 모든 사본을 보관하십시오. 한때 빌드 할 수있는 프로젝트를 얻었지만 설치 파일과 등록 키 없이는 할 수 없었습니다. 타사 컨트롤 레이아웃을 변경하지 마십시오. 재 작성이 재미있었습니다.)


0

프로젝트를 빌드하기 위해 필요한 모든 것을 저장해야합니다. 또한 코드의 다른 버전은 타사에 대해 다른 종속성을 가질 수 있습니다. 코드를 타사 종속성과 함께 유지 관리 버전으로 분기하고 싶을 것입니다.


0

개인적으로 지금까지 결과가 마음에 들었던 것은 별도의 저장소에 라이브러리를 저장 한 다음 Subversion svn : externals 기능을 사용하여 다른 저장소에 필요한 각 라이브러리에 연결하는 것입니다. 메인 소스 코드 리포지토리의 크기를 전혀 늘리지 않고도 대부분의 라이브러리 (주로 관리되는 .NET 어셈블리)의 버전이 지정된 복사본을 소스 제어에 보관할 수 있기 때문에 잘 작동합니다. 이 방식으로 리포지토리에 어셈블리를 저장하면 빌드 서버에서 빌드를 만들기 위해 어셈블리를 설치할 필요가 없습니다. Visual Studio가 설치되지 않은 상태에서 빌드를 성공적으로 수행하는 것은 꽤 힘든 일 이었지만 이제는 작업이 완료되었으므로 만족합니다.

현재 상업용 타사 제어 제품군이나 그런 종류를 많이 사용하지 않기 때문에 실제로 빌드 서버에 SDK를 설치해야하는 라이선스 문제가 발생하지 않았지만 그 위치는 알 수 있습니다. 쉽게 문제가 될 수 있습니다. 불행히도 나는 그것에 대한 해결책이 없으며 처음 만났을 때 해결할 계획입니다.

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