다음을 통해 공유


개념: 기능

기능

기능은 설치 시 패키지 또는 프로젝트에 선택적으로 추가할 수 있는 기능, 동작 및 종속성 집합을 나타냅니다.

기본적으로 기능은 다음 원칙을 따라야 합니다.

  • 추가 기능: 기능을 사용하도록 설정하면 다른 기능을 사용하지 않도록 설정하지 않고 패키지에서 누락된 새 기능을 제공해야 합니다.
  • 비독점: 기능을 사용하도록 설정해도 다른 기능이 설치되는 것을 방지할 수 없습니다.

기능을 사용하여 대체 기능 집합을 정의하면 안 됩니다. 예를 들어 그래픽 라이브러리는 모든 그래픽 백 엔드를 동시에 설치할 수 없으므로 기능을 사용하여 배타적인 그래픽 백 엔드 중에서 선택해서는 안 됩니다.

기능은 패키지의 종속성에 다음과 같은 영향을 미칠 수 있습니다.

  • 동일한 패키지의 다른 기능에 대한 종속성을 포함하여 새 종속성을 추가합니다.
  • 기존 종속성에서 새 기능을 사용하도록 설정합니다.

사용 가능한 기능 집합은 필드에 의해 "features" 정의됩니다.

예제 1: 여러 파일 형식

예를 들어 이미지 조작 라이브러리는 다른 라이브러리 집합에 따라 여러 다른 이미지 형식을 지원할 수 있습니다.

{
  "name": "my-image-lib",
  "version": "0.1",
  "features": {
    "png": { "description": "Support PNG files", "dependencies": ["libpng"]},
    "jpeg": { "description": "Support JPEG files", "dependencies": ["libjpeg-turbo"]},
    "tiff": { "description": "Support TIFF files", "dependencies": ["libtiff"]},
  }
}

기본 기능

기본 기능은 최상위 프로젝트가 빌드 없이 빌드를 명시적으로 요청하지 않는 경우 자동으로 활성화되는 기능 집합입니다. 기본 기능은 프로젝트의 종속성 그래프 얼마나 복잡하고 사용자 지정 가능한지에 관계없이 최소 수준의 기능을 보장하기 위한 것입니다.

참고 항목

기본 기능은 "큐레이션" 또는 "제안"을 모델링하기 위한 것이 아닙니다.

예를 들어 매우 모호한 몇 가지를 포함하여 10개 이상의 다른 보관 형식을 지원하는 라이브러리 "extract-any" 를 고려해 보세요. 모두 선택 사항이기 때문에 라이브러리를 선택하지 않으면 라이브러리가 작동하지 않습니다. 파일을 추출할 수 없습니다.

기본 기능을 사용하면 종속성 vcpkg.json 목록에 추가하기만 "extract-any" 하면 기본 기능 수준(예: 자동으로 선택 및 .tar.gz 압축 해제)을 .zip 얻을 수 있습니다.

예제 2: 작동 중인 기본 기능

사용자가 기능을 지정하지 않고 추가 "extract-any" vcpkg.json 하면 기본 기능(예: 지원 .zip.tar.gz 형식)이 자동으로 포함되어 기본 기능을 보장합니다.

{
  "name": "my-application",
  "version": "0.15.2",
  "dependencies": [
    "extract-any"
  ]
}

사용자가 기본 기능을 명시적으로 사용하지 않도록 설정하려는 경우 종속성에 추가하여 "default-features": false 이 작업을 수행할 수 있습니다.

{
  "name": "my-application",
  "version": "0.15.2",
  "dependencies": [
    {
      "name": "extract-any",
      "default-features": false
    }
  ]
}

또는 클래식 모드에서 vcpkg를 사용하는 경우 기능을 통해 core 기본 기능을 사용하지 않도록 설정할 수 있습니다. 예를 들어 vcpkg install extract-any[core] 명시적으로 제외되는 extract-any [core] 기본 기능 없이 설치합니다.

자세한 내용은 기본 기능 문서를 검사.

종속성 확인

vcpkg를 사용할 때 종속성 확인은 특히 상호 종속성이 있는 기능을 처리할 때 중요한 역할을 합니다. 이를 설명하기 위해 이미지 조작 라이브러리와 관련된 다음 시나리오를 고려합니다.

{
  "name": "my-image-lib",
  "version": "0.1",
  "features": {
    "png": { "description": "Support PNG files", "dependencies": ["libpng"]},
    "jpeg": { "description": "Support JPEG files", "dependencies": ["libjpeg-turbo"]},
    "tiff": { "description": "Support TIFF files", "dependencies": ["libtiff"]},
  }
}

여러 라이브러리가 공통 라이브러리의 다양한 기능에 종속되는 시나리오에서 vcpkg는 모든 필수 기능 및 종속성을 고려하도록 합니다. 예를 들어 기능이 필요 png 하고 library-b 해당 기능이 my-image-lib필요한 jpeg 경우 library-a 종속성 그래프 다음과 같이 표시됩니다.

{
  "name": "library-a",
  "version": "1",
  "dependencies": [{"name": "my-image-lib", "features": ["png"]}]
}
{
  "name": "library-b",
  "version": "1",
  "dependencies": [{"name": "my-image-lib", "features": ["jpeg"]}]
}
{
  "name": "project-using-a-and-b",
  "version": "1",
  "dependencies": [
    "library-a",
    "library-b"
  ]
}

이러한 종속성이 해결되면 vcpkg는 필요한 모든 기능과 종속성을 결합하여 포괄적인 설치 계획을 수립합니다. 이 예제에서 프로젝트는 둘 다 library-a 에 따라 달라지며 library-b 다음의 지원과 JPEG 지원을 my-image-lib모두 PNG 포함하는 설치 계획을 생성합니다TIFF.

libjpeg-turbo[core]
libpng[core]
library-a[core]
library-b[core]
my-image-lib[core,png,jpeg]

이 메커니즘을 통해 빌드가 my-image-lib 필요한 기능에 최적화되어 불필요한 TIFF 지원을 제외하고 지원을 PNG JPEG 제공합니다.

고급 사용

단일 리포지토리에 일부 공유 코드가 있는 클라이언트 및 서버 애플리케이션과 같은 몇 가지 별도의 빌드 가능한 구성 요소가 포함된 경우 각 조각의 개발자는 다른 조각에 필요한 비용이 많이 드는 종속성을 설치하지 않도록 할 수 있습니다.

{
  "name": "my-game",
  "dependencies": ["grpc"],
  "features": {
    "client": { "description": "Client Game Executable", "dependencies": ["sdl2", "bullet3"]},
    "server": { "description": "Multiplayer Server Executable", "dependencies": ["proxygen"]},
    "tests": { "description": "Build tests", "dependencies": ["gtest"] }
  }
}

그러면 개별 개발자가 설치할 기능을 선택할 수 있습니다.

자세한 내용은