Red de conocimiento informático - Aprendizaje de programación - Cómo funciona go.sum

Cómo funciona go.sum

Para garantizar la coherencia de la compilación, Go introduce el archivo go.mod para marcar la versión de cada paquete dependiente. Durante el proceso de compilación, el comando go descargará los paquetes de dependencia en go.mod y los paquetes de dependencia descargados se almacenarán en caché localmente para usarlos en la próxima compilación. Teniendo en cuenta que los paquetes de dependencia descargados pueden ser manipulados maliciosamente por piratas informáticos, y los paquetes de dependencia almacenados en caché local también pueden ser manipulados, un solo archivo go.mod no es suficiente para garantizar una compilación consistente.

Para resolver este problema de seguridad de los módulos de Go, el equipo de desarrollo de Go introdujo el archivo go.sum en el archivo go.mod para registrar el valor hash de cada dependencia si es el hash de la dependencia local. Si el valor no coincide con el valor registrado en el archivo go.sum durante la compilación, la compilación será rechazada.

registros del archivo go.sum

Cada línea del archivo go.sum consta del nombre del módulo, la versión y el valor hash, separados por espacios:

Para Por ejemplo, el archivo go.sum registra github.com/google/uuid, que es el valor hash del paquete de software v1.1.2:

Por lo general, cada versión de dependencia contiene dos registros, el primer registro es el entero El valor hash de la versión dependiente (todos los archivos) El segundo registro es el valor hash del archivo go.mod de la versión dependiente. Si la versión dependiente no tiene un archivo go.mod, solo existe el primer registro. . En el ejemplo anterior, v1.1.2 representa la versión completa del paquete dependiente y v1.1.2/go.mod representa el archivo go.mod en esta versión del paquete dependiente.

Los cambios en cualquier archivo (incluido go.mod) en la versión del paquete dependiente cambiarán el valor hash general, y los registros adicionales del archivo go.mod en la versión del paquete dependiente se utilizan principalmente para calcular el árbol de dependencias. No es necesario descargar la versión completa del paquete de dependencias, y el árbol de dependencias se calcula únicamente en función de go.mod.

El valor hash en cada registro está precedido por un h1: indica el algoritmo hash, lo que indica que el valor hash se calcula mediante el algoritmo SHA-256

archivo go.sum El número El número de paquetes dependientes registrados suele ser mayor que el del archivo go.mod. Esto se debe a la diferente granularidad de los dos registros. go.mod solo necesita registrar las versiones de los paquetes que dependen directamente de él, solo registra las versiones de los paquetes dependientes que dependen directamente de él, solo registra las versiones de los paquetes indirectos que no están incluidos en el archivo go.mod, mientras que go.mod .sum registra la compilación. Todas las versiones del paquete utilizadas en el proceso.

Generar

Cuando introducimos una nueva dependencia en modo GOMODULE, generalmente usamos el comando go get para obtener la dependencia, por ejemplo:

El comando go get El comando primero descarga las dependencias a $GOPATH/pkg/mod/cache/download en el caché local. En caché/descarga, el paquete de dependencia es un paquete comprimido con un sufijo .zip, como v1.0.0.0.zip. go get codificará el paquete .zip y almacenará el resultado en un archivo con un sufijo .ziphash, como v1.0.0.ziphash. Si ejecuta el comando go get en el directorio raíz del proyecto, go get actualizará sincrónicamente las dependencias en el archivo .ziphash. Si ejecuta el comando go get en el directorio raíz del proyecto, go get actualizará los archivos go.mod y go.sum sincrónicamente.

Por ejemplo, el nombre de la dependencia y su versión se registrarán en el archivo go.mod:

El hash del paquete dependiente (y el hash go.mod del paquete dependiente) se registrarán en el archivo go. Archivo .sum, por ejemplo:

Antes de actualizar, go get actualizará los archivos go.mod y go.sum sincrónicamente:

Antes de actualizar el archivo go.sum, el comando go se descargará después descargando el paquete de dependencia. Para garantizar que el paquete de dependencia descargado sea auténtico y confiable, el comando go también consultará el servidor indicado por la variable de entorno GOSUMDB después de descargar el paquete de dependencia para obtener el valor hash autorizado de la versión del paquete de dependencia. Si el valor hash de la versión del paquete dependiente calculado por el comando go no es consistente con el valor hash de la versión proporcionado por el servidor GOSUMDB, el comando go se negará a ejecutar el siguiente comando y no actualizará el archivo go.sum.

go.sum existe porque desea que otras personas u otros entornos construyan el proyecto actual utilizando las mismas dependencias documentadas en go.sum, logrando así el objetivo de compilaciones consistentes.

Verificación

Supongamos que obtenemos el código fuente de un proyecto e intentamos compilarlo localmente. El comando go encontrará todas las dependencias registradas en go.mod en el caché local, y calcule el valor hash de la dependencia local y lo compare con el registro en go.sum para ver si la versión de la dependencia en el caché local es consistente con la versión del proyecto registrada en go.sum, verificando si coinciden con el proyecto go. suma de las expectativas del documento.

Si la verificación falla, lo que indica que el valor hash de la versión del paquete dependiente en el directorio de caché local no coincide con el valor hash registrado en el proyecto go.sum, el comando go rechazará la compilación. Para eso existe go.sum, es decir, si no estás usando la versión esperada, no puedes compilar.

Base de datos de suma de verificación

La variable de entorno GOSUMDB identifica una base de datos de suma de verificación, es decir, la base de datos de suma de verificación. En realidad, es un servidor de red que proporciona consultas de versiones de paquetes de software dependientes. servicio.

Esta base de datos contiene hash de muchas versiones de paquetes de dependencia, como el sum.golang.org oficial de Google, que contiene todas las versiones de paquetes de dependencia disponibles públicamente. Además de utilizar la base de datos oficial, también puede especificar una base de datos personalizada o incluso deshabilitarla por completo (exportar GOSUMDB = desactivado).

Si se configura GOSUMDB, se consulta la base de datos antes de que los hashes de las versiones dependientes se escriban en go.sum.

Si GOSUMDB está deshabilitado, el hash de la versión de la dependencia no se consultará antes de escribirlo en go.sum, y el comando go confiará en todas las dependencias descargadas y las ejecutará en go.sum. Se registran en suma.