Cuando pienso en los pros y los contras de una carpeta de biblioteca estática y un administrador de paquetes, siento que la carpeta de la biblioteca es un mejor enfoque.
Pros que veo con una carpeta de biblioteca:
- No necesita una herramienta externa para administrar paquetes.
- No se requiere conexión a Internet para construir.
- Construcción más rápida (sin verificación de paquete).
- Entorno más simple (se requiere menos conocimiento).
Pros que veo con un administrador de paquetes:
- Ayuda con los árboles de dependencia complejos (y eso se puede gestionar descargando una dependencia junto con todas sus dependencias).
- Ayuda a verificar si hay una nueva versión disponible.
Parece que la industria ha decidido seguir el camino del administrador de paquetes para casi todo lo construido hoy. Entonces, ¿qué me estoy perdiendo?
packages
dependency-management
package-managers
Ignacio Soler García
fuente
fuente
Respuestas:
Un punto importante que falta en las otras respuestas:
Usar un administrador de paquetes significa tener una configuración que indica qué versiones de biblioteca está utilizando y se asegura de que la información de configuración sea realmente correcta.
Saber qué bibliotecas usa y qué versión es muy importante si usted:
Además, cuando realmente actualiza, el administrador de paquetes (generalmente) se asegura de que las dependencias transitivas se actualicen según sea necesario.
Mientras que con una
lib
carpeta, solo tiene un montón de archivos (posiblemente binarios y posiblemente modificados), y tendrá que adivinar de dónde provienen y qué versión son (o confiar en algunos README, que pueden ser correctos o no) )Para abordar sus otros puntos:
Es cierto, pero a) como desarrollador de software, necesita instalar muchas herramientas de todos modos, por lo que una más no suele importar, yb) generalmente solo hay uno o unos pocos administradores de paquetes en un campo determinado (Maven / Gradle para Java, npm para JS / TypeScript, etc.), por lo que no es como si necesitaras instalar docenas de ellos.
Todos los administradores de paquetes que conozco trabajan fuera de línea, una vez que han descargado las dependencias requeridas (lo que puede suceder inmediatamente después de descargar el proyecto en sí).
Probablemente sea cierto, pero parece poco probable que la verificación del paquete fuera de línea tome una cantidad de tiempo significativa (solo compara algunos números de versión). Una verificación en línea puede llevar un tiempo, pero se puede desactivar si se desea (si está activada de manera predeterminada; Maven, por ejemplo, nunca busca actualizaciones para las versiones de lanzamiento).
Es cierto, pero como se explicó anteriormente, una
lib
carpeta también requiere conocimiento. Además, como se explicó anteriormente, probablemente solo trabaje con un puñado de administradores de paquetes diferentes, que ya sabrá.fuente
Los pros de la carpeta lib desaparecen rápidamente después de pasar del desarrollo a pequeña escala a un trabajo más grande.
Por ejemplo, el "beneficio" de no requerir una herramienta externa se ve superado por el trabajo requerido para administrar manualmente sus dependencias, por lo que la herramienta será usted (en más de un sentido del mundo).
No necesita una conexión a Internet para un administrador de paquetes. Puedes usar repositorios locales.
Una compilación más rápida puede ser cierta, pero no es algo que deba determinar si se debe usar un administrador de paquetes o no. No estamos hablando de magnitudes de diferencia después de todo, y esto también depende de su configuración. Puede hacer una compilación lenta fácilmente usando un administrador de paquetes, pero eso es básicamente un sabotaje.
¿Entornos más simples (se requieren menos conocimientos)? Nuevamente, en el desarrollo a pequeña escala definitivamente es una posibilidad. Es posible que pueda mantener el proyecto en su cabeza por completo, hasta cada una de las pocas bibliotecas que se utilizan. Agregue un simple archivo make / otro script de compilación y obtendrá un paquete completo.
Pero no simplifica los entornos, solo funciona en entornos simples. En el desarrollo a gran escala, estará contento de que esté utilizando herramientas estándar en lugar de soluciones personalizadas. Después de todo, solo tiene que aprenderlo una vez (y cuando el administrador de paquetes del día es reemplazado por algo nuevo y genial, también debe aprenderlo).
fuente
blah install libfoo
. Y luego, multiplique eso por, digamos, 5 dependencias.Te estás perdiendo muchas de las ventajas de los administradores de paquetes.
También está exagerando el valor de sus "beneficios".
¿"Externo" a qué? Compruebo el ejecutable NuGet en mis repositorios. Es el único binario que me siento bien registrando, ya que es pequeño y significa que no necesito registrar ningún otro binario.
pip no plantea problemas en este frente ya que ahora está incluido en Python de manera predeterminada y los cambios incompatibles de ruptura y hacia atrás son extremadamente raros. De todos modos, no va a desarrollar código Python sin tener Python instalado externamente en su proyecto.
Cuando llegan a una adopción generalizada, los administradores de paquetes tienden a ser muy estables. No puede escapar sin algún tipo de herramientas instaladas a nivel mundial para la mayoría de los proyectos, y un único administrador de paquetes es un requisito bastante ligero. Por lo general, no es mucho más engorroso que tener instalado Language Runtime.
No puedo conectarme a mi base de datos sin una conexión de red. Si la base de datos está alojada en Amazon, de todos modos necesito una conexión a Internet completa. Necesito una conexión a Internet para impulsar y extraer cambios a través del control de fuente; un servidor de compilación tampoco puede verificar el código para compilar sin algún tipo de conexión de red. No puede enviar ni recibir correos electrónicos sin uno. ¡No puede descargar bibliotecas para ponerlas en su carpeta lib sin una! El desarrollo permanente sin conexión a Internet es prácticamente desconocido. En algunos casos raros donde es necesario, puede lidiar con esto descargando los paquetes a una ubicación que el administrador de paquetes pueda consumir. (Sé que NuGet y pip están muy contentos de extraerlos de una carpeta o unidad de red simple; sospecho que la mayoría de los demás también pueden hacerlo).
30 segundos durante la compilación automatizada y 5 segundos durante la compilación de desarrollo local son una buena compensación por los beneficios que describí anteriormente. Estos son plazos triviales que generalmente ni siquiera vale la pena considerar en comparación con los problemas que resuelven los beneficios.
De todos modos, una herramienta para la administración de paquetes contra nada para la administración de bibliotecas no es realmente una comparación justa. Sin la herramienta, debe aprender cualquier proceso personalizado que esté utilizando el proyectopara administrar sus bibliotecas. Esto significa que nunca está seguro de si su conocimiento existente se aplica a cualquier proyecto nuevo que aborde. Tendrás que lidiar con cualquier enfoque de mezcolanza que alguien haya inventado, o inventar el tuyo. Ese podría ser un directorio que contiene todas las bibliotecas, o podría ser algo mucho más extraño. Tal vez para evitar registrar las bibliotecas, alguien las puso todas en una unidad de red y el único indicador de versión es el nombre de la carpeta. ¿Cómo es eso o una instalación global realmente mejor? En comparación, un administrador de paquetes le brinda una convención limpia que se aplicará en la mayoría de los proyectos que encuentre.
El tema común es que proporcionan coherencia, documentación y características no solo dentro de los proyectos, sino incluso entre ellos. Esto simplifica la vida de todos.
fuente
Tras haber convertido recientemente nuestro producto del uso de bibliotecas descargadas manualmente a la gestión automática de paquetes con Nuget, puedo decir que usar un administrador de paquetes tiene enormes beneficios.
Nuestro producto se implementa en 27 proyectos de C #, que es relativamente pequeño para los estándares actuales. Algunas de nuestras dependencias de terceros tienen docenas de ensamblajes.
Antes de Nuget, si quisiera actualizar todas nuestras dependencias a la última versión, tendría que:
Con 27 proyectos y docenas de ensambles de dependencia, este proceso era muy propenso a errores y podía llevar horas.
Ahora que hemos actualizado el uso de Nuget, todo está hecho para mí con un solo comando.
fuente
Eso no es un punto, ¿verdad? Si uso un administrador de paquetes, no necesito tener una carpeta lib. Tampoco tengo que administrar los paquetes yo mismo.
Además de que no tener una conexión a Internet hoy en día mientras se desarrolla es algo raro (tal vez con la excepción de estar en tránsito), un administrador de paquetes decente no debería requerir que tenga la última versión para construir su aplicación. Puede quejarse, pero no hay razón para no compilar con la versión que ya instaló
Ese es un impulso de velocidad bastante marginal, pero podría decirse que es posible.
La mayoría de los administradores de paquetes son tan simples en estos días que apenas vale la pena tratar de evitarlos haciendo esto. Incluso hay clientes visuales si quieres. En realidad, ocultan una gran parte de la corteza que está sucediendo.
Los administradores de paquetes también le permiten compartir estos paquetes entre diferentes proyectos. Si 5 de mis proyectos usan la misma versión de Boost, no hay necesidad de duplicar esto para cada proyecto. Esto es especialmente cierto para los complejos árboles de dependencia de los que habla.
Con una carpeta lib, administra paquetes solo para ese proyecto, mientras que un administrador de paquetes le permite hacer esto para todo su entorno de desarrollo con una sola herramienta.
fuente
nuget.org
bien (la plantilla predeterminada debería ya se configura de esta manera).Es la diferencia entre simplemente usar bibliotecas (directorio lib) y usarlas, mantener la metainformación (administrador de paquetes) . Dicha metainformación se refiere a números de versión, dependencias (transitivas) entre bibliotecas y demás.
Las discusiones sobre el infierno de DLL, la compatibilidad de la biblioteca, el sistema de módulos Java, OSGi y demás deberían ser, por lo menos, suficientes para convencer de algún valor de tener alguna forma de gestión de dependencias.
También existe el beneficio de un repositorio compartido (local), por lo que varios proyectos no necesitan mantener copias de las librerías importadas. Si uno tiene un proyecto con 20 submódulos, algunos de esos módulos tienen 40 dependencias impares.
fuente
Hay algunos casos en los que podría ser necesaria una carpeta lib, por ejemplo, cuando se trata de bibliotecas obsoletas (una versión que ya no se mantiene / disponible), una versión localmente modificada de una biblioteca, ...
Pero para todo lo demás, es como si el desarrollador asumiera el rol de administrador de paquetes:
Y en mi humilde opinión, se requiere menos conocimiento, porque hay que aprender sobre el uso de la herramienta externa, pero menos sobre las bibliotecas (es decir, dependencias).
fuente
Hay otro problema no cubierto por otras preguntas: compartir departamentos.
Digamos que tienes dos paquetes construyendo la misma biblioteca. En el mejor de los casos, no habrá ningún cóctel, pero el mismo espacio HDD / SSD se usará dos veces. En el peor de los casos, habrá varios conflictos, como versiones.
Si usa el administrador de paquetes, instalará la biblioteca solo una vez (por versión) y ya le proporcionará la ruta.
PD: por supuesto, necesitas un enlace dinámico (o una función similar en tu idioma) para obtener este profesional.
fuente
Una de las principales razones por las que las bibliotecas compartidas se consideraban un elemento de progreso en los sistemas Unix y Windows de la era de los 90 era cómo podían reducir el uso de RAM cuando se cargaban múltiples programas que usaban el mismo conjunto de bibliotecas. El espacio de código solo necesita asignarse UNA VEZ por biblioteca exacta y versión de esa biblioteca , el único uso de memoria por instancia restante es para variables estáticas.
Muchos sistemas operativos implementan bibliotecas compartidas de una manera que depende de mecanismos como la api mmap () de Unix, lo que implica que una biblioteca no solo necesitará ser exactamente la misma versión, sino realmente el mismo ARCHIVO. Esto es simplemente imposible de aprovechar al máximo para un programa que incluye su propio conjunto de bibliotecas.
Dado que la memoria es mucho más barata y las versiones de la biblioteca necesitaban más diversidad que en los años 90, este argumento no tiene tanto peso hoy en día.
fuente