Oh, Al Fin Existen Package Managers Para C++?

Yo se que ya he hablado de esto demasiado en otros artículos, per después de trabajar en idiomas como Python, es muy fácil hacerse cómodo usando algo como pip para instalar todo los modulos. Necesitas Pytorch? Solomente hay que iniciar pip install torch y lo podés usar directamente después de terminar instalarlo (la mayoridad del tiempo). Sin embargo, cuando entrás al mundo de C++, ya no es tan simple.

C++ tiene varias maneras de instalar librarías y módulos, pero ninguno es tan simple como pip. Además, hay un montón de información sobre las manera "correcta" de instalarlos. Hay unos ingenieros que dicen que la manera correcta es usar git submodule add para incluir otros proyectos directamente por github o gitlab. Otros usan package managers del sistema como apt o yum (y en Windows, ahora Chocolatey), que es casi el mismo nivel de simplicidad que pip.

Pues, la verdad es que existe otro candidato: Packager Managers por C++. Ya existen varios, pero los dos más conocidos son Conan y vcpkg. Package Managers por C++ funcionan en varios sistemas y resuelven conflicts de versiones entre paquetes, y hacen actualizaciones más fácil cuando paquetes tienen versiones nuevos. Supongo que los lectores Perception ML ya saben idiomas que tiene Package Managers como pip o npm, así que no voy a hablar sobre los detalles.

Empezando Con Vckpg

En este punto, estoy seguro que estás listo aprender como usar un Package Manager, y por eso probamos a vckpgEsto es completamente mi preferencia, entonces si preferés usar Conan no hay problema, pero esta vez solo voy a introducir uno. Las preparaciones para usar vckpg son bastante fácil y lo podés ver en su pagina Getting Started.  

Es bastante simple, pero yo prefiero que todos mis proyectos tienen un ambiente Docker, y por eso te muestro como lo hago. Esto puede ser cualquier imagen de Docker hecho para C++. Podés clone vcpkg y hacerlo to mismo en tu propio proyecto en la misma manera que yo lo hice.

Aquí tenemos un ejemplo de mi Dockerfile:

Dockerfile
FROM gcc:13.2.0

# Only set this if you are working on an ARM device
ENV VCPKG_FORCE_SYSTEM_BINARIES=1

RUN apt update
RUN apt -y install git ninja-build cmake build-essential tar curl zip unzip bison libdbus-1-dev libxi-dev libxtst-dev

RUN ln -s /usr/bin/ninja /usr/bin/ninja-build

RUN git clone https://github.com/Microsoft/vcpkg.git

RUN ./vcpkg/bootstrap-vcpkg.sh

ENV PATH=/vcpkg/:${PATH} 

WORKDIR /code

Version Control con Vckpg

Cuando hacés un proyecto que usa vcpkg, hay dos maneras en que podés usarlo. El modo classico te deja instalar paquetes casi como un Package Manager de sistema. Funciona, pero no es tan bueno cuando querés usar practicas buenas de desarrollo. En lugar de eso, el modo recomiendo es modo manifesto. Para usar modo manifesto, solo necesitás añadir un manifest file como esto:

JSON
{
    "dependencies": [
      "eigen3"
    ]
}

Mi ejemplo es un manifest file super simple que solo tiene Eigen3. Sin embargo, si ves su documentación sobre manifestos, hay mucho mas información sobre cosas como añadiendo versiones, etc.

Usando CMake Juntos con Vckpg

Este parte es opcional se estás usando algo diferente para hacer el proyecto, pero vcpkg funciona bastante fácilmente con cmake. Para añadir paquetes de vcpkg solo hay que configurar el toolchain usar el archivo vcpkg.cmake que esta adentro del directorio en que instalaste vckpg. Después, podés añadir paquetes usando find_package y enlazarlos al ejecutable con target_link_libraries.

Aquí tenemos un ejemplo de eso.

CMake
cmake_minimum_required(VERSION 3.8)

set(CMAKE_TOOLCHAIN_FILE vcpkg/scripts/buildsystems/vcpkg.cmake)

project(main)

add_executable(main main.cpp)

find_package(Eigen3 3.3 REQUIRED NO_MODULE)
target_link_libraries(main PRIVATE Eigen3::Eigen)

Cheat Code

Si no tenés requisitos sobre el imagen docker que estás usando, también podés usar un imagen de C++ de Microsoft. Ya tienen vcpkg instalado y son muy simple para configurar. He añadido un Dockerfile y docker-compose.yaml como ejemplo en el repositorio para este articulo. Solo tenés que cuidar en donde el archivo toolchain está. Esto es algo que tenés que averiguar antes de iniciar cmake, por eso es fácil no?

Dockerfile
FROM mcr.microsoft.com/devcontainers/cpp:ubuntu

Source Code

Para el source code usado en este articulo, incluyendo a un archivo docker-compose.yaml para hacer el proceso de construcción más fácil, podés ver este folder en el git repo de este sitio. Ademas, hay un directorio con el ejemplo del Cheat Code también.

Conclusión

Yo creo que vckpg es bastante fácil y directo para usar y integrar con cmake. Intento usarlo en la mayoridad de mis proyectos de C++ porque creo que es una mejor manera de mantener dependencias que instalar manualmente o añadir proyectos como git submodules.

La unica desventaja que yo veo de usar vcpkg es que paquetes no están siempre mantenidos y tenía problemas tratando de instalar libtorch, que al fin no podía instalar correctamente. Pero eso es algo que puedo soportar. Si hubiera un paquete que no se puede instalar con vckpg, yo lo usaría para el resto de los paquetes y instalarlo con el paquete con el gestor de paquetes sistema o con un submodule. Aunque, espero que no es algo común.


Publicado

en

por

Etiquetas:

Comentarios

Deja un comentario

es_ARES