gopkg - Mejores prácticas de gestión de dependencias de Golang
go dep (4)
En Golang, podemos especificar bibliotecas de código abierto en GitHub como dependencias. Por ejemplo:
import "github.com/RichardKnop/somelibrary"
Esto intentará buscar una rama basada en su versión Go y predeterminada para masterizar si entiendo correctamente.
Por lo tanto, no hay forma de importar una versión específica de una dependencia, por ejemplo:
import "github.com/RichardKnop/somelibrary#v1.4.8"
¿Cuál es la mejor práctica para administrar dependencias en Go entonces?
Puedo ver dos enfoques.
I. Módulos de versión
¿Es para crear nuevos módulos para versiones principales con cambios importantes?
Por ejemplo, mi biblioteca Go podría definir los módulos v1 y v2 para que pueda hacer lo siguiente:
import "github.com/RichardKnop/somelibrary/v1"
O:
import "github.com/RichardKnop/somelibrary/v2"
De acuerdo con lo que necesitas. Se requeriría que cualquier cambio realizado en v1 o v2 no rompa ninguna API o funcionalidad de trabajo.
II Bifurcación
Esto le daría un control completo sobre una versión de dependencia externa que requiere su código Go.
Por ejemplo, puede bifurcar github.com/RichardKnop/somelibrary en su propia cuenta de GitHub y luego en su código hacer:
import "github.com/ForkingUser/somelibrary"
Entonces tendrías que bifurcar todas las dependencias externas, lo que parece un poco exagerado. Sin embargo, le daría un control total sobre las versiones. Puede mantener sus horquillas en una versión que sabe que funciona con su código y solo actualizar las horquillas una vez que haya verificado que las nuevas versiones de dependencias no rompen nada.
Pensamientos?
Actualización de agosto de 2018: esto (vgo presentado a continuación) ahora se implementa con Go 1.11 y módulos .
Actualización de febrero de 2018, 3 años después.
Existe un nuevo enfoque desarrollado por Russ Cox , del equipo central de desarrollo de Golang.
El proyecto vgo .
go get -u golang.org/x/vgo
Esta propuesta:
- mantiene las mejores partes de
go get
,- agrega compilaciones reproducibles ,
- adopta versiones semánticas,
- elimina la venta ,
- desprecia a
GOPATH
a favor de un flujo de trabajo basado en proyectos, y- proporciona una ruta de migración sin problemas desde
dep
y sus predecesores.
Se basa en un nuevo algoritmo MVS ("Selección de versión mínima") :
Puedes ver:
- los primeros artículos en Go & Versioning
- la discusión en este hilo
- El análisis de ese hilo por Jon Calhoun
-
El contrapunto de
Sam Boyer
en "
Pensamientos sobre vgo y dep
":
Lideraba la iniciativa privada dego dep
- ¡El primer debate (YouTube) entre Russ, Sam y Jesse Frazelle !
Mayo de 2018: Artifactory propone un proxy vgo
El lanzamiento reciente de Artifactory 5.11 agregó soporte para registros Go compatibles con vgo (y go proxy), lo que brinda a la comunidad una variedad de capacidades al desarrollar con Go.
Estos son solo algunos de ellos:
- Los repositorios locales en Artifactory le permiten configurar registros Go privados y seguros con un control de acceso específico a paquetes de acuerdo con proyectos o equipos de desarrollo.
- Un repositorio remoto en Artifactory es un proxy de almacenamiento en caché para recursos Go remotos, como un proyecto GitHub. El acceso a un proxy de Go a través de Artifactory elimina su dependencia de la red o de GitHub, ya que todas las dependencias necesarias para sus compilaciones de Go se almacenan en caché en Artifactory y, por lo tanto, están disponibles localmente. Esto también elimina el riesgo de que alguien mute o elimine una dependencia del control de versiones, o peor aún, forzar cambios a una etiqueta Git remota, cambiando así lo que debería ser una versión inmutable que puede crear mucha confusión e inestabilidad para proyectos dependientes.
- Un repositorio virtual agrega registros Go locales y remotos que le dan acceso a todos los recursos Go necesarios para sus compilaciones desde una sola URL, ocultando la complejidad de usar una combinación de recursos locales y remotos.
Febrero de 2018: el enfoque de venta presentado a continuación (en 2015/2016) podría terminar desapareciendo si vgo se integra a la cadena de herramientas.
Mira
mi respuesta a continuación
.
Edición de agosto de 2015:
Go 1.5 viene con un soporte de venta incorporado (pero aún experimental).
La configuración de la variable de entorno
GO15VENDOREXPERIMENT
hará que
go build
y sus amigos busquen paquetes en el directorio
./vendor
y en
GOPATH
.
Vea
la respuesta de VonC
y el
documento de diseño
para más detalles.
III. Vendiendo
AFAIK, esta es la forma más utilizada de garantizar que sus compilaciones sean reproducibles y predecibles. El equipo Go en sí usa la venta en su repositorio. El equipo de Go ahora está discutiendo el formato de archivo de manifiesto de dependencia unificado. De la lista de correo de desarrolladores de Go toolchain :
En el árbol fuente interno de Google, vendemos (copiamos) todas nuestras dependencias en nuestro árbol fuente y tenemos como máximo una copia de cualquier biblioteca externa dada. Tenemos el equivalente de un solo GOPATH y reescribimos nuestras importaciones para referirnos a nuestra copia vendida. Por ejemplo, el código Go dentro de Google que quiera usar "golang.org/x/crypto/openpgp" lo importaría como algo así como "google / third_party / golang.org / x / crypto / openpgp".
(...)
Nuestra propuesta es que el proyecto Go,
oficialmente recomienda vender en un directorio "interno" con reescritura de importación (no modificaciones de GOPATH) como la forma canónica de anclar dependencias.
define un formato de archivo de configuración común para dependencias y proveedores
no realiza cambios de código en cmd / go en Go 1.5. Las herramientas externas como " godep " o " nut " implementarán 1) y 2). Podemos reevaluar la inclusión de dicha herramienta en Go 1.6+.
Nota: ¡Junio de 2015, el primer soporte para la venta aparece en Go 1.5!
Ver c/10923/ :
Cuando
GO15VENDOREXPERIMENT=1
está en el entorno, este CL cambia la resolución de las rutas de importación de acuerdo con la propuesta del proveedor Go 1.5:
- Si hay un directorio fuente
d/vendor
, cuando compila un archivo fuente dentro del subárbol enraizado end
, laimport "p"
se interpreta comoimport "d/vendor/p"
si existe.- Cuando hay varias resoluciones posibles, gana la ruta más específica (más larga).
- Siempre se debe usar la forma abreviada: ninguna ruta de importación puede contener "
/vendor/
" explícitamente.- Los comentarios de importación se ignoran en los paquetes distribuidos.
Actualización de enero de 2016: Go 1.6 hará que la venta sea la predeterminada.
Y como se detalla en
el artículo "LA MAYORÍA DE LAS HERRAMIENTAS IR A TRABAJAR CON GO15VENDOREXPERIMENT"
:
1.6 brinda soporte para
/vendor/
para la mayoría de las herramientas (como el oráculo) fuera de la caja; usa la Beta para reconstruirlos.
- El problema 12278 ha sido resuelto.
-
Todavía hay un problema con.goimports
, y hay un CL que puede ser seleccionado
también es posible simplemente describir dependencias en maven, si usar mvn-golang-wrapper , en el caso que se vea en maven como se muestra a continuación
<plugin>
<groupId>com.igormaznitsa</groupId>
<artifactId>mvn-golang-wrapper</artifactId>
<version>1.1.0</version>
<executions>
<execution>
<id>golang-get</id>
<goals>
<goal>get</goal>
</goals>
<configuration>
<packages>
<package>github.com/gizak/termui</package>
</packages>
<buildFlags>
<flag>-u</flag>
</buildFlags>
<goVersion>1.6</goVersion>
</configuration>
</execution>
</plugin>