Go Modules in 2019
19 de diciembre de 2018
¡Qué año!
2018 fue un gran año para el ecosistema de Go, con
La gestión de paquetes como uno de nuestros principales enfoques.
En febrero, comenzamos una discusión de toda la comunidad sobre cómo integrar
gestión de paquetes directamente en la cadena de herramientas Ir,
y en agosto entregamos la primera implementación aproximada de esa característica,
Se llaman módulos Go, en Go 1.11.
Los módulos de migración a Go serán el cambio de mayor alcance.
para el ecosistema Go desde Go 1.
Convertir todo el ecosistema (código, usuarios, herramientas, etc.) desde
GOPATH para módulos requerirá trabajo en muchas áreas diferentes.
El sistema de módulos a su vez nos ayudará a entregar
Mejoras de autenticación y velocidad de construcción para el ecosistema Go.
Esta publicación es una vista previa de lo que el equipo Go está planeando
relativas a los módulos en 2019.
Lanzamientos
Go 1.11, lanzado en agosto de 2018, introdujo soporte preliminar para módulos .
Por ahora, el soporte del módulo se mantiene junto con el
Mecanismos tradicionales basados en GOPATH.
El comando go
se establece por defecto en el modo de módulo cuando se ejecuta
en los árboles del directorio fuera de GOPATH / src y
marcados por go.mod
en sus raíces.
Esta configuración se puede anular configurando la transición
variable de entorno $ GO111MODULE
a en
o desactivado
;
el comportamiento predeterminado es modo automático
.
Ya hemos visto una adopción significativa de módulos en toda la comunidad Go,
junto con muchas sugerencias útiles e informes de errores
Para ayudarnos a mejorar los módulos.
Go 1.12, programado para febrero de 2019, refinará el soporte del módulo
pero aún así, déjelo en el modo auto
por defecto.
Además de muchas correcciones de errores y otras mejoras menores,
Quizás el cambio más significativo en Go 1.12
es que comandos como van
ejecutan
x.go
o go
get
rsc.io/2fa@v1.1.0
ahora puede operar en GO111MODULE = en modo
sin un archivo explícito go.mod
.
Nuestro objetivo es para Go 1.13, programado para agosto de 2019, para habilitar el modo de módulo mediante
predeterminado (es decir, para cambiar el valor predeterminado de auto
a en
)
y despreciar el modo GOPATH.
Para hacer eso, hemos estado trabajando en un mejor soporte de herramientas
junto con un mejor soporte para el ecosistema de módulos de código abierto.
Integración de herramientas e IDE
En los ocho años que hemos tenido GOPATH,
Se ha creado una increíble cantidad de herramientas.
que asume que el código fuente de Go está almacenado en GOPATH.
Mover a módulos requiere actualizar todo el código que hace
esa suposición
Hemos diseñado un nuevo paquete,
golang.org/x/tools/go/packages ,
Que abstrae la operación de búsqueda y carga de información.
sobre el código fuente de Go para un objetivo dado.
Este nuevo paquete se adapta automáticamente a ambos.
GOPATH y modo de módulos y también es extensible.
a diseños de código específicos de la herramienta, como el
utilizado por Bazel.
Hemos estado trabajando con autores de herramientas en toda la comunidad de Go
para ayudarles a adoptar golang.org/x/tools/go/packages en sus herramientas.
Como parte de este esfuerzo, también hemos estado trabajando para
Unificar las diversas herramientas de consulta de código fuente.
como gocode, godef y go-outline
en una sola herramienta que se puede utilizar desde el
línea de comandos y también soporta
El protocolo del servidor de idiomas
utilizado por los IDE modernos.
La transición a módulos y los cambios en la carga de paquetes
También provocó un cambio significativo en el análisis del programa Go.
Como parte de la revisión vaya
veterinario
a los módulos de soporte,
Introducimos un marco generalizado para incrementales.
Análisis de los programas Go.
en el que se invoca un analizador para un paquete a la vez.
En este marco, el análisis de un paquete puede escribir hechos
Disponible para análisis de otros paquetes que importen el primero.
Por ejemplo, go
vet
el análisis del paquete de registros
determina y registra el hecho de que log.Printf
es un fmt.Printf
envoltorio.
Entonces go
vet
puede verificar cadenas de formato de estilo printf en otros paquetes
esa llamada log.Printf
.
Este marco debería permitir muchos nuevos y sofisticados
Herramientas de análisis de programas para ayudar a los desarrolladores a encontrar errores antes.
y entender mejor el código.
Índice del módulo
Una de las partes más importantes del diseño original para ir
obtener
fue que fue descentralizado :
entonces creímos, y todavía creemos hoy, que
Cualquiera debería poder publicar su código en cualquier servidor,
en contraste con los registros centrales
como el CPAN de Perl, Maven de Java o el NPM de Node.
Colocar nombres de dominio al comienzo del espacio de importación go
get
reutilizado un sistema descentralizado existente
y evitado tener que resolver de nuevo los problemas de
decidir quién puede usar qué nombres.
También permitió a las empresas importar código en servidores privados.
Junto al código de los servidores públicos.
Es fundamental preservar esta descentralización a medida que cambiamos a los módulos de Go.
La descentralización de las dependencias de Go ha tenido muchos beneficios,
pero también trajo algunos inconvenientes significativos.
La primera es que es muy difícil encontrar todos los paquetes Go disponibles públicamente.
Todo sitio que quiera entregar información sobre
paquetes tiene
para realizar su propio rastreo, o esperar a que un usuario le pregunte
sobre un paquete en particular antes de buscarlo.
Estamos trabajando en un nuevo servicio, el Go Module Index,
que proporcionará un registro público de paquetes que entran en el ecosistema Go.
Sitios como godoc.org y goreportcard.com podrán ver este registro
para nuevas entradas en lugar de cada código de implementación independiente
para encontrar nuevos paquetes.
También queremos que el servicio permita buscar paquetes.
utilizando consultas simples, para permitir goimports
agregar
importa paquetes que aún no se hayan descargado al sistema local.
Autenticación del módulo
Hoy en día, go
get
se basa en la autenticación a nivel de conexión (HTTPS o SSH)
para comprobar que está hablando con el servidor correcto para descargar el código.
No hay verificación adicional del código en sí,
dejando abierta la posibilidad de ataques de hombre en el medio
si los mecanismos HTTPS o SSH están comprometidos de alguna manera.
La descentralización significa que el código para una construcción es recuperado
de muchos servidores diferentes, lo que significa que la compilación depende de
Muchos sistemas para servir código correcto.
El diseño de los módulos Go mejora la autenticación del código al almacenar
un archivo go.sum
en cada módulo;
ese archivo lista el hash criptográfico
del árbol de archivos esperado para cada una de las dependencias del módulo.
Cuando se usan módulos, el comando go
usa go.sum
para verificar
que las dependencias son bit a bit idénticas a las versiones esperadas
Antes de usarlos en una compilación.
Pero el archivo go.sum
solo enumera hashes para las dependencias específicas
utilizado por ese módulo.
Si está agregando una nueva dependencia.
o actualizar dependencias con go
get
-u
,
no hay una entrada correspondiente en go.sum
y por lo tanto
No hay autenticación directa de los bits descargados.
Para los módulos disponibles públicamente, pretendemos ejecutar un servicio al que llamamos notario
que sigue el módulo de registro de índice,
descarga nuevos módulos,
y firma criptográficamente declaraciones de la forma.
"El módulo M en la versión V tiene el árbol de archivo hash H."
El servicio de notaría publicará todos estos hashes notariados.
en una consulta, Certificado de transparencia -estilo
registro a prueba de manipulaciones ,
para que cualquiera pueda verificar que el notario se comporta correctamente.
Este registro servirá como un archivo público, global go.sum
que go
get
puede usar para autenticar módulos
Al agregar o actualizar dependencias.
Nuestro objetivo es que el comando go
compruebe los hashes notariados
para módulos disponibles al público que aún no se encuentran en go.sum
comenzando en Go 1.13.
Módulo espejos
Debido a que descentralizado go
get
obtiene el código de varios servidores de origen,
El código de recuperación es tan rápido y confiable como el más lento,
Servidor menos confiable.
La única defensa disponible antes de los módulos era al vendedor.
Dependencias en tus propios repositorios.
Mientras que el vendedor continuará siendo apoyado,
preferiríamos una solución que funcione para todos los módulos, no solo los que ya está usando, y
que no requiere duplicar una dependencia en cada
repositorio que lo utiliza.
El diseño del módulo Go presenta la idea de un módulo proxy,
que es un servidor que el comando go
solicita módulos,
En lugar de los servidores de origen.
Un tipo importante de proxy es un módulo espejo ,
que responde a las solicitudes de módulos al buscarlos
desde los servidores de origen y luego almacenarlos en caché para su uso en
futuras solicitudes.
Un espejo bien manejado debe ser rápido y confiable
incluso cuando algunos servidores de origen han caído.
Estamos planeando lanzar un servicio espejo para los módulos disponibles públicamente en 2019.
Otros proyectos, como GoCenter y Athens, también están planeando servicios espejo.
(Anticipamos que las empresas tendrán múltiples opciones para correr
sus propios espejos internos también, pero esta publicación se centra en los espejos públicos.)
Un problema potencial con los espejos es que son
precisamente servidores en el medio,
Haciéndolos un objetivo natural para los ataques.
Los desarrolladores de Go necesitan cierta seguridad de que los espejos
Están proporcionando los mismos bits que los servidores de origen.
El proceso notarial que describimos en la sección anterior.
aborda exactamente esta preocupación, y
Se aplicará a las descargas utilizando espejos.
así como descargas utilizando servidores de origen.
Los espejos en sí no necesitan ser confiados.
Queremos que el módulo de ejecución de Google refleje
listo para ser usado por defecto en el comando go
que comienza en Go 1.13.
Usar un espejo alternativo, o ningún espejo será trivial
para configurar.
Descubrimiento del módulo
Finalmente, mencionamos anteriormente que el índice del módulo hará que sea más fácil
construir sitios como godoc.org.
Parte de nuestro trabajo en 2019 será una importante renovación de godoc.org
para que sea más útil para los desarrolladores que necesitan
Descubre los módulos disponibles.
y luego decidir si confiar en un módulo dado o no.
Imagen general
Este diagrama muestra cómo el código fuente del módulo
Se mueve a través del diseño en este post.
Antes, todos los consumidores del código fuente de Go: el comando go
y cualquier sitio como godoc.org: código obtenido directamente de cada host de código.
Ahora pueden obtener código en caché de un espejo rápido y confiable,
sin dejar de autenticar que los bits descargados son correctos.
Y el servicio de índice lo hace fácil para los espejos, godoc.org,
y cualquier otro sitio similar para mantenerse al día con todas las grandes novedades
Código que se agrega al ecosistema Go todos los días.
Estamos entusiasmados con el futuro de los módulos Go en 2019,
y esperamos que usted también lo sea. ¡Feliz año nuevo!
No comments:
Post a Comment