vcpkg



vcpkg리눅스도 지원하는 c++ 전용 패키지 매니저라는 큰 의의가 있고, 편리한 점도 많다. 하지만, NuGet처럼 비주얼 스튜디오에 통합되지 않았고, 특정 버전을 지정해서 설치하기 어렵다는 몇 가지 약점도 있다. 개인적으로, 실무에서 vcpkg 쓰는 걸 주저했던 큰 이유는 ‘의존성 설명의 어려움’ 때문이었다.

예로, 파이썬은 venv로 프로젝트별 독립 환경을 구성하고, 필요한 패키지를 설치한 다음,

pip freeze > requirements.txt

위 명령으로 이 프로젝트에 필요한 의존성만 뽑아낼 수 있다.
이제 이 파일만 git에 올려두면, 빌드 pc나 동료 자리에서는

pip install -r requirements.txt

이렇게 필요한 의존성을 설치할 수 있다.

vcpkg로는 마땅한 방법을 찾지 못했다. 작년 7월에 해당 feature에 대한 요청이 올라왔는데, 마지막 댓글을 봐서는 금방 추가될 것 같진 않다.

We have Plans for this, but we need to do quite a bit of design and engineering work, so it’s unlikely to come soon.

그렇다고, 대안이 아주 없는 건 아닌데…

vcpkg integrate project

위 명령을 쓰면 현재 설치되어 있는 패키지 정보를 아래와 같이 NuGet 참조 파일로 만들어 주기는 한다.

C:\Users\hukim
> vcpkg integrate project
Created nupkg: E:\vcpkg\scripts\buildsystems\vcpkg.E.vcpkg.1.0.0.nupkg

With a project open, go to Tools->NuGet Package Manager->Package Manager Console and paste:
    Install-Package vcpkg.E.vcpkg -Source "E:\vcpkg\scripts\buildsystems"

그렇지만, 이건 특정 프로젝트의 의존성이 아니라 로컬에 설치된 모든 패키지 정보이므로, 수정하지 않으면, 프로젝트에 불필요한 패키지마저 설치할 수 있다.

그래서, vcpkg 문서에 아래와 같이 설명한다.

프로젝트 단위

활성 vcpkg 인스턴스에서 버전과 다른 라이브러리의 특정 버전을 사용해야 하는 경우 다음 단계를 따르세요.

  1. vcpkg의 새 클론을 생성합니다.
  2. 필요한 버전을 가져오도록 라이브러리의 프로필을 수정합니다.
  3. vcpkg install [library]를 실행합니다.
  4. vcpkg integrate project를 사용하여 프로젝트 단위로 해당 라이브러리를 참조하는 NuGet 패키지를 만듭니다.

결국, 패키지의 특정 버전이나 프로젝트에 필요한 패키지만 기술하려면, vcpkg를 하나 더 클론하고 기존 vcpkg의 portfile(한글 문서를 보면 ‘프로필’이라고 되어 있는데, 원문portfile이다.)을 수정해서 vcpkg integrate project 명령으로 NuGet 패키지를 뽑아내야 한다. 이게 잘되더라도 다른 위치의 pc와 공유하려면 어딘가에 NuGet 패키지도 올려둬야 한다;;

이쯤되면, ‘난 vcpkg 아니면 안 할래’ 같은 아집이 아니라면, 그리고 사용하려는 라이브러리가 NuGet 갤러리에 이미 올라가 있다면(설사 없더라도, 직접 빌드가 가능하다면 private Nuget 저장소를 운영해도 된다.), 당분간은 고민 없이 NuGet을 쓰는 게 몸과 마음이 편할 것 같다.