영어로 읽기

다음을 통해 공유


vcpkg 개요

vcpkg는 Windows, macOS 및 Linux에서 실행되는 Microsoft 및 C++ 커뮤니티에서 유지 관리하는 무료 오픈 소스 C/C++ 패키지 관리자입니다. C++ 도구이며 C++ 및 CMake 스크립트를 사용하여 작성되었습니다. C/C++ 라이브러리를 관리하여 고유한 문제를 해결하도록 설계되었습니다.

vcpkg인 이유는 무엇인가요?

vcpkg 기능

포트 및 삼중항

vcpkg 포트 는 패키지를 생성하는 버전이 지정된 빌드 레시피입니다. 가장 일반적인 패키지 유형은 헤더, 소스 코드 및 이진 파일로 구성된 C/C++ 라이브러리입니다.

트리플렛대상 빌드 환경(cpu, os, 컴파일러, 런타임 등)을 편리한 단일 이름으로 캡처합니다. vcpkg는 기본적으로 70개 이상의 트리플렛을 제공하지만 직접 정의할 수도 있습니다.

시스템에 패키지를 설치하기 위해 vcpkg는 CMake 스크립트인 포트의 레시피 파일을 실행합니다. 스크립트에는 소스 코드를 다운로드하거나 시스템에서 빌드를 실행하는 단계가 포함될 수 있습니다. 빌드하는 동안 vcpkg는 세 쌍둥이의 정보를 사용하여 생성된 패키지가 원하는 구성과 일치하는지 확인합니다.

이진 캐싱

vcpkg는 필요할 때마다 원본에서 라이브러리를 빌드하는 동안 이진 캐시빌드된 패키지를 백업할 수 있습니다. 이렇게 하면 다른 개발자 컴퓨터 또는 연속 통합 실행 시 매번 새 빌드를 실행하지 않고 이러한 미리 빌드된 패키지를 참조할 수 있습니다. vcpkg는 캐시에 적절한 이진 파일이 있는 유효한 기존 패키지가 이미 포함되어 있는지 확인하여 다시 빌드가 필요한지 확인합니다.

매니페스트

직접 종속성을 선언하고 매니페스트 파일에 선택적 기능 또는 버전 제약 조건을 추가할 수 있습니다. 매니페스트 파일을 소스 제어 시스템에 체크 인하고 팀과 공유할 수 있습니다.

버전 관리

vcpkg에는 패키지 버전을 처리하는 고유한 방법이 있습니다. 매니페스트 파일은 기본적으로 설정된 단일 기준 버전을 참조할 수 있습니다. 기준은 완전한 재현성을 갖춘 번거로움 없는 충돌 없는 종속성 관리를 제공합니다. 또한 개별 패키지 버전을 고정하여 고급 제어를 계속 수행할 수 있습니다.

레지스트리

레지스트리는 vcpkg 사용자가 설치할 수 있는 포트 및 사용 가능한 버전의 컬렉션입니다. vcpkg는 기본적으로 오픈 소스 라이브러리의 큐레이팅된 레지스트리를 제공합니다. 사용자 지정, 패치 또는 프라이빗 라이브러리에 대한 사용자 고유의 레지스트리를 만들 수도 있습니다.

자산 캐싱

자산 캐싱을 사용하면 vcpkg가 에어 갭 및 오프라인 환경에서 작동하여 원격 호스트가 다운되거나 손상된 경우에도 비즈니스 연속성을 보장할 수 있습니다. 다운로드 미러를 사용하여 소스 코드 및 빌드 도구와 같은 자산을 업로드하고 복원합니다.

다른 패키지 관리자에 비해 vcpkg

NuGet과 비교한 vcpkg

NuGet은 C/C++ 개발, 특히 .NET 프로젝트를 포함하는 MSBuild 솔루션에 자주 사용되는 .NET 패키지 관리자입니다. 일반적으로 Microsoft C++ 팀은 NuGet에 몇 가지 제한 사항이 있으므로 C/C++ 개발에 NuGet을 사용하지 않는 것이 좋습니다.

  • 컴파일 버전입니다. NuGet은 즉시 원본에서 패키지를 빌드할 수 없으므로 모든 사용자에 대해 가능한 모든 ABI(애플리케이션 이진 인터페이스) 제한과 일치하도록 미리 빌드된 이진 파일을 제공해야 합니다. 사용자는 패키지를 올바르게 빌드할 책임이 있습니다. 관련 메타데이터가 없기 때문에 이진 파일을 구분하기가 어렵습니다. 이로 인해 사용자는 패키지 이름에 아키텍처, 운영 체제 및 컴파일러 정보를 배치합니다. 패키지 구입 중에는 아키텍처, OS 및 컴파일러 정보에 대한 제약 조건을 적용할 수 없으므로 바람직하지 않습니다.
  • 이진 및 원본입니다. NuGet은 비교적 작고 미리 빌드된 이진 파일을 제공하기 위해 처음부터 설계되었습니다. 개발자는 ABI 호환성, 성능, 무결성 및 디버깅 가능성을 보장하기 위해 소스 코드에 액세스할 수 있어야 합니다.
  • NuGet PackageReference가 지원되지 않습니다. NuGet PackageReference는 파일에 대해 .vcxproj 지원되지 않으며 C++와 .NET MSBuild 프로젝트 간의 기술 및 아키텍처 차이로 인해 나중에 추가할 계획이 없습니다. 즉, NuGet C++ 사용자는 전역 캐시를 사용하고 조건부 논리에 액세스할 수 있는 간단한 MSBuild 용어로 종속성을 참조하는 기능의 이점을 얻지 못합니다.
  • 전이적 ABI 추적. vcpkg는 특정 패키지의 변경으로 인해 영향을 받는 오픈 소스 종속성을 다시 빌드합니다. 예를 들어 Boost에 대한 새 업데이트가 릴리스된 경우 vcpkg는 Boost의 모든 종속성과 Boost에 종속된 라이브러리를 다시 빌드하여 계속 작동하도록 합니다. vcpkg 리포지토리에서 라이브러리를 업데이트하기 위한 끌어오기 요청은 빌드 시간 충돌이 해결될 때까지 병합되지 않습니다.

시스템 패키지 관리자에 비해 vcpkg

C/C++ 라이브러리를 획득하고 관리하는 데 사용할 수 있는 Linux, macOS 및 Windows용 시스템 패키지 관리자는 다양합니다. 이러한 패키지 관리자는 일반적으로 애플리케이션을 관리하기 위한 훌륭한 선택입니다. 그러나 지원의 일반적인 특성으로 인해 C/C++ 개발자에게 특히 유익한 기능을 제공하지 못하는 경우가 많습니다. 마일리지는 다양하며 일부 시스템 패키지 관리자는 이러한 기능 중 일부를 제공하지만 다음을 모두 제공하지는 않습니다.

  • 재배포 가능 개발자 자산: vcpkg는 디버깅에 도움이 되는 재배포 가능 개발자 자산을 획득할 수 있습니다.
  • 미리 빌드된 패키지와 원본의 빌드: vcpkg는 사용자 지정 요구 사항에 따라 원본에서 패키지를 빌드할 수 있습니다. 미리 빌드된 미리 컴파일된 패키지를 처리하여 작동하도록 할 필요가 없습니다.
  • 카탈로그 전체 버전 관리: vcpkg를 사용하면 개별 패키지 버전을 마이크로 관리하지 않고도 호환되는 패키지의 버전 집합에 의존할 수 있습니다. 필요에 따라 계속 수행할 수 있지만 기본 환경은 시작하기 쉽도록 설계되었습니다.
  • 한 시스템에 동일한 라이브러리의 여러 복사본: vcpkg를 사용하여 동일한 시스템에 동일한 종속성의 여러 복사본을 설치할 수 있는 반면, 시스템 패키지 관리자는 하나의 버전을 시스템 전체의 단일 위치에 설치할 수 있습니다. 이렇게 하면 여러 버전의 라이브러리에 따라 여러 프로젝트가 있을 때 작업이 복잡해질 수 있습니다.
  • 카탈로그 크기: vcpkg는 C/C++용으로 특수화되므로 시스템 패키지 관리자에 비해 매우 큰 C/C++ 라이브러리 컬렉션이 있으며 적극적으로 유지 관리됩니다. 일반적으로 C++ 개발에 유용하고 최신 라이브러리를 찾을 가능성이 높습니다.
  • 플랫폼 간 지원: 시스템 패키지 관리자는 특정 시스템에 잠긴 패키지를 제공합니다. 둘 이상의 운영 체제 버전을 대상으로 지정해야 하는 경우 두 번째 시스템에 대한 다른 패키지 관리자를 찾아야 합니다. 반면 vcpkg는 플랫폼 간 패키지 관리자입니다. 따라서 대상 빌드를 적절하게 조정하기만 하면 됩니다.

시스템 패키지 관리자가 절대적으로 적합한 경우가 있습니다.

  • 시스템 패키지 관리자는 해당 시스템과 관련된 라이브러리를 제공하고 유지 관리하는 데 좋은 작업을 수행하는 경향이 있습니다.
  • 사용 중인 프로젝트에 간단한 빌드 구성이 있는 경우 미리 빌드된 패키지가 해당 시스템에서 기본으로 작동해야 합니다.
  • 플랫폼 간 개발을 수행하지 않으려는 경우 시스템 패키지 관리자와 운영 체제 호환성 문제가 발생하지 않습니다.

vcpkg는 시스템 패키지 관리자와 함께 작동하도록 설계되었기 때문에 각 종속성에 가장 적합한 도구를 자유롭게 사용할 수 있습니다.

vcpkg 시작

vcpkg를 사용해 보려면 소개 자습서를 확인하세요.

빌드 시스템이 CMake 또는 MSBuild가 아닌 경우 vcpkg는 기본 설정 환경과의 수동 통합도 지원합니다.