Cuando un proyecto se vuelve cada vez más complejo, debe dividirse en varios módulos para reutilizar el código y mejorar el desarrollo colaborativo entre varias personas.


Supongamos que ya tenemos dos módulos flysnow.org/util y flysnow.org/product, y el módulo flysnow.org/product depende de  flysnow.org/util . 


Ahora existe el requisito de que estos dos módulos deben modificarse al mismo tiempo, de modo que el nuevo método de flysnow.org/util pueda ser utilizado por el módulo flysnow.org/product .


Pero cuando el colega A agrega un nuevo método en el módulo flysnow.org/util , puede enviarlo a VCS y dejar que el colega B a cargo del módulo flysnow.org/product lo use. Este es el escenario de lanzamiento.


¿Qué pasa si el módulo flysnow.org/util no está publicado? Entonces solo puede ser reemplazado por el comando replace en go.mod, para reemplazar la referencia al módulo flysnow.org/util con la versión local inédita, por ejemplo:

replace flysnow.org/util => /Users/flysnow/go/demo/util


Creo que todos nos hemos encontrado con las dos situaciones anteriores, las cuales tienen desventajas correspondientes, tales como:

  1. Publicar código sin depurar y probar afectará otras compilaciones normales

  2. Al reemplazarlo, olvidé volver a cambiarlo y lo envié a VCS, lo que afectó el uso de otras personas.

Para resolver los problemas anteriores, el equipo de Go propuso el concepto de espacio de trabajo y lo lanzó en Go 1.18.

Go Workspace es tu espacio de trabajo, no tiene nada que ver con la colaboración de varias personas, VCS, etc. Para decirlo sin rodeos, es un directorio local y varios módulos go.mod se administran a través del archivo go.work.

Crear un espacio de trabajo de Go es tan simple como:

mkdir workspacecd workspacego work init /Users/flysnow/go/demo/util /Users/flysnow/go/demo/product

En el ejemplo anterior, el espacio de trabajo es un espacio de trabajo que creé, puede estar en cualquier parte de su computadora y usted mismo puede tomar el nombre.


Luego, go work init es seguido por dos rutas absolutas de go.mod, separadas por espacios, por supuesto, también puede usar rutas relativas.


Después de ejecutar el código anterior, se generará un archivo go.work en el directorio del espacio de trabajo con el siguiente contenido:

go 1.18
use ( /Users/flysnow/go/demo/product /Users/flysnow/go/demo/util)

use es una directiva en el archivo go.work para administrar los módulos go.mod incluidos.

Además del comando use, go.work también tiene un comando replace, que es muy similar al replace de go.mod Se usa para reemplazar todos los go.mod administrados por el espacio de trabajo de Go con la ruta especificada y su prioridad. es más alto que el de ir. El reemplazo de mod es más alto.

Ahora, los dos módulos que usamos están en el mismo espacio de trabajo, por lo que no es necesario modificar el comando go.mod replace del módulo flysnow.org/product para completar la dependencia local.

En este momento, en el directorio del espacio de trabajo, ejecute el siguiente comando para verificar.

➜  workspace go run flysnow.org/product你好

Debido a que todos están en el mismo espacio de trabajo, go puede ayudarlo a encontrar los módulos flysnow.org/util de los que depende el módulo flysnow.org/product .


Si simplemente cambia al directorio del producto y ejecuta el comando anterior, solo le preguntará:

➜  product go run main.go main.go:3:8: no required module provides package flysnow.org/util; to add it:  go get flysnow.org/util

No solo mi ejemplo anterior de confiar en módulos ascendentes puede usar el espacio de trabajo de Go, sino que si tiene varios módulos en una base de código, también puede usarlos, simplemente agréguelos todos al espacio de trabajo de Go.

El comando go work tiene un uso para agregar módulos desde el directorio local al espacio de trabajo, de la siguiente manera:

go work use [path-to-your-module]

Las rutas entre corchetes se pueden reemplazar con rutas de módulos locales en su propia computadora.


Por supuesto, también puede modificar directamente el archivo go.work, el efecto es el mismo, no hay ningún ejemplo aquí, puede probarlo usted mismo.


go.work es esencialmente una solución localizada, porque go.mod se coloca en VCS y está estrechamente relacionado con el proyecto, por lo que rara vez lo modificamos para lograr algunas operaciones de pirateo.


Ahora es mucho más fácil de manejar con go.work, porque es algo local, no en VCS, puedes cambiarlo como quieras, y no moverá el go.mod del módulo administrado, por lo que no afectará otros desarrolladores colaborativos, muy seguro.


Lectura recomendada:
Cómo abrir su propia biblioteca Go

Descargar

¡Haga clic en la tarjeta a continuación para seguir la cuenta oficial y envíe palabras clave específicas para obtener la información correspondiente de alta calidad!

  • Responda a "e-book" para obtener los libros de lectura obligada para el lenguaje Go introductorio y avanzado.

  • ¡Responda a "Video" para obtener materiales de video por valor de 5000 océanos, incluidos proyectos de combate reales (no rumoreados)!

  • Responda a "Ruta" para obtener la última versión del mapa de conocimiento de Go y la hoja de ruta de aprendizaje y crecimiento.

  • Responda a las "preguntas de la entrevista" para obtener las preguntas de la entrevista en idioma Go recopiladas por el cuarto hermano, incluido el análisis.

  • Responda a "Backstage" para obtener 10 libros de lectura obligatoria para el desarrollo entre bastidores.

Por cierto, después de leer el artículo, recuerda hacer clic en la tarjeta de abajo. Sígueme~  👇👇👇

Si sus amigos también están aprendiendo el idioma Go, creo que este artículo será útil para TA , bienvenido a reenviarlo y compartirlo con TA, ¡muchas gracias!imagen