다음을 통해 공유


패키지 이름 확인

vcpkg는 네트워크에 연결하기 전에 각 패키지에 대한 책임 있는 레지스트리(또는 오버레이)를 결정합니다. 이렇게 하면 이름 확인이 외부 상태에 종속되지 않으므로 패키지 종속성 혼동 공격을 방지할 수 있습니다.

이름 확인 알고리즘 단계는 다음과 같습니다.

  • 오버레이이름이 있으면 해당 오버레이를 사용합니다. 그렇지 않으면
  • 가 있는 경우 "packages" 포트 이름과 일치하는 패턴은 해당 레지스트리를 사용합니다. 그렇지 않으면
  • 기본 레지스트리아닌 null경우 해당 레지스트리를 사용합니다. 그렇지 않으면
  • 레지스트리에 대한 포트를 해결하지 못합니다.

이름과 일치하는 패턴이 여러 "packages" 개인 경우 vcpkg는 다음과 같이 우선 순위를 지정합니다.

  1. 정확한 일치 -- boost 항목이 선택됨 boost*
  2. 가장 긴 패턴 -- boost* 이 선택됨 b*
  3. 첫 번째 일치 - 최상의 패턴을 선언하는 첫 번째 레지스트리가 선택됩니다.

예제 #1: 패키지 이름 확인

vcpkg-configuration.json

{
  "registries": [
    {
      "kind": "git",
      "repository": "https://github.com/northwindtraders/vcpkg-registry",
      "baseline": "dacf4de488094a384ca2c202b923ccc097956e0c",
      "packages": ["bei*"]
    },
    {
      "kind": "git",
      "repository": "https://github.com/vicroms/vcpkg-registry",
      "baseline": "dacf4de488094a384ca2c202b923ccc097956e0c",
      "packages": ["beicode", "bei*"]
    }
  ]
}

vcpkg.json

{
  "dependencies": [ 
    "beicode", 
    "beison",
    "fmt"
  ],
  "builtin-baseline": "7e7c62d863b1bf599c1d104b76cd8b74475844d4"
}

이 구성을 사용하면 각 패키지 이름이 다음으로 확인됩니다.

  • beicode: 레지스트리 https://github.com/vicroms/vcpkg-registry 에서(정확히 일치)beicode
  • beison: 레지스트리 https://github.com/northwindtraders/vcpkg-registry 에서(배열에서 beison"registries" 패턴 일치 및 선언됨)
  • fmt: 기본 레지스트리에서(일치 항목 없음)

여러 레지스트리가 선언 bei*되므로 vcpkg도 경고를 내보낸다.

Found the following problems in configuration (path/to/vcpkg-configuration.json):
$ (a configuration object): warning: Package "bei*" is duplicated.
    First declared in:
        location: $.registries[0].packages[0]
        registry: https://github.com/northwindtraders/vcpkg-registry
    The following redeclarations will be ignored:
        location: $.registries[1].packages[1]
        registry: https://github.com/vicroms/vcpkg-registry

예제 #2: 기본 레지스트리에 여러 패턴 할당

기본 레지스트리는 두 가지 방법으로 변경할 수 있습니다. 먼저 다음을 정의합니다."default-registry"

{
  "default-registry": {
    "kind": "git",
    "repository": "https://github.com/Microsoft/vcpkg",
    "baseline": "e79c0d2b5d72eb3063cf32a1f7de1a9cf19930f3"
  }
}

둘째, 배열의 "default-registry"null 패턴을 설정하고 사용하여 "*" 다음을 "registries" 수행합니다.

{
  "default-registry": null,
  "registries": [
    {
      "kind": "git",
      "repository": "https://github.com/Microsoft/vcpkg",
      "baseline": "e79c0d2b5d72eb3063cf32a1f7de1a9cf19930f3",
      "packages": ["*"]
    }
  ]
}

두 번째 폼의 장점은 패키지 배열에 항목을 더 추가할 수 있지만 "default-registry" 개체는 패키지 배열을 정의할 수 없다는 것입니다. 이러한 차이는 패키지가 기본 레지스트리에서 제공되는지 확인해야 하는 경우에 중요합니다.

Qt Framework 라이브러리를 제공하는 레지스트리를 살펴보겠습니다.

vcpkg-configuration.json

{
  "default-registry": {
    "kind": "git",
    "repository": "https://github.com/Microsoft/vcpkg",
    "baseline": "7e7c62d863b1bf599c1d104b76cd8b74475844d4"
  },
  "registries": [
    {
      "kind": "git",
      "repository": "https://github.com/custom-qt/custom-qt-registry",
      "baseline": "adfc4de488094a384ca2c202b923ccc097956e0c",
      "packages": ["qt*"]
    }
  ]
}

그리고 다음 프로젝트 종속성:

vcpkg.json

{
  "dependencies": [ 
    "qt5", 
    "qt-advanced-docking-system", 
    "qtkeychain" 
  ]
}

패턴은 "qt*" .의 모든 포트 이름과 일치합니다 vcpkg.json. 그러나 문제가 있습니다! 포트 qt-advanced-docking-systemqtkeychain 공식 Qt Framework 라이브러리의 일부가 아니며 vcpkg가 사용자 지정 레지스트리에서 포트를 찾을 수 없으므로 설치가 실패합니다.

이 문제는 이러한 패키지를 기본 레지스트리에 대신 할당하여 해결할 수 있습니다. 기본 레지스트리를 선언하는 방법을 변경하고 해당 배열을 추가하여 qt-advanced-docking-systemqtkeychain 이 작업을 수행합니다 "packages" .

vcpkg-configuration.json

{
  "default-registry": null,
  "registries": [
    {
      "kind": "git",
      "repository": "https://github.com/Microsoft/vcpkg",
      "baseline": "e79c0d2b5d72eb3063cf32a1f7de1a9cf19930f3",
      "packages": ["*", "qt-advanced-docking-system", "qtkeychain"]
    },
    {
      "kind": "git",
      "repository": "https://github.com/custom-qt/custom-qt-registry",
      "baseline": "adfc4de488094a384ca2c202b923ccc097956e0c",
      "packages": ["qt*"]
    }
  ]
}

정확한 일치 항목은 패턴 일치 qt-advanced-docking-system 보다 선호되며 qtkeychain 기본 레지스트리로 확인되기 때문입니다.

오버레이

오버레이는 전체 레지스트리를 만들지 않고 추가 포트 및 추가 삼중항으로 vcpkg를 확장하는 방법입니다. 오버레이는 레지스트리 조회 또는 버전 관리를 수행하기 전에 고려되며 기본 제공 삼중항 또는 포트를 대체합니다. 자세한 내용은 오버레이 설명서를 참조하세요.

오버레이 설정은 다음 순서로 평가됩니다.

  1. 명령줄에서 전달된 순서대로 오버레이합니다.
  2. 다음의 오버레이 vcpkg-configuration.json 순서대로, 다음
  3. 환경 변수에서 순서대로 VCPKG_OVERLAY_[PORTS|TRIPLETS]오버레이합니다 .