Compartilhar via


Tutorial: Instalar uma dependência de um arquivo de manifesto

vcpkg tem dois modos de operação: modo clássico e modo de manifesto. Este artigo descreve como instalar pacotes usando o modo de manifesto, que é o fluxo de trabalho recomendado para a maioria dos usuários.

No modo de manifesto, você declara as dependências diretas do projeto em um arquivo de manifesto chamado vcpkg.json.

Os arquivos de manifesto têm seus próprios diretórios vcpkg_installed em que as dependências são instaladas, ao contrário do modo clássico, em que todos os pacotes são instalados em um diretório comum %VCPKG_ROOT%/installed. Portanto, cada projeto pode ter seu próprio manifesto e seu próprio conjunto de dependências que não entram em conflito com as dependências de outros projetos.

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

Neste tutorial, você aprenderá a:

Pré-requisitos

  • vcpkg
  • Um terminal
  • Um editor de código
  • Um compilador C++
  • (Opcional) CMake ou MSBuild

1 – Criar um projeto com um manifesto

Em uma nova pasta, crie um arquivo de origem chamado main.cxx com este conteúdo:

#include <cxxopts.hpp>
#include <fmt/format.h>
#include <range/v3/view.hpp>

namespace view = ranges::views;

int fib(int x)
{
  int a = 0, b = 1;

  for (int it : view::repeat(0) | view::take(x))
  {
    (void)it;
    int tmp = a;
    a += b;
    b = tmp;
  }

  return a;
}

int main(int argc, char **argv)
{
  cxxopts::Options options("fibo", "Print the fibonacci sequence up to a value 'n'");
  options.add_options()("n,value", "The value to print to", cxxopts::value<int>()->default_value("10"));

  auto result = options.parse(argc, argv);
  auto n = result["value"].as<int>();

  for (int x : view::iota(1) | view::take(n))
  {
    fmt::print("fib({}) = {}\n", x, fib(x));
  }
}

O código faz referência às bibliotecas de software livre: cxxopts, fmte range-v3; que estão todos disponíveis no registro público vcpkg em https://github.com/Microsoft/vcpkg.

Para declarar essas dependências, crie um arquivo chamado vcpkg.json no mesmo diretório que seu projeto:

vcpkg.json:

{
  "dependencies": [
    "cxxopts",
    "fmt",
    "range-v3"
  ]
}

Você só precisa especificar suas dependências diretas na lista de "dependencies". Quando ele é executado, o vcpkg resolve e instala as dependências transitivas necessárias.

2 – Integrar vcpkg ao seu sistema de build

Nesta etapa, mostramos como integrar o vcpkg ao CMake ou ao MSBuild, para que as dependências do projeto sejam instaladas ou restauradas automaticamente sempre que você compilar o projeto.

Se você estiver usando um sistema de compilação diferente, vá para a próxima etapa: Instalar dependências.

Para usar vcpkg em seus projetos do MSBuild, execute o seguinte comando:

vcpkg integrate install

Você só precisa executar o comando vcpkg integrate install na primeira vez que quiser habilitar a integração do MSBuild. Isso permite a integração do MSBuild para todos os seus projetos existentes e futuros. Use vcpkg integrate remove para remover a integração em todo o sistema do MSBuild.

Esse método de integração adiciona automaticamente pacotes instalados em vcpkg às seguintes propriedades do projeto: Include Directories, Link Directoriese Link Libraries. Além disso, isso cria uma ação pós-compilação que garante que todas as DLLs necessárias sejam copiadas para a pasta de saída da compilação. Isso funciona para todas as soluções e projetos usando o Visual Studio 2015 ou mais recente.

3 - Instalar dependências

Se você estiver usando o CMake ou o MSBuild e seguiu a etapa anterior, poderá pular para a próxima etapa: Criar o projeto.

Se você estiver usando um sistema de build diferente ou quiser instalar as dependências manualmente, basta executar vcpkg install no diretório que contém o arquivo de manifesto.

PS D:\projects\manifest-example> vcpkg install
Detecting compiler hash for triplet x64-windows...
The following packages will be built and installed:
    cxxopts:x64-windows -> 3.1.1
    fmt:x64-windows -> 10.0.0
    range-v3:x64-windows -> 0.12.0#1
  * vcpkg-cmake:x64-windows -> 2023-05-04
  * vcpkg-cmake-config:x64-windows -> 2022-02-06#1
Additional packages (*) will be modified to complete this operation.
Installing 1/5 vcpkg-cmake-config:x64-windows...
Installing 2/5 vcpkg-cmake:x64-windows...
Installing 3/5 cxxopts:x64-windows...
Installing 4/5 fmt:x64-windows...
Installing 5/5 range-v3:x64-windows...
Total install time: 48 s
cxxopts provides CMake targets:

    # this is heuristically generated, and may not be correct
    find_package(cxxopts CONFIG REQUIRED)
    target_link_libraries(main PRIVATE cxxopts::cxxopts)

The package fmt provides CMake targets:

    find_package(fmt CONFIG REQUIRED)
    target_link_libraries(main PRIVATE fmt::fmt)

    # Or use the header-only version
    find_package(fmt CONFIG REQUIRED)
    target_link_libraries(main PRIVATE fmt::fmt-header-only)

range-v3 provides CMake targets:

    # this is heuristically generated, and may not be correct
    find_package(range-v3 CONFIG REQUIRED)
    target_link_libraries(main PRIVATE range-v3::meta range-v3::concepts range-v3::range-v3)

Quando o comando for concluído, todos os pacotes compilados estarão presentes em um diretório vcpkg_installed. O local específico desse diretório depende do sistema de build; geralmente, dentro da pasta de saída padrão do sistema de build ou ao lado do arquivo vcpkg.json.

4 – Criar o projeto

Por padrão, o modo de manifesto está desabilitado em projetos do MSBuild.

Para habilitar manifestos em seu projeto, defina a propriedade VcpkgEnableManifest no arquivo .vcxproj:

<PropertyGroup Label="Vcpkg">
  <VcpkgEnableManifest>true</VcpkgEnableManifest>
</PropertyGroup>

Como alternativa, você pode habilitar o modo de manifesto em sua chamada do MSBuild passando msbuild /p:VcpkgEnableManifest=true como um parâmetro.

PS D:\projects\manifest-example> msbuild /p:VcpkgEnableManifest=true
MSBuild version 17.7.0-preview-23319-02+6829506b8 for .NET Framework
Build started 8/11/2023 11:29:50 AM.

Project "D:\projects\manifest-example\manifest-example.sln" on node 1 (default targets).
ValidateSolutionConfiguration:
  Building solution configuration "Debug|x64".
Project "D:\projects\manifest-example\manifest-example.sln" (1) is building "D:\projects\manifest-example\manifest-example.vcxproj" (2) on node 1 (default targets).
PrepareForBuild:
  (omitted)
InitializeBuildStatus:
  (omitted)
ComputeStdModulesCompileInputs:
  (omitted)
SetModuleDependencies:
  Creating directory "x64\Debug\manifest.ceffc6eb_MD.tlog\".
VcpkgTripletSelection:
  Using triplet "x64-windows" from "D:\projects\manifest-example\vcpkg_installed\x64-windows\x64-windows\"
  Using normalized configuration "Debug"
VcpkgInstallManifestDependencies:
  Installing vcpkg dependencies to D:\projects\manifest-example\vcpkg_installed\x64-windows\
  Creating directory "D:\projects\manifest-example\vcpkg_installed\x64-windows\".
  "D:\vcpkg\vcpkg.exe" install  --x-wait-for-lock --triplet "x64-windows" --vcpkg-root "D:\vcpkg\" "--x-manifest-root=D:\projects\manifest-example\" "--x-install-root=D:\projects\manifest-example\vcpkg_installed\x64-windows\"
  "D:\vcpkg\vcpkg.exe" install  --x-wait-for-lock --triplet "x64-windows" --vcpkg-root "D:\vcpkg\" "--x-manifest-root=D:\projects\manifest-example\" "--x-install-root=D:\projects\manifest-example\vcpkg_installed\x64-windows\"
  Detecting compiler hash for triplet x64-windows...
  The following packages will be built and installed:
      cxxopts:x64-windows -> 3.1.1
      fmt:x64-windows -> 10.0.0
      range-v3:x64-windows -> 0.12.0#1
    * vcpkg-cmake:x64-windows -> 2023-05-04
    * vcpkg-cmake-config:x64-windows -> 2022-02-06#1
  (omitted)
ClCompile:
  (omitted)
Link:
  (omitted)
AppLocalFromInstalled:
  pwsh.exe -ExecutionPolicy Bypass -noprofile -File "D:\vcpkg\scripts\buildsystems\msbuild\applocal.ps1" "D:\projects\manif
  est-mode-msbuild\x64\Debug\manifest-example.exe" "D:\projects\manifest-example\vcpkg_installed\x64-windows\x64-windows\debug\bin"
  "x64\Debug\manifest.ceffc6eb.tlog\manifest-example.write.1u.tlog" "x64\Debug\vcpkg.applocal.log"
  D:\projects\manifest-example\x64\Debug\fmtd.dll
FinalizeBuildStatus:
  (omitted)
Done Building Project "D:\projects\manifest-example\manifest-example.vcxproj" (default targets).

Done Building Project "D:\projects\manifest-example\manifest-example.sln" (default targets).

Build succeeded.

Próximas etapas

Neste guia, você instalou dependências para um projeto simples usando um arquivo de manifesto.

Aqui estão algumas tarefas adicionais para tentar a seguir:

  • Instalar pacotes para plataformas personalizadas, compiladores ou arquiteturas de compilação usando trigêmeos
  • Bloqueie suas versões usando controle de versão para builds repetíveis.
  • Reutilizar binários em execuções de integração contínua ou locais usando o cache binário
  • Gerenciar suas bibliotecas privadas usando registros personalizados