Когда проект становится все более и более сложным, его необходимо разделить на несколько модулей для повторного использования кода и лучшей совместной разработки несколькими людьми.


Допустим, у нас уже есть два модуля flysnow.org/util и flysnow.org/product, а модуль flysnow.org/product зависит от  flysnow.org/util . 


Теперь есть требование, чтобы эти два модуля модифицировались одновременно, чтобы модуль flysnow.org/product мог использовать новый метод flysnow.org/util .


Но когда коллега А добавит новый метод в модуль flysnow.org/util , либо отправьте его в VCS, и пусть его использует коллега Б, ответственный за модуль flysnow.org/product.Это сценарий релиза.


Что делать, если модуль flysnow.org/util не опубликован? Тогда его можно заменить только командой replace в go.mod, чтобы заменить ссылку на модуль flysnow.org/util на локальную невыпущенную версию, например:

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


Я считаю, что мы все сталкивались с двумя вышеупомянутыми ситуациями, каждая из которых имеет соответствующие недостатки, такие как:

  1. Публикация кода без отладки и тестирования повлияет на другие обычные сборки.

  2. При замене забыл поменять обратно и сдал в VCS, что влияет на чужое использование

Чтобы решить вышеуказанные проблемы, команда Go предложила концепцию рабочего пространства и выпустила ее в Go 1.18.

Рабочее пространство Go — это ваше рабочее пространство, оно не имеет ничего общего с совместной работой нескольких человек, системами контроля версий и т. д. Проще говоря, это локальный каталог, а управление несколькими модулями go.mod осуществляется через файл go.work.

Создать рабочее пространство Go очень просто:

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

В приведенном выше примере рабочая область — это созданная мной рабочая область , она может находиться где угодно на вашем компьютере, а имя вы можете взять сами.


Затем идет go work init, за которым следуют два абсолютных пути go.mod, разделенных пробелами, конечно, можно использовать и относительные пути.


После запуска приведенного выше кода в каталоге рабочей области будет создан файл go.work со следующим содержимым:

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

use — это директива в файле go.work для управления включенными модулями go.mod.

В дополнение к команде use в go.work также есть команда replace, которая очень похожа на замену go.mod. Она используется для замены всех go.mod, управляемых рабочей областью Go, на указанный путь и его приоритет. выше чем go Замена мода выше.

Теперь два модуля, которые мы используем, находятся в одном рабочем пространстве, поэтому нет необходимости модифицировать команду замены go.mod модуля flysnow.org/product для завершения локальной зависимости.

В это время в каталоге рабочей области выполните следующую команду для проверки.

➜  workspace go run flysnow.org/product你好

Поскольку все они находятся в одном рабочем пространстве, go может помочь вам найти модули flysnow.org/util, от которых зависит модуль flysnow.org/product .


Если вы просто переключитесь в каталог продукта и запустите указанную выше команду, она только предложит вам:

➜  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

Рабочее пространство Go можно использовать не только в приведенном выше примере с опорой на модули основной ветки разработки, но и при наличии нескольких модулей в кодовой базе, вы также можете их использовать, просто добавив их все в рабочее пространство Go.

Команда go work используется для добавления модулей из локального каталога в рабочую область следующим образом:

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

Пути в квадратных скобках можно заменить локальными путями модулей на вашем компьютере.


Конечно, можно и напрямую модифицировать файл go.work, эффект тот же, примера здесь нет, можете попробовать сами.


go.work по сути является локализованным решением, потому что go.mod размещается в VCS и тесно связан с проектом, поэтому мы редко модифицируем его для выполнения каких-то хакерских операций.


Теперь гораздо проще обращаться с go.work, потому что это локальная вещь, а не в VCS, вы можете менять ее как хотите, и она не будет перемещать go.mod управляемого модуля, так что не повлияет другие совместные разработчики, очень безопасные.


Рекомендуемое чтение:
Как открыть свою собственную библиотеку Go

Скачать

Нажмите на карточку ниже, чтобы подписаться на официальный аккаунт, и отправьте конкретные ключевые слова, чтобы получить соответствующую высококачественную информацию!

  • Ответьте на «электронную книгу», чтобы получить обязательные к прочтению книги для начального и продвинутого изучения языка Go.

  • Ответьте на "Видео", чтобы получить видеоматериалы на 5000 океанов, включая реальные боевые проекты (не слухи)!

  • Ответьте на «Маршрут», чтобы получить последнюю версию карты знаний Go и плана обучения и развития.

  • Ответьте на «вопросы для интервью», чтобы получить вопросы для интервью на языке го, составленные четвертым братом, включая анализ.

  • Ответьте на «Backstage», чтобы получить 10 обязательных к прочтению книг по разработке за кулисами.

Кстати, после прочтения статьи не забудьте нажать на карточку ниже. Следуй за мной~  👇👇👇

Если ваши друзья также изучают язык Go, я считаю, что эта статья будет полезна для TA , добро пожаловать и поделитесь ею с TA, большое спасибо!картина