O que é o modo manifesto?

VCPKG tem dois modos de operação: modo clássico e modo manifesto. Para a maioria dos usuários, recomendamos o modo de manifesto.

O modo de manifesto usa arquivos JSON declarativos para descrever metadados sobre seu projeto ou pacote. Em qualquer caso, o nome deste arquivo é vcpkg.json.

O modo de manifesto é ativado executando o comando enquanto há um arquivo de manifesto vcpkg install (vcpkg.json) no diretório de trabalho. Leia adiante para obter detalhes sobre como instalar pacotes no modo de manifesto.

O modo de manifesto também é necessário para usar recursos avançados, como controle de versão e registros personalizados.

Arquivos de manifesto nas portas

Todas as portas vcpkg devem incluir um vcpkg.json arquivo que descreva metadados sobre o pacote que instalam.

vcpkg usa os metadados no manifesto do pacote para vários fins, tais como, calcular árvores de dependência, procurar pacotes por nome ou descrição, resolver recursos, etc.

Exemplo de manifesto do pacote

{
  "name": "fmt",
  "version": "10.1.1",
  "description": "Formatting library for C++. It can be used as a safe alternative to printf or as a fast alternative to IOStreams.",
  "homepage": "https://github.com/fmtlib/fmt",
  "license": "MIT",
  "dependencies": [
    {
      "name": "vcpkg-cmake",
      "host": true
    },
    {
      "name": "vcpkg-cmake-config",
      "host": true
    }
  ]
}

Arquivos de manifesto em projetos

O principal objetivo de usar um arquivo de manifesto em seu projeto é declarar suas dependências. Ao usar um manifesto de projeto, você pode especificar restrições e substituições de versão para bloquear versões específicas de suas dependências. Esse recurso não está disponível no modo clássico.

Exemplo de manifesto do projeto

{
  "dependencies": [ "fmt", "zlib" ],
  "builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc",
  "overrides": [
    { "name": "zlib", "version": "1.2.8" }
  ]
}

Arquivo de configuração

vcpkg pode ser configurado através de um vcpkg-configuration.json arquivo para adicionar mais registros de pacotes ou sobrepor portas e locais de trigêmeos .

Exemplo de arquivo de configuração

{
  "default-registry": {
    "kind": "git",
    "baseline": "7476f0d4e77d3333fbb249657df8251c28c4faae",
    "repository": "https://github.com/microsoft/vcpkg"
  },
  "registries": [
    {
      "kind": "git",
      "repository": "https://github.com/northwindtraders/vcpkg-registry",
      "baseline": "dacf4de488094a384ca2c202b923ccc097956e0c",
      "packages": [ "beicode", "beison" ]
    }
  ],
  "overlay-ports": [
    "C:\\dev\\my_vcpkg_ports"
  ]
}

Instalando pacotes no modo de manifesto

Para instalar pacotes usando um arquivo de manifesto, use o comando sem argumentos de vcpkg install pacote. O comando deve ser executado a partir de um diretório que contém um arquivo de manifesto (vcpkg.json) ou o caminho para um arquivo de manifesto fornecido usando a --x-manifest-root=<path> opção.

Os pacotes instalados no modo manifesto não serão instalados no diretório global installed como no modo clássico. Em vez disso, cada manifesto recebe seu próprio diretório de instalação chamado vcpkg_installed; o vcpkg_installed diretório é criado no mesmo diretório que contém o arquivo de manifesto.

Ter árvores de instalação independentes por manifesto permite a separação de dependências entre diferentes projetos. Isso contorna uma limitação crucial do modo clássico, que permite apenas uma versão de cada porta a ser instalada. O modo de manifesto mantém as versões das portas separadas por projeto.

Usando recursos em manifestos de projeto

Os arquivos de manifesto podem definir conjuntos aditivos de funcionalidade, comportamento e dependências por meio do uso de "recursos".

Em seus projetos, você pode definir recursos para habilitar ou desabilitar dependências que se aplicam a partes do projeto. Por exemplo, se o projeto contiver vários componentes, convém manter dependências comuns na "dependencies" lista, mas limitar algumas outras a seus respectivos componentes.

Para habilitar recursos do seu projeto, você pode usar um dos seguintes métodos:

Exemplo: Recursos em manifestos de projeto

{
  "name": "my-game",
  "dependencies": [ "grpc" ],
  "features": {
    "client": {
      "description": "client game executable",
      "dependencies": [ "sdl2", "bullet3" ]
    }, 
    "server": {
      "description": "multiplayer server executable",
      "dependencies": [ "proxygen" ]
    }, 
    "tests": {
      "description": "development tests",
      "dependencies": [ "gtest" ]
    }
  }
} 

Para criar somente as dependências do componente "cliente", execute:

vcpkg install --x-feature=client

Próximas etapas

Aqui estão algumas tarefas para tentar a seguir: