Всем привет, я жареная рыба.
Управление зависимостями Go, также известное как Go Module. Прошло уже какое-то количество лет с момента его запуска, и нареканий было много, а официал постоянно совершенствуется.
Go1.18 представит новую функцию: многомодульные рабочие области, которая используется для поддержки многомодульной рабочей области, которая может решить ряд проблем в прошлом.
Сегодня Fried Fish отведет вас к углубленному изучению.
задний план
При повседневном использовании проектов Go всегда возникают две классические проблемы, которые особенно неприятны.
следующим образом:
- Зависит от локального модуля замены.
- Зависит от локально неопубликованных модулей.
replace module
Первый сценарий: Как обычно в проекте Go, решаем какие-то локальные зависимости или настраиваем код. Будет использоваться замена в файле go.mod.
Следующий код:
replace golang.org/x/net => /Users/eddycjy/go/awesomeProject
Такой точности можно добиться при местных разработчиках ФБР.
Это проблема:
- Локальный путь: Замена набора существенно преобразует локальный путь, то есть все разные.
- Зависимости репозитория: модификации файлов будут загружены в репозиторий Git, если они будут загружены случайно, они повлияют на других студентов-разработчиков, или их придется возвращать обратно каждый раз при загрузке.
Пользовательский опыт очень плохой и разочаровывающий.
неопубликованный модуль
Второй сценарий: при разработке локального проекта Go несколько библиотек (библиотеки проектов, библиотеки инструментов, сторонние библиотеки) и т. д. могут разрабатываться локально одновременно.
Следующий код:
package main
import (
"github.com/eddycjy/pkgutil"
)
func main() {
pkgutil.PrintFish()
}
Если это время работаетgo run
илиgo mod tidy
, не получится, не запустится.
Сообщается об ошибке, аналогичной следующей:
fatal: repository 'https://github.com/eddycjy/pkgutil/' not found
Эта ошибка сообщается, потому чтоgithub.com/eddycjy/pkgutil
Эта библиотека недоступна на GitHub, поэтому, естественно, ее нельзя вытащить.
Решение: до Go1.18 мы должны были пройти замену (что столкнется с проблемой фона 1) или загрузить напрямую на Github, и, естественно, зависимости могут быть извлечены цепочкой инструментов Go.
Многие студенты зададутся вопросом: все ли зависимости Go должны быть загружены на GitHub, сильная привязка?
Это очень недружелюбно к новым студентам, и это ужасно.
Режим рабочей области
После нескольких раундов обратной связи с сообществом Майкл Мэтлуб предложил предложение «Proposal: Multi-Module Workspaces in cmd/go«Было проведено много обсуждений и реализаций, и он был официально запущен в Go1.18.
Основной концепцией нового предложения является добавлениеgo work
Концепция рабочего пространства нацелена на режим управления зависимостями Go Module.
Это может быть в файле go.work локального проекта, путем установки ряда локальных путей зависимого модуля, а затем добавленияМодули по пути образуют текущую рабочую область, его приоритет чтения является самым высоким.
мы можем пройтиgo help
для просмотра следующим образом:
$ go1.18beta1 help work
Usage:
go work <command> [arguments]
The commands are:
edit edit go.work from tools or scripts
init initialize workspace file
sync sync workspace build list to modules
use add modules to workspace file
Use "go help work <command>" for more information about a command.
просто выполнитьgo work init
Новое рабочее пространство может быть инициализировано, а следующий за ним параметр — это конкретный мод подмодуля, который необходимо сгенерировать.
Команда выглядит следующим образом:
go work init ./mod ./tools
Каталог проекта выглядит следующим образом:
awesomeProject
├── mod
│ ├── go.mod // 子模块
│ └── main.go
├── go.work // 工作区
└── tools
├── fish.go
└── go.mod // 子模块
Содержимое сгенерированного файла go.work:
go 1.18
use (
./mod
./tools
)
Новый go.work имеет тот же синтаксис, что и go.mod, и вы также можете использовать синтаксис замены:
go 1.18
use (...)
replace golang.org/x/net => example.com/fork/net v1.4.5
Всего в файле go.work поддерживаются три директивы:
- go: объявляет номер версии go, который в основном используется для контроля версий последующей новой семантики.
- use: объявляет конкретный путь к файлу модуля, от которого зависит приложение.Путь может быть абсолютным или относительным путем и может находиться за пределами каталога приложения.
- replace: объявить заменить путь импорта, от которого зависит модуль, приоритет директивы replace в расширенном go.mod.
Если вы хотите отключить режим рабочей области, вы можете передать-workfile=off
команду указать.
То есть выполните следующую команду во время выполнения:
go run -workfile=off main.go
go build -workfile=off
Файл go.work не нужно отправлять в репозиторий Git, в противном случае это будет что-то вроде броска.
Пока вы настроите файл в проекте go.work Go, время компиляции и выполнения перейдет в режим рабочей области, отдаст приоритет настройке рабочей области с наивысшим приоритетом, чтобы соответствовать требованиям локальной разработки.
До сих пор основное знание рабочей области на готовую презентацию.
Суммировать
Сегодня я представлю новую функцию Go1.18: многомодульный режим рабочей области. По сути, это еще и решение задач местного развития.
Так как файл go.mod сильно связан с проектом, он в основном выложен в Git-репозиторий, и по нему сложно использовать нож. Создал go.work напрямую, чисто локальное использование, удобное и быстрое.
С новым go.work вы можете возиться со всеми типами файлов, которые являются полностью локальными и не окажут другого влияния на развитие других участников.
что ты думаешь? :)
Если у вас есть какие-либо вопросы, пожалуйста, оставьте отзыв и обменяйтесь мнениями в области комментариев.Лучшие отношения - это достигать друг друга, твойподобното естьжареная рыбаСамая большая мотивация для творчества, спасибо за поддержку.
Статья постоянно обновляется, вы можете выполнить поиск в WeChat, чтобы прочитать [Жареная рыба в мозгу], эта статьяGitHub GitHub.com/Vicious Genetics/Нет...Он был включен, вы можете посмотреть его, чтобы выучить язык GoИди Изучай Карты и Маршруты, Добро пожаловать в Star, чтобы призвать вас к обновлению.