Когда проект становится все более и более сложным, его необходимо разделить на несколько модулей для повторного использования кода и лучшей совместной разработки несколькими людьми.
Допустим, у нас уже есть два модуля 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
Я считаю, что мы все сталкивались с двумя вышеупомянутыми ситуациями, каждая из которых имеет соответствующие недостатки, такие как:
-
Публикация кода без отладки и тестирования повлияет на другие обычные сборки.
-
При замене забыл поменять обратно и сдал в VCS, что влияет на чужое использование
Чтобы решить вышеуказанные проблемы, команда Go предложила концепцию рабочего пространства и выпустила ее в Go 1.18.
Рабочее пространство Go — это ваше рабочее пространство, оно не имеет ничего общего с совместной работой нескольких человек, системами контроля версий и т. д. Проще говоря, это локальный каталог, а управление несколькими модулями go.mod осуществляется через файл go.work.
Создать рабочее пространство Go очень просто:
mkdir workspace
cd workspace
go 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.
-
Ответьте на "Видео", чтобы получить видеоматериалы на 5000 океанов, включая реальные боевые проекты (не слухи)!
-
Ответьте на «Маршрут», чтобы получить последнюю версию карты знаний Go и плана обучения и развития.
-
Ответьте на «вопросы для интервью», чтобы получить вопросы для интервью на языке го, составленные четвертым братом, включая анализ.
-
Ответьте на «Backstage», чтобы получить 10 обязательных к прочтению книг по разработке за кулисами.
Кстати, после прочтения статьи не забудьте нажать на карточку ниже. Следуй за мной~ 👇👇👇
Если ваши друзья также изучают язык Go, я считаю, что эта статья будет полезна для TA , добро пожаловать и поделитесь ею с TA, большое спасибо!