다음을 통해 공유


버전 관리 개념

최소 버전 관리

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.