버전 관리 개념
최소 버전 관리
vcpkg는 Go에서 사용하는 버전 관리에서 영감을 얻은 최소한의 선택 방법을 사용하지만 몇 가지 방법으로 수정합니다.
- 항상 새 설치에서 시작하여 업그레이드/다운그레이드 작업이 필요하지 않습니다.
- 기준을 도입하여 제한되지 않은 종속성을 허용합니다.
그러나 최소 선택 원칙은 동일하게 유지됩니다. 제약 조건 집합이 제공되면 vcpkg는 모든 제약 조건을 충족할 수 있는 "가장 오래된" 가능한 패키지 버전을 사용합니다.
최소 버전 접근 방식을 사용하면 다음과 같은 이점이 있습니다.
- 예측 가능하고 이해하기 쉽습니다.
- 업그레이드가 발생하는 경우 사용자 컨트롤은 새 버전이 릴리스될 때 업그레이드가 자동으로 수행되지 않습니다.
- SAT 솔버를 사용하지 않습니다.
예제를 제공하려면 다음 패키지 그래프를 고려합니다.
(A 1.0) -> (B 1.0)
(A 1.1) -> (B 1.0)
-> (C 3.0)
(A 1.2) -> (B 2.0)
-> (C 3.0)
(C 2.0)
그리고 다음 매니페스트:
{
"name": "example",
"version": "1.0.0",
"dependencies": [
{ "name": "A", "version>=": "1.1" },
{ "name": "C", "version>=": "2.0" }
],
"builtin-baseline": "<some git commit with A's baseline at 1.0>"
}
전이적 종속성을 고려한 후에는 다음과 같은 제약 조건 집합이 있습니다.
- A >= 1.1
- B >= 1.0
- C >= 3.0
- C >= 2.0
vcpkg는 모든 제약 조건을 충족해야 하므로 설치된 패키지 집합은 다음과 같습니다.
A 1.1
는 존재하는 경우에도A 1.2
vcpkg가 가능한 최소 버전을 선택하는 것보다1.1
높은 제약 조건이 없습니다.B 1.0
에서 전이적으로 필요합니다A 1.1
.C 3.0
버전 제약 조건을 충족하기 위해 추가된 전이적 제약 조건에 의해B 1.0
업그레이드됩니다.
제약 조건 확인
버전이 지정된 종속성 집합이 있는 매니페스트가 제공되면 vcpkg는 모든 제약 조건을 충족하는 패키지 설치 계획을 계산하려고 시도합니다.
버전 제약 조건은 다음과 같은 버전으로 제공됩니다.
- 선언된 제약 조건: .를 사용하여
version>=
최상위 매니페스트에서 명시적으로 선언된 제약 조건입니다. - 기준 제약 조건: .에 의해 암시적으로 추가된
builtin-baseline
제약 조건 - 전이적 제약 조건: 종속성의 종속성에 의해 간접적으로 추가된 제약 조건입니다.
- 재정의된 제약 조건: 선언을 사용하여
overrides
최상위 매니페스트에서 제약 조건이 재정의됩니다.
설치 계획을 계산하기 위해 vcpkg는 대략 다음 단계를 수행합니다.
- 계획에 모든 최상위 제약 조건을 추가합니다.
- 계획에 전이적 제약 조건을 재귀적으로 추가합니다.
- 새 패키지가 계획에 추가 될 때마다 계획에 해당 기준 제약 조건도 추가합니다.
- 제약 조건이 추가 될 때마다:
- 패키지에 대한 재정의가 있는 경우
- 재정의에서 버전을 선택합니다.
- 그렇지 않으면:
- 이전 버전이 선택되지 않은 경우
- 제약 조건을 충족하는 최소 버전을 선택합니다.
- 이전 버전이 선택된 경우:
- 새 제약 조건의 버전 관리 체계가 이전에 선택한 버전의 버전과 일치하지 않는 경우:
- 버전 충돌을 추가합니다.
- 제약 조건의 버전이 이전에 선택한 버전과 비교할 수 없는 경우 예를 들어 "version-string: apple"을 "version-string: orange"에 비교합니다.
- 버전 충돌을 추가합니다.
- 제약 조건 버전이 이전에 선택한 버전보다 높은 경우:
- 가장 높은 버전을 선택합니다.
- 그렇지 않으면:
- 이전 선택을 유지합니다.
- 새 제약 조건의 버전 관리 체계가 이전에 선택한 버전의 버전과 일치하지 않는 경우:
- 이전 버전이 선택되지 않은 경우
- 계획을 검토합니다.
- 충돌이 없는 경우
- 선택한 패키지 설치
- 그렇지 않으면:
- 사용자에게 충돌 보고
- 충돌이 없는 경우
포트 버전 획득
패키지 버전의 개념은 항상 vcpkg에 있었지만 버전 제약 조건의 개념은 존재하지 않았습니다.
버전 관리 제약 조건이 도입되면서 패키지가 로컬에서 사용할 수 있는 포트 버전과 일치하지 않는 포트 버전에 따라 달라질 수 있습니다. 이렇게 하면 vcpkg가 요청된 버전에 대한 포트 파일을 획득하는 방법을 알아야 하기 때문에 문제가 발생합니다.
이 문제를 해결하기 위해 새로운 메타데이터 파일 집합이 도입되었습니다. 이러한 파일은 vcpkg 리포지토리의 루트 수준에 있는 디렉터리에 있습니다 versions/
.
디렉터리에는 versions/
레지스트리에서 사용할 수 있는 각 포트에 대한 JSON 파일이 포함됩니다. 각 파일은 패키지에 사용할 수 있는 모든 버전을 나열하고 vcpkg가 해당 버전의 포트파일을 얻기 위해 검사 수 있는 Git 트리 틱 개체를 포함합니다.
예: zlib.json
{
"versions": [
{
"git-tree": "2dfc991c739ab9f2605c2ad91a58a7982eb15687",
"version-string": "1.2.11",
"port-version": 9
},
...
{
"git-tree": "a516e5ee220c8250f21821077d0e3dd517f02631",
"version-string": "1.2.10",
"port-version": 0
},
{
"git-tree": "3309ec82cd96d752ff890c441cb20ef49b52bf94",
"version-string": "1.2.8",
"port-version": 0
}
]
}
각 포트에 대해 해당 버전 파일이 에 versions/{first letter of port name}-/{port name}.json
있어야 합니다. 예를 들어 zlib의 버전 파일은 .에 있습니다 versions/z-/zlib.json
. 포트 버전 파일 외에도 현재 기준 파일은 .에 있습니다 versions/baseline.json
.
vcpkg