Новая функция Go1.18: многомодульный режим рабочей области

задняя часть Go

Всем привет, я жареная рыба.

Управление зависимостями Go, также известное как Go Module. Прошло уже какое-то количество лет с момента его запуска, и нареканий было много, а официал постоянно совершенствуется.

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

Сегодня Fried Fish отведет вас к углубленному изучению.

задний план

При повседневном использовании проектов Go всегда возникают две классические проблемы, которые особенно неприятны.

следующим образом:

  1. Зависит от локального модуля замены.
  2. Зависит от локально неопубликованных модулей.

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, чтобы призвать вас к обновлению.