software - ¿Hay algún esfuerzo para crear un gestor de paquetes para C++?
que es package manager (9)
Una de mis mayores frustraciones con mi lenguaje favorito es el esfuerzo que se necesita para que diferentes bibliotecas trabajen juntas en un entorno de desarrollo unificado. Mi mayor deseo es simplemente poder decirle a mi IDE, o lo que sea, que necesito una biblioteca determinada, y se encarga de descargarla, compilarla (si es necesario), instalarla y luego configurar las rutas de inclusión y biblioteca.
Lo que quiero es this , pero para C ++. Preferiría si funciona con Visual Studio, pero gcc también está bien. O si es su propio sistema separado, eso también está bien. Sin embargo, tiene que funcionar en Windows.
¿Qué proyectos prometedores existen para resolver este problema?
¿Has considerado a Git como gestor de paquetes? He estado usando los submódulos de git para dependencias y subdependencias y, combinado con los servicios gratuitos de alojamiento de git, la idea es bastante poderosa.
Solo entra en tu proyecto git,
git submodule add git://somehosting.com/you/package.git
git submodule init package
git submodule update package
cd package && ./configure --stuff && make && cd ..
Para seleccionar versiones particulares de dependencia,
cd package && git checkout v3.2 && cd .. && git add package/
git commit -am "package version 3.2 pinned" && git push
Ahora ha fijado la dependencia de su paquete en una etiqueta en particular y ha guardado su configuración en el repositorio de su proyecto. La próxima vez que alguien haga:
git pull && git submodule update
Su dependencia del paquete también se anclará a v3.2.
Algunos sistemas de administración de paquetes también cuentan con paquetes firmados. Git le permite a GPG firmar sus etiquetas y permite que las personas lo verifiquen agregando su clave pública a su conjunto de claves.
Así que tenemos la descarga de paquetes, versiones de dependencia y podemos emular la "firma de paquetes". Una parte faltante son los binarios pre-construidos que, en mi opinión, no son una necesidad absoluta. Otra parte que falta es la gestión global de paquetes. Deberá administrar manualmente cada repositorio git cuando se actualice la dependencia de una dependencia.
A partir de NuGet 2.5, NuGet admite proyectos nativos . Sin embargo, hacer el paquete a mano es bastante complejo, por lo que sugieren el uso de Powershell Tools de CoApp para NuGet ( documentación aquí ). Con estas herramientas, ahora puede alojar sus paquetes de C / C ++ en NuGet.
Es poco probable que esto ocurra simplemente porque las diferentes bibliotecas de C ++ a menudo usan sistemas de compilación VASTLY diferentes. Autoconf, scons, make, MSBuild, VCBuild, Boost Jam, CMake, NMake y QMake son ejemplos. Además, muchos desarrolladores de C y C ++ generan código con herramientas como Yacc y Bison.
Maven y NuGet funcionan como lo hacen porque apoyan los ecosistemas con (relativamente) poca variación en las herramientas de construcción. Ant en el caso de Maven, MSBuild en el caso de NuGet. Construir un sistema similar para trabajar con la amplia gama de sistemas de compilación C ++ en uso sería inviable y poco práctico (dada la aparente falta de demanda de tales sistemas).
Hay CoApp , que parece tener soporte de Microsoft.
Hay una propuesta de módulo de Daveed , que no se convirtió en C ++ 0x.
He estado trabajando en un gestor de paquetes distribuido multiplataforma y arquitectura cruzada . Todos los paquetes se instalan en el directorio del proyecto (un poco como el funcionamiento de nodejs). Es un trabajo en progreso.
La respuesta es usar Conda para la gestión de empaquetamiento / dependencia y cualquier herramienta que desee para la construcción (yo uso CMake).
Échale un vistazo aquí:
Conda es similar a los gestores de paquetes como apt-get, yum, nuget, etc., pero con varias ventajas importantes:
1) totalmente multiplataforma (actualmente Linux, Windows y OSX, pero otras plataformas se pueden agregar fácilmente)
2) NO requiere acceso root para su uso. De hecho, no le importan los paquetes de su sistema. Es similar a construir una pila completa (hasta libc si lo desea) en su homedir, excepto que alguien ya los construyó para usted. Esta magia se consigue haciendo que los paquetes sean reubicables .
3) puede mantener tantos entornos diferentes como quiera uno al lado del otro. ¿Una de sus aplicaciones requiere Python 2.7.6, pero otra necesita Python 2.7.4? No hay problema - pueden convivir en paz.
4) nunca más se verá obligado a mantener compilaciones separadas para las distintas distribuciones de Linux. Un entorno Conda bien construido funcionará en cualquiera de ellos. ¡No olvide otras plataformas también (por ejemplo, Windows y OSX)!
5) ya no está casado con versiones de bibliotecas que un sistema o un departamento de TI decidieron PARA USTED. Por ejemplo, me vi obligado a trabajar en los nodos RHEL5. El Python es una broma (más de 10 años ahora). Al usar Conda, evité ese dolor y pude trabajar en cualquier versión de Python que quisiera sin afectar a nadie.
6) los entornos se pueden comprimir en "instaladores" para su distribución.
7) puede mantener su propio repositorio privado detrás de su firewall para bibliotecas propietarias. El repositorio centralizado público se llama Binstar. Sus dependencias pueden venir de cualquiera (o ambos).
Mucha gente cree erróneamente que Conda es un sistema solo para Python, pero en realidad Conda fue creado para el empaquetado nativo (es un lenguaje independiente). Tiene una gran presencia en Python simplemente porque su motivación original era superar el terrible soporte de la biblioteca nativa en el otro sistema de empaquetado de Python (pip + pypi).
El único problema con Conda actualmente es que Binstar (el repositorio central) aún no tiene todos los paquetes. Definitivamente, encontrará las bibliotecas faltantes que desea, pero eso es fácil de solucionar: puede crear el paquete que desee y enviarlo a Binstar. He tenido que hacer esto por docenas de bibliotecas nativas. Funciona bastante bien.
Nunca volveré a los administradores de dependencias del sistema al desarrollar código C ++.
Si está utilizando MinGW, ya existe un administrador de paquetes similar a apt-get / aptitude que hace lo que quiere: mingw-get
Se comporta de manera similar a apt-get / aptitude de Debian. Entre los paquetes que ya están incluidos puedes encontrar expat, libxml2, zlib, pthread, etc.
Obviamente, necesitará una copia de MinGW para comenzar a trabajar con ella.
ryppl parece estar haciendo lo que necesitas y más, multiplataforma:
Nuestra misión [es] crear las condiciones para un ecosistema de software C ++ modular y portátil.
Ya los protagonizó GitHub: https://github.com/ryppl/ryppl