Compartilhar via


Visão geral do vcpkg

vcpkg é um gerenciador de pacotes C/C++ gratuito e de código aberto mantido pela Microsoft e pela comunidade C++ que roda no Windows, macOS e Linux. É uma ferramenta C++ no coração e é escrita usando scripts C++ e CMake. Ele foi projetado para resolver os pontos problemáticos exclusivos com o gerenciamento de bibliotecas C/C++.

Por que vcpkg?

  • Mais de 2300 bibliotecas de código aberto para escolher em um registro com curadoria, criado rotineiramente para verificar a compatibilidade da ABI
  • Crie seu próprio registro de biblioteca personalizado com seus próprios pacotes de biblioteca personalizados
  • Experiência consistente e multiplataforma para Windows, macOS e Linux
  • Adicione facilmente bibliotecas ao seu projeto com qualquer sistema de compilação e projeto
  • Crie dependências a partir da origem ou baixe binários pré-criados verificados pela ABI, com mais de 70 configurações disponíveis por padrão e personalização infinita para seus requisitos específicos
  • Evite conflitos de versão e problemas de diamante entre suas dependências com um design de versão exclusivo
  • Para usuários do MSBuild e do CMake: integração automática com seu ambiente de build para uma experiência de aquisição de dependência perfeita
  • Com a confiança de estudantes, desenvolvedores de código aberto, amadores e profissionais, incluindo algumas das maiores empresas

Recursos do vcpkg

Portas e trigêmeos

Um port vcpkg é uma receita de compilação versionada que produz um pacote. O tipo mais comum de pacote é uma biblioteca C/C++ que consiste em cabeçalhos, código-fonte e binários.

Um trio captura o ambiente de compilação de destino (cpu, os, compilador, runtime etc.) em um único nome conveniente. O vcpkg fornece mais de 70 trigêmeos por padrão, mas você também pode definir o seu próprio.

Para instalar um pacote em seu sistema, o vcpkg executa o arquivo de receita do port, que é um script CMake. O script pode conter etapas para baixar o código-fonte ou executar uma compilação em seu sistema. Durante as compilações, o vcpkg usa as informações em seu trio para garantir que o pacote produzido corresponda à configuração desejada.

Cache binário

Embora o vcpkg crie bibliotecas a partir do código-fonte sempre que necessário, você pode fazer backup de seus pacotes criados em um cache binário. Isso permite que outros computadores de desenvolvedor ou execuções de integração contínua façam referência a esses pacotes pré-criados sem executar uma nova compilação todas as vezes. O vcpkg determina se uma reconstrução é necessária verificando se o cache já contém um pacote existente válido com binários apropriados.

Manifestos

Você pode declarar suas dependências diretas e adicionar recursos opcionais ou restrições de versão em um arquivo de manifesto. Os arquivos de manifesto podem ser verificados em seu sistema de controle do código-fonte e compartilhados com sua equipe.

Controle de versão

vcpkg tem uma maneira única de lidar com versões de pacotes. Seu arquivo de manifesto pode fazer referência a uma única versão de linha de base definida por padrão. A linha de base oferece gerenciamento de dependências sem complicações e sem conflitos com reprodutibilidade total. Além disso, você ainda pode ter um controle mais avançado fixando versões de pacotes individuais.

Registros

Um registro é uma coleção de portas e versões disponíveis que um usuário vcpkg pode instalar. O vcpkg fornece um registro coletado de bibliotecas de código aberto por padrão. Você também pode criar seus próprios registros para personalizações, patches ou bibliotecas particulares.

Cache de ativos

O cache de ativos permite que o vcpkg funcione em ambientes isolados e offline, garantindo a continuidade dos negócios mesmo que um host remoto fique inativo ou comprometido. Ele usa espelhos de download para carregar e restaurar ativos como código-fonte e ferramentas de compilação.

vcpkg em comparação com outros gerenciadores de pacotes

vcpkg em comparação com NuGet

O NuGet é um gerenciador de pacotes .NET que geralmente é usado para desenvolvimento C/C++, especialmente para soluções MSBuild que contêm projetos .NET. Como regra geral, a equipe do Microsoft C++ não recomenda o uso do NuGet para desenvolvimento em C/C++ porque o NuGet tem várias limitações:

  • Sabores de compilação. Como o NuGet não pode criar pacotes da origem em tempo real, é necessário fornecer binários pré-criados para corresponder a todas as restrições possíveis da ABI (Interface Binária do Aplicativo) para todos os usuários. O usuário é responsável por compilar corretamente os pacotes. Também é difícil distinguir entre binários devido à falta de metadados relevantes. Isso faz com que o usuário coloque informações de arquitetura, sistema operacional e compilador no nome do pacote. Isso é indesejável porque as restrições na arquitetura, no sistema operacional e nas informações do compilador não podem ser impostas durante a aquisição do pacote.
  • Binário vs. fonte. O NuGet foi projetado desde o início para fornecer binários pré-criados relativamente pequenos. Os desenvolvedores precisam ter acesso ao código-fonte para garantir a compatibilidade, o desempenho, a integridade e a capacidade de depuração da ABI.
  • Não há suporte para NuGet PackageReference. NuGet PackageReference não tem suporte para .vcxproj arquivos e não há um plano para adicioná-lo no futuro devido a diferenças técnicas e arquitetônicas entre projetos C++ e .NET MSBuild. Isso significa que os usuários do NuGet C++ não se beneficiarão de recursos como o uso do cache global e a referência de dependências em termos simples do MSBuild com acesso à lógica condicional.
  • Rastreamento ABI transitivo. O vcpkg reconstrói dependências de código aberto afetadas por uma alteração em um pacote específico. Por exemplo, se uma nova atualização for lançada para o Boost, o vcpkg reconstruirá todas as dependências do Boost e as bibliotecas que dependem do Boost, para garantir que ainda funcionem. As solicitações de pull para atualizar bibliotecas no repositório vcpkg não são mescladas até que os conflitos de tempo de compilação sejam resolvidos.

vcpkg em comparação com gerenciadores de pacotes do sistema

Há uma grande variedade de gerenciadores de pacotes de sistema para Linux, macOS e Windows que podem ser usados para adquirir e gerenciar bibliotecas C/C++. Esses gerenciadores de pacotes geralmente são excelentes opções para gerenciar aplicativos. Mas, devido à natureza genérica de seu suporte, eles geralmente não conseguem fornecer recursos benéficos, especialmente para desenvolvedores de C/C++. Embora sua milhagem varie e alguns gerenciadores de pacotes do sistema ofereçam alguns desses recursos, nenhum tem todos os seguintes:

  • Ativos de desenvolvedor redistribuíveis: o vcpkg pode adquirir ativos de desenvolvedor redistribuíveis para ajudar na depuração.
  • Pacotes pré-construídos vs. build a partir do código-fonte: o vcpkg pode criar pacotes a partir do código-fonte com base em seus requisitos personalizados. Não há necessidade de lidar com pacotes pré-compilados e pré-compilados para fazê-los funcionar.
  • Controle de versão em todo o catálogo: vcpkg permite que você dependa de um conjunto de versões de pacotes compatíveis, em vez de ter que microgerenciar versões de pacotes individuais. Você ainda pode fazer isso conforme necessário, mas a experiência padrão foi projetada para ser fácil de começar.
  • Várias cópias da mesma biblioteca em um sistema: Você pode ter várias cópias da mesma dependência instaladas no mesmo sistema com vcpkg, enquanto os gerenciadores de pacotes do sistema podem instalar uma versão em um único local em todo o sistema. Isso complica as coisas quando você tem vários projetos, dependendo de diferentes versões de uma biblioteca.
  • Tamanho do catálogo: Como o vcpkg é especializado em C/C++, ele tem uma coleção de bibliotecas C/C++ muito grande em comparação com os gerenciadores de pacotes do sistema e é mantido ativamente. Em geral, é mais provável que você encontre bibliotecas úteis e atualizadas para desenvolvimento em C++.
  • Suporte multiplataforma: os gerenciadores de pacotes do sistema fornecem pacotes bloqueados para um sistema específico. Se você precisar direcionar mais de um tipo de sistema operacional, precisará encontrar um gerenciador de pacotes diferente para o segundo sistema. Em contraste, vcpkg é um gerenciador de pacotes multiplataforma. Portanto, você simplesmente precisa ajustar suas compilações de destino de acordo.

Há situações em que um gerenciador de pacotes do sistema faz todo o sentido:

  • Os gerenciadores de pacotes do sistema tendem a fazer um bom trabalho fornecendo e mantendo bibliotecas específicas para esse sistema
  • Os pacotes pré-criados devem funcionar imediatamente nesse sistema se o projeto de consumo tiver uma configuração de build simples.
  • Se você não pretende fazer nenhum desenvolvimento multiplataforma, não terá problemas de compatibilidade do sistema operacional com um gerenciador de pacotes do sistema.

O vcpkg foi projetado para funcionar lado a lado com os gerenciadores de pacotes do sistema, portanto, sinta-se à vontade para usar a ferramenta que fizer mais sentido para você para cada dependência.

Comece a usar o vcpkg

Para experimentar o vcpkg, confira nossos tutoriais introdutórios:

Se o sistema de build não for CMake ou MSBuild, o vcpkg também dará suporte à integração manual com seu ambiente preferido.