C / C ++ 프로젝트의 종속성을 올바르게 관리하는 방법은 무엇입니까?


11

3-4 개의 다른 오픈 소스 C / C ++ 라이브러리를 사용하는 프로젝트가 있습니다.

여러 플랫폼에 대해 이러한 라이브러리를 빌드하고 내 프로젝트에서 다른 플랫폼에 대한 포함 파일 및 정적 라이브러리를 체크인했습니다.

그러나 몇 가지 문제로 어려움을 겪고 있습니다. 이러한 모든 프로젝트는 종속성 관리에 관한 것입니다. 그리고 모범 사례 조언을 찾고 있습니다.

1) 정확히 무엇을 사용해야하는지 어떻게 알 수 있습니까?

정적 라이브러리 버전을 얻을 수있는 방법이 없습니다. 결과적으로 어떤 버전의 정적 lib를 사용하고 있는지 추적해야합니다 (구축 된 커밋의 SHA 일 수 있음)?

이 라이브러리를 언제 업그레이드해야하는지 알아야 할 때 특히 중요합니다.

2) 빌드를 어떻게 재현합니까?

특정 플랫폼을위한 특정 라이브러리를 구축하는 데 어려움을 겪을 수있었습니다. 그것을 알아내는 데 시간이 걸렸습니다.

다음에 같은 라이브러리를 빌드해야 할 때 반년이 걸릴 수 있습니다 (어떤 이유로 업그레이드해야 할 때. 그러나 그때까지는 라이브러리와 빌드 환경이 무엇인지 기억하지 못할 것입니다. 오랫동안 사라질 것입니다.

3)이 라이브러리를 포크하여 소스 코드의 사본을 가져야합니까?

이것은 덜 걱정입니다. 그러나 여전히 우려 사항입니다. 빌드가 재현 가능하고 소스 코드가 필요한지 확인하는 것이 좋습니다.

답변:


5

항상 정확한 버전의 종속 라이브러리를 사용해야합니까? 버전이 약간 증가 할 때마다 API가 잘못 작성되거나 API를 손상합니까?

오픈 소스 프로젝트를 살펴보면 빌드 ( configure대부분) 스크립트가 다양한 라이브러리가 있는지 확인하고 그렇지 않은 경우 오류를 발생시킵니다. 또한 사용자가 최신 버전의 라이브러리 (이전 버전보다 더 많은 버그 / 보안 수정 사항을 제공 할 수 있음)에 연결할 수있을 정도로 유연하고 정적 또는 동적 연결을 시행하지 않습니다.

재현 가능한 빌드가 정말로 필요한 경우 정확한 버전의 컴파일러와 표준 라이브러리, 아마도 운영 체제에도주의를 기울여야합니다. 이 경우, 필요한 정확한 환경을 갖춘 빌드 머신을 갖는 것이 소스 코드 저장소에서 컴파일 된 라이브러리를 체크인하는 것보다 낫습니다.


2
정확한 버전을 사용해야한다고 생각하지 않습니다. 그러나 어느 것을 사용하고 있는지 알아야합니다. 은 OpenSSL 1.1.0b 거대한 vulnerabiity을 가지고 누군가를 발견하는 경우 예를 들어, 더 나은 내가에서 OpenSSL 1.1.0b 또는 1.1.0c 사용 여부를 알
빅터 로닌

빌드 재현성에 관해서는 아마도 제 2 차 관심사 일 것입니다.
Victor Ronin

3

정확히 무엇을 사용해야하는지 어떻게 알 수 있습니까?

포함 파일 또는 libs 파일에 아직 버전 번호가 포함되어 있지 않은 경우 텍스트 파일 "version.txt"(버전 번호 포함)를 각 lib 폴더에 직접 추가하고이를 lib 및 include 파일과 함께 VCS에 체크인하십시오. . 그러나 lib의 전체 소스 버전을 지정하는 경우 (포인트 3) 이미 버전 번호가 포함 된 소스 코드 파일이있을 가능성이 높으므로이 경우 자체적으로 유지할 필요가 없습니다.

빌드를 어떻게 재현합니까?

가능한 한 많이 자동화하십시오. 스크립트, makefile 또는 자주 사용하는 빌드 도구 파일을 사용하십시오. 이 모든 것을 소스 제어하에 두십시오. 수동 단계가 필요한 경우 세부 사항을 텍스트 파일 (예 : readme_build.txt)에 기록하고 소스 제어하에 두십시오.

이 라이브러리를 포크하여 소스 코드 사본을 가져야합니까?

소스 코드사본이 있어야 하지만 필요한 경우 에만 포크 하십시오 (예 : 긴급 버그를 우연히 발견하여 원래 작성자가 시간 제약 조건 내에서이를 수정할 수없는 경우). 또는 작성자가 사용자와 다른 컴파일러 환경을 사용하는 경우 환경에서 lib가 작동하도록 변경해야합니다. 그러나 포크에서 원래 소스 코드를 변경할 때마다 나중에 업데이트를 통합하기가 어려울 수 있습니다.

그럼에도 불구하고 사용중인 라이브러리의 원본 (포크되지 않은) 소스 코드 사본을 얻는 것이 좋습니다. 그러면 원래 관리자가 공개 웹에서 lib 소스를 해지하기로 결정하더라도 필요한 경우 나중에 lib를 포크하거나 유지할 수 있습니다.


그래서, 대답은 "수동으로":) 누군가가 말하길 바랬습니다 ... 아 ... 그 도구가 있습니다 :) 소스가있는 tar 파일을 소스 제어에 덤프합니까?
Victor Ronin

1
@VictorRonin : 아니요. 대답은 "VCS가 처리 할 수있는 모든 것을 처리하게"하고 "표준 빌드 도구를 사용하여 최대한 자동화"하는 것입니다. 귀하는 특정 버전을 선택하는 사람이며, 빌드 단계를 정의하고 환경에 대한 참조를 링크 및 포함해야하는 사람입니다. 이러한 의존성을 드러내는 표준 절차는 스크립트, makefile, 프로젝트 파일 등을 통하는 것입니다.
Doc Brown

... lib 또는 라이브러리 소스 코드를 얻는 방법은 관리자 / 공급 업체가 제공하는 방법에 따라 다릅니다. 어쩌면 타르 볼, 아마도 git hub에 직접 액세스하여 아마도 nuget 패키지 일 수도 있습니다.
Doc Brown
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.