Поиск в WeChat【Жареная рыба с мозгами] Обратите внимание на эту жареную рыбу с печенью.
эта статьяGitHub GitHub.com/Vicious Genetics/Нет...В комплекте с моей серией статей, материалов и книг по Go с открытым исходным кодом.
Привет всем, я обычная жареная рыба.В четверг вечером я имел честь пригласить @shengaofei (@aofei), автора goproxy.cn, прочитать нас на Go Night для 61-го выпуска «Go Modules, Go Модуль Proxy и технология совместного использования goproxy.cn.
Это ночное чтение и совместное использование @shengaofei - хорошая интерпретация модулей Go, которая ближе к инженерной практике. Я должен надеяться поделиться с вами знаниями об этой части, поэтому сегодня у меня есть эта статья, и в то же время все Вы Также можно уделить больше внимания Go Night Reading. Каждую неделю мы будем делиться техническими темами, связанными с Go, в онлайн-трансляции Zoom. Надеюсь, это будет полезно для всех.
предисловие
Модули, представленные в Go 1.11, открыли новую дверь для разработчиков языка Go.Идеализированное решение для управления зависимостями сделало язык Go движущимся к первой утопии зависимостей (Deptopia) в истории компьютерного программирования. Наряду с модулем существует также протокол прокси модуля, через который мы можем реализовать прокси модуля Go (прокси модуля Go), который зависит от зеркалирования.
Выпуск Go 1.13 привнес множество улучшений в модули, поэтому исправление модулей — это самое большое изменение, которое разработчики могут почувствовать непосредственно в этом выпуске Go 1.13. Проблема в том, что переменная среды GOPROXY в Go 1.13 имеет значение по умолчанию, недоступное в материковом Китае.proxy.golang.org
, после бурного обсуждения в golang/go#31755 (некоторые люди даже подняли его до уровня «свободного мира»), в итоге основная команда Go так и не может предоставить китайским разработчикам официальный модуль, доступный в материковом Китае играет роль.
Чтобы в будущем лучше развивать разработчиков китайского языка Go, Qiniuyun запустила некоммерческий проект.goproxy.cn
, целью которого является предоставление бесплатного, надежного, постоянно доступного модульного прокси-сервера с ускорением CDN для Gophers в Китае и остальном мире. Можно предвидеть, что будущее будет модульным, поэтому чем раньше разработчики языка Go смогут разрезать модули, тем скорее они смогут войти в будущее.
Если Go 1.11 и Go 1.12 не хотели использовать Go 1.11 и Go 1.12 из-за несовершенных модулей, то Go 1.13 можно уверенно использовать. В этом обмене мы обсудим, как использовать модули и модульные агенты, а также подводные камни, которые часто встречаются при их использовании, а также объясним, как быстро создать свой собственный частный модульный агент, и кратко представим Qiniuyun.goproxy.cn
И насколько важно его появление китайским разработчикам языка Go.
содержание
- Введение в модули Go
- Быстрый перенос проектов в модули Go
- Подводные камни, часто встречающиеся при использовании модулей Go
- Шаг 1. Определите, включены ли в проекте модули Go.
- Яма 2: Управление переменными среды Go
- Яма 3: переход с dep, glide и т. д. на модули Go
- Яма 4: Вытягивайте приватные модули
- Яма 5: Обновление существующих модулей
- Яма 6: основной номер версии
- Введение в прокси модуля Go
- Goproxy Китай (goproxy.cn)
Введение в модули Go
Модули Go (ранее vgo) — это команда Go (Расс Кокс).толкатьодин изидеализированныйизпохожий на языкРешение для управления зависимостями,вышло вместе с Go1.11.В Go1.13 было сделано много оптимизаций и доработок,и оно стало неплохим.Если вы хотите использовать модули Go,но остаться в версии 1.11/1.12 , обновление настоятельно рекомендуется.
три ключевых слова
толкать
Во-первых, это не ерунда, потому что модули Go действительно принудительные, а именно:
- До: Всем известно, что существует проект под названием dep before Go modules, который также является официальным экспериментальным проектом Go, и его целью также является устранение недостатков Go в управлении зависимостями. До того, как Расс Кокс предложил модули Go, почти все в сообществе считали, что в будущем dep должен стать официальным решением для управления зависимостями для Go.
- Позже: Никто не ожидал, что Ченг Яоджин убьет на полпути, и Расс Кокс без колебаний запустил модули Go, которые мгновенно вызвали тысячу волн и заставили сообщество поджариться. Все согласились, что команда Go слишком властная и диктаторская, и даже не поздоровались. Помнится, в то время в Интернете было много спорщиков с Рассом Коксом, и выходили высказать свое мнение специалисты по различным решениям для управления зависимостями. области других языков.
идеализированный
Идеально в том смысле, что он предписывает использование семантического управления версиями следующим образом:
- Модули Go настолько безжалостны, что если ваш тег не следует семантическому управлению версиями, он будет игнорировать ваш тег и сгенерирует для вас предполагаемый номер версии семантического управления версиями на основе вашего времени фиксации и значения хэша.
- Модули Go также предполагают по умолчанию, что до тех пор, пока ваш основной номер версии остается прежним, версия модуля не должна содержать критических изменений, потому что это то, что диктует семантическое управление версиями. Разве это не идеально.
Уровень языка класса:
Это ключевое слово на самом деле придумал я. Я просто лично считаю, что модули Go спроектированы как функция на уровне языка. Например, если ваш основной номер версии изменяется, то путь импорта в вашем коде также должен быть следующим за изменением, это считает две версии модуля с разными основными номерами версий двумя совершенно разными модулями. Кроме того, модули Go предназначены для довольно тесной интеграции со всей командой go, вездесущей, поэтому я бы сказал, что это что-то вроде функции на уровне языка, хотя и не слишком строго.
Кто продвигает модули Go?
Итак, кто такой Расс Кокс, упомянутый выше? Многие люди должны его знать. В настоящее время он является человеком с наибольшим количеством представленных кодов в проекте Go, даже более чем в два раза больше, чем второе место.
Расс Кокс по-прежнему является текущим штурвалом Go (вы должны знать, что раньше штурвалом Go был Роб Пайк, но я слышал, что он уехал из США, потому что ему не нравилась администрация Трампа, а потом он довольно стар, поэтому он также постепенно передает власть, но все еще участвует в разработке Go).
Личные способности Расса Кокса довольно сильны, и его взгляд на проблемы также очень уникален, поэтому он может вызвать такой широкий спектр откликов, как только он предлагает концепцию модулей Go. Несмотря на то, что его активно продвигали, также было доказано, что текущие модули Go действительно работают очень хорошо, так что это показывает, что определенная степень «диктатуры» все еще приемлема, по крайней мере, она может гарантировать, что проект может быть более сфокусирован на развивается одно направление.
Короче говоря, модули Go в любом случае теперь являются неотъемлемым компонентом языка Go.
GOPATH
Одна из целей модулей Go — решить проблему GOPATH, что эквивалентно отказу от GOPATH.
Opt-in
Модули Go все еще находятся на стадии Opt-in, то есть если вы хотите их использовать, они вам не нужны, и они вам не нужны. Но вполне вероятно, что в будущем Go2 станет обязательным.
"module" != "package"
Одна вещь, которую нужно исправить, это то, что «модуль» и «пакет», то есть термины «модуль» и «пакет» не эквивалентны, это связь между «коллекцией» и «элементом», «модуль» содержит «пакет»», «пакет» принадлежит «модулю», а «модуль» — это набор из нуля, одного или нескольких «пакетов».
Свойства, связанные с модулями Go
go.mod
module example.com/foobar
go 1.13
require (
example.com/apple v0.1.2
example.com/banana v1.2.3
example.com/banana/v2 v2.3.4
example.com/pineapple v0.0.0-20190924185754-1b0db40df49a
)
exclude example.com/banana v1.2.4
replace example.com/apple v0.1.2 => example.com/rda v0.1.0
replace example.com/banana => example.com/hugebanana
go.mod — самый важный файл, необходимый для проекта с поддержкой модулей Go. Он описывает метаинформацию текущего проекта (то есть текущего модуля). Каждая строка начинается с глагола. В настоящее время существует 5 следующих глаголов:
- модуль: используется для определения пути к модулю текущего проекта.
- go: используется для установки ожидаемой версии Go.
- require: используется для установки конкретной версии модуля.
- exclude: используется для исключения использования определенной версии модуля.
- replace: Используется для замены одной версии модуля другой версией модуля.
Формат заполнения здесь в основном представляет собой путь ссылки на пакет + номер версии, а специальный —go $version
, в настоящее время из кода Go1.13 это только функция идентификации, и временно неизвестно, будет ли она играть большую роль в будущем.
go.sum
go.sum — это файл, похожий на Gopkg.lock, такой как dep. В нем подробно перечислены все версии модулей, прямо или косвенно зависящие от текущего проекта, и записаны хеш-значения SHA-256 этих версий модулей для Go в будущем. .В будущих операциях версии тех модулей, от которых зависит проект, гарантированно не будут изменены.
example.com/apple v0.1.2 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
example.com/apple v0.1.2/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= example.com/banana v1.2.3 h1:qHgHjyoNFV7jgucU8QZUuU4gcdhfs8QW1kw68OD2Lag=
example.com/banana v1.2.3/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= example.com/banana/v2 v2.3.4 h1:zl/OfRA6nftbBK9qTohYBJ5xvw6C/oNKizR7cZGl3cI= example.com/banana/v2 v2.3.4/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q=
...
Мы видим, что путь к модулю может иметь следующие два типа:
example.com/apple v0.1.2 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
example.com/apple v0.1.2/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
Первый упаковывает весь zip-файл пакета модуля для модулей Go, а затем хэширует значение, а второй — хеш-значение для go.mod. Оба они либо существуют одновременно, либо существует только хэш go.mod.
При каких обстоятельствах не будет зип-хэша, то есть когда Go подумает, что некая версия модуля не будет использоваться, он пропустит свой зип-хеш, и зип-хэша не будет, только хэш go.mod Есть ситуация .
GO111MODULE
Эта переменная среды в основном является переключателем модулей Go, который в основном имеет следующие параметры:
-
auto: включить модули Go, только если проект содержит файл go.mod, по-прежнему используется по умолчанию в Go 1.13, см. подробности. : golang.org/issue/31857.
-
on: Brainless включает модули Go, рекомендуемые настройки, значение по умолчанию в будущих версиях, что делает GOPATH делом прошлого.
-
off: отключить модули Go.
GOPROXY
Эта переменная среды в основном используется для установки прокси модуля Go, в основном следующим образом:
-
Его значение представляет собой разделенный запятыми список прокси модуля Go (подробнее об этом позже).
-
Функция: используется, чтобы позволить Go быстро извлекать данные с зеркального сайта без традиционного метода контроля версий при более позднем извлечении версии модуля. Он имеет значение по умолчанию:
https://proxy.golang.org,direct
, но, к сожалениюproxy.golang.org
Недоступно в Китае, поэтому рекомендуется использоватьgoproxy.cn
В качестве альтернативы оператор может быть выполнен:go env -w GOPROXY=https://goproxy.cn,direct
. -
Установите на «выкл»: запрещает Go использовать любой прокси модуля Go в последующих операциях.
-
Чуть выше мы видим, что в списке значений есть «direct», что он делает. На самом деле «прямой» в списке значений — это специальный индикатор, который используется для указания Go вернуться к исходному адресу версии модуля для извлечения (например, GitHub и т. д.), когда предыдущий прокси-модуль Go в список значений возвращает ошибку 404 или 410, Go автоматически пробует следующее в списке, возвращается к источнику, когда встречается «прямое», и завершается с ошибкой типа «недопустимая версия: неизвестная версия ...», когда встречается EOF.
GOSUMDB
Его значение представляет собой базу данных контрольных сумм Go, которая используется для включения Go, чтобы гарантировать, что данные о версии извлеченного модуля не были подделаны при извлечении версии модуля (будь то с исходного сайта или через прокси модуля Go), или это может быть «off» отключает Go от проверки версии модуля в последующих операциях.
-
Формат 1:
<SUMDB_NAME>+<PUBLIC_KEY>
. -
Формат 2:
<SUMDB_NAME>+<PUBLIC_KEY> <SUMDB_URL>
. -
Имеет значения по умолчанию:
sum.golang.org
(Причина отказа от приведенного выше формата заключается в том, что Go специально обрабатывает значения по умолчанию). -
Может быть проксирован прокси модуля Go (см.: Проксирование базы данных контрольной суммы).
-
sum.golang.org
Он недоступен в Китае, поэтому рекомендуется установить GOPROXY наgoproxy.cn
,так какgoproxy.cn
Агент поддержкиsum.golang.org
.
Go Checksum Database
База данных контрольных сумм Go в основном используется для защиты Go от подделки нелегальных версий модуля Go из любого источника.Ее функция (слева) и рабочий механизм (справа) таковы:
Если интересно, можете посмотретьProposal: Secure the Public Go Module Ecosystem, есть подробное введение в механизм его алгоритма, если хотите упростить, см.go help module-auth
Тоже хороший выбор.
GONOPROXY/GONOSUMDB/GOPRIVATE
Эти три переменные среды используются, когда текущий проект зависит от приватных модулей, то есть когда он зависит от прокси-сервера модуля Go, указанного в GOPROXY, или модуля, к которому не может получить доступ база данных контрольных сумм Go, указанная в GOSUMDB.
- Три значения представляют собой префикс пути к модулю, разделенный запятой «,», и правила сопоставления такие же, как и для path.Match.
- Среди них особое значение имеет GOPRIVATE, и его значение будет использоваться как значение по умолчанию для GONOPROXY и GONOSUMDB, поэтому рекомендуется просто использовать GOPRIVATE.
С точки зрения использования, напримерGOPRIVATE=*.corp.example.com
означает, что все пути модулей начинаются сcorp.example.com
доменное имя следующего уровня (например,team1.corp.example.com
) с префиксом версии модуля не будет проходить через прокси модуля Go и базу контрольных сумм Go, следует отметить, что он не включаетcorp.example.com
сам.
Global Caching
Это в основном для описания данных глобального кеша модулей Go, а именно:
- Только одна копия данных той же версии модуля кэшируется и используется всеми другими модулями.
- В настоящее время все данные о версии модуля кэшируются в
$GOPATH/pkg/mod
и$GOPATH/pkg/sum
вниз, в будущем или будет перемещен в$GOCACHE/mod
и$GOCACHE/sum
вниз (возможно, когда$GOPATH
после ликвидации). - можно использовать
go clean -modcache
Очистите все кэшированные данные версии модуля.
Кроме того, после Go1.11 GOCACHE больше нельзя ставить на выключение.Я думаю, это тоже для подготовки к расположению кеша данных модуля, так что все должны как можно скорее внести адаптации.
Быстрый перенос проектов в модули Go
- Шаг 1: Обновите до Go 1.13.
- Шаг 2: Полностью выбросьте GOPATH из головы и шагните в будущее пораньше.
- Измените путь GOBIN (необязательно):
go env -w GOBIN=$HOME/bin
. - Открытые модули Go:
go env -w GO111MODULE=on
. - Настройте GOPROXY:
go env -w GOPROXY=https://goproxy.cn,direct
# требуется в Китае, потому что его значение по умолчанию заблокировано.
- Измените путь GOBIN (необязательно):
- Шаг 3 (необязательно): реорганизуйте все свои проекты в структуру каталогов, которая вам нравится.
- Шаг 4: Выполните в корневом каталоге вашего проекта
go mod init <OPTIONAL_MODULE_PATH>
для создания файла go.mod. - Шаг 5: Найдите способ убедить всех вокруг вас сделать первые четыре шага.
Изменения в поведении go get после миграции
- использовать
go help module-get
иgo help gopath-get
Узнайте о поведении go get при включении и отключении модулей Go. - использовать
go get
вытащить новые зависимости- Вытяните последнюю версию (тег предпочтителен):
go get golang.org/x/text@latest
- Вытащить
master
Последний коммит ветки:go get golang.org/x/text@master
- Вытащите коммит с тегом v0.3.2:
go get golang.org/x/text@v0.3.2
- Вытащите коммит с хешем 342b231, который в конечном итоге будет преобразован в v0.3.2:
go get golang.org/x/text@342b2e
- использовать
go get -u
Обновите существующие зависимости - использовать
go mod download
Загрузите все зависимости, указанные в файле go.mod. - использовать
go mod tidy
Приведите в порядок существующие зависимости - использовать
go mod graph
Просмотр существующей структуры зависимостей - использовать
go mod init
Генерировать файлы go.mod (единственная подкоманда в Go 1.13, которая может генерировать файлы go.mod)
- Вытяните последнюю версию (тег предпочтителен):
- использовать
go mod edit
Отредактируйте файл go.mod - использовать
go mod vendor
Экспорт всех существующих зависимостей (на самом деле модули Go разбавляют концепцию Vendor) - использовать
go mod verify
Проверьте, не был ли изменен модуль
Здесь мы замечаем, что есть два особых момента, а именно:
- Первый пункт: зачем "дергать коммит с хешем 342b231, он в итоге сконвертируется в v0.3.2"? Это связано с тем, что, несмотря на то, что мы настроили получение коммита @342b2e, поскольку модули Go будут сравниваться с тегом, если будет обнаружено, что соответствующий коммит связан с тегом, он будет преобразован.
- Второй момент: почему не рекомендуется использовать
go mod vendor
, т.к. модули Go разбавляют концепцию Vendor, очень вероятно, что Go2 уберут.
Подводные камни, часто встречающиеся при использовании модулей Go
Яма 1: Определите, включены ли в проекте модули Go.
Яма 2: Управление переменными среды Go
В основном это касается того, что Go1.13 добавилgo env -w
используется для записи переменных среды, а место для записиos.UserConfigDir
Возвращаемый путь, следует отметить, чтоgo env -w
не будет перезаписан.
Яма 3: переход с dep, glide и т. д. на модули Go
В основном это относится к переходу со старых инструментов управления пакетами зависимостей (dep/glide и т. д.), из-за ОШИБКИ агент не будет проходить через GOPROXY. Есть два решения:
- Вручную создайте файл go.mod и запустите go mod tidy, чтобы дополнить его.
- На прокси это эквивалентно прекращению использования GOPROXY.
Яма 4: Вытягивайте приватные модули
Вот в основном два пункта знаний, а именно:
- GOPROXY не имеет доступа к чьим-либо приватным модулям, поэтому вы можете быть уверены, что с безопасностью проблем нет.
- Помимо установки адреса прокси-модуля, GOPROXY также необходимо добавить «прямой» специальный идентификатор для успешного извлечения частной библиотеки.
Яма 5: Обновление существующих модулей
Яма 6: основной номер версии
Введение в прокси модуля Go
Роль Go Module Proxy (слева на рисунке) и соответствующий ему процесс взаимодействия протоколов (справа на рисунке) здесь еще раз подчеркнуты.Заинтересованные партнеры могут ознакомиться с ними поближе.
Goproxy Китай (goproxy.cn)
Этот раздел в основном знакомит с практической работой Goproxy и некоторыми вопросами и ответами, а также текущей ситуацией с goproxy.cn, а именно:
Q&A
В: Что, если у китайского языкового сообщества Go нет собственного прокси модуля Go?
**A:** В Go 1.13 две переменные среды GOPROXY и GOSUMDB имеют значения по умолчанию, которые недоступны в Китае, хотя я очень старался на golang.org/issue/31755, это все еще не работает для нас, китайцев. Разработчики Go нашли идеальное решение. Так что отныне все разработчики языка Go в Китае, пока они используют модули Go, должны сначала модифицировать GOPROXY и GOSUMDB, чтобы использовать Go для разработки, иначе они не смогут запускать даже самую простую программу (пока она имеет зависимости от сторонних модулей).
В: Основная причина, по которой я создал Goproxy China (goproxy.cn)?
**A:** На самом деле ранее, то есть в начале этого года, я также пытался попросить команду Go в golang.org/issue/31020 найти способ избежать значения по умолчанию, которое GOPROXY будет иметь в это время. время, и к нему можно нормально получить доступ в Китае, но команда Go, кажется, не в состоянии что-либо сделать, поэтому я твердо верю в создание goproxy.cn. Поскольку другие не могут помочь, то мы должны сделать это сами, ни для чего другого, просто чтобы всем было проще использовать язык Go для разработки модулей Go в будущем.
Сначала я предложил идею своего плана по созданию goproxy.cn с дядей Сюй из Qiniuyun (основатель и генеральный директор Qiniuyun Xu Shiwei), минута размышлений подтвердила мою идею и выразила готовность протолкнуть ее вместе. Это время как раз выпало на то, что я писал дипломную работу, поэтому после того, как проект был разработан, я не стал передавать Qiniuyun, и он продолжал работать на моем личном сервере. Только после атаки на goproxy.cn это стоило мне более ста долларов за один день, и тогда я понял, что такой проект действительно не может быть реализован в одиночку. Ненадежно делать это лично, если слишком много людей полагаются на этот проект и что-то случится с проектом, это принесет ненужные убытки всем. Поэтому я быстро передал Qiniuyun, полностью передал goproxy.cn Qiniuyun и даже передал доменное имя.
текущая ситуация
- Goproxy China (goproxy.cn) на данный момент является самым надежным прокси модуля Go в Китае (на самом деле не хвастается).
- Разработанный специально для китайских разработчиков языка Go, он поддерживает значение по умолчанию прокси-сервера GOSUMDB. Он ускоряется глобальной CDN и обладает высокой доступностью. Его можно применять в сложной среде разработки компании, а также использовать в качестве прокси-сервера восходящего потока.
- Некоммерческий проект с открытым исходным кодом, инфраструктура которого поддерживается Qiniu Cloud, надежным поставщиком облачных услуг в Китае.
- Цель состоит в том, чтобы предоставить бесплатный, надежный, непрерывный онлайн-прокси модуля Go с добавлением CDN для разработчиков языка Go в Китае и во всем мире.
- Доменное имя было зарегистрировано Qiniuyun (Шанхайский ICP № 11037377-56).
состояние
Размер хранилища представленный здесь в основном для кода пакета модуля.Вообще говоря, код не очень большой.0-10МБ и 10-50МБ занимают самый большой заголовок, что понятно, но код пакета модуля больше чем 100МБ для сравнения.
В это время я в основном показываю последние сетевые данные goproxy.cn, Я верю, что будущее будет все выше и выше, чего стоит с нетерпением ждать.
Q&A
Вопрос: Как решить проблему, с которой Go 1.13 столкнулся при извлечении версии модуля из GitLab, когда Go неправильно искал версию целевого модуля по неожиданному пути, что привело к сбою извлечения окончательного целевого модуля?
**A:** Установите с помощью goget в GitLab.<meta>
Есть некоторые проблемы, из-за которых Go 1.13 неправильно определяет конкретный путь к модулю.Это ошибка.Говорят, что она была исправлена в новой версии GitLab.Подробнее см.GitHub.com/golang/go/i…Эта проблема. Тогда для текущего решения, помимо обновления версии GitLab, вы также можете обратиться кGitHub.com/developer - Приходите...этот ответ.
В: Могу ли я одновременно использовать две или более младшие версии (с разными номерами ревизий) одного и того же модуля при использовании модулей Go?
**О:** Нет, модули Go могут зависеть только от двух или более основных версий (с разными номерами основных версий) модуля одновременно. такие, которые могут зависеть отexample.com/foobar@v1.2.3
иexample.com/foobar/v2@v2.3.4
, поскольку их пути к модулям различаются, модули Go указывают, что если основной номер версии не v0 или v1, то основной номер версии должен явно указываться в конце пути к модулю. Однако зависимость от двух и более младших версий одновременно не поддерживается. Например, если модуль A напрямую зависит как от модуля B, так и от модуля C, а модуль A напрямую зависит от версии v1.0.0 модуля C, а затем модуль B напрямую зависит от версии v1.0.1 модуля C, то окончательный Модули Go будут модулями A, использующими версию v1.0.1 модуля C вместо версии v1.0.0, указанной в файле go.mod модуля A.
Это связано с тем, что модули Go считают, что пока номер основной версии остается прежним, остальные можно напрямую обновить, чтобы использовать последнюю версию. Но если будет принят последний результат и проект сломается, то модули Go откатятся к последней старой версии, например, в предыдущем примере он откатится к версии v1.0.0.
В: При каких обстоятельствах данные проверки хэша версии модуля в файле go.sum будут отображаться парами, а при каких обстоятельствах будет только одна строка?
**A:** Обычно данные проверки хэша версии модуля в файле go.sum состоят из двух строк, первая строка — это данные проверки хэша ZIP-файла модуля, а последняя строка — это хэш. проверить данные модуля Hash проверить данные файла go.mod. Однако в некоторых случаях отображается только одна строка данных проверки хэша файла go.mod модуля без данных проверки хэша самого ZIP-файла модуля.Это происходит, когда модули Go определяют, что ваш текущий проект полностью завершен. не используется, ZIP-файл модуля вообще не будет скачиваться, поэтому для него не нужно делать гарантию проверки хэша, необходимо только сделать гарантию проверки хэша для файла go.mod модуля , потому что go.Файл мода полезен при более глубоком копании зависимостей проекта.
Q: Можете ли вы более подробно объяснить поведение и использование глагола replace в файле go.mod?
**A:** Цель замены глагола состоит в том, чтобы заменить одну «версию модуля» другой «версией модуля», которая является заменой между «версией модуля» и «путем модуля», «=> Содержимое перед идентификатор — это «путь к модулю» «версии модуля», которую нужно заменить, а содержимое — это расположение целевой «версии модуля», которую нужно заменить, то есть путь. Этот путь может быть относительным путем локальный диск или Это может быть абсолютный путь локального диска или сетевой путь, но этот целевой путь не будет отображаться как ваш «путь импорта» в коде вашего проекта в будущем, а «путь импорта» в коде по-прежнему будет иметь префикс «путь модуля» целевой «версии модуля», на которую вы заменили.
Также обратите внимание, что модули Go не поддерживают запись относительных путей в «путь импорта». Например, если проект A зависит от модуля B, «путь к модулю» модуля B равенexample.com/b
, то путь к диску, где он находится~/b
, в файле go.mod в проекте А у вас есть строчкаreplace example.com/b=>~/b
, то "импортировать дорожную базу" в коде проекта А будетimport"example.com/b"
, вместоimport"~/b"
, остальная работа выполняется автоматически модулями Go.
Затем я также упомянул в совместном использовании, что два глагола исключить и заменить действуют только на текущий основной модуль, то есть на текущий проект.Если версия модуля, который вы хотите заменить, появляется в других версиях модуля, от которых он зависит, перейдите модули по-прежнему будут извлекать вашу версию модуля для замены на версию модуля, от которого вы зависите.
Например, если проект A напрямую зависит от модуля B и модуля C, а затем модуль B также напрямую зависит от модуля C, то ваш файл go.mod в проекте Areplace c=>~/some/path/c
Влияет ли это только на код, написанный в проекте A, а модуль B использует c перед его заменой, а не на то, на что вы его заменили?~/some/path/c
это.
Суммировать
После выпуска Go1.13 все больше и больше людей контактировали с модулями Go и прокси модуля Go. Я часто видел, как различные мелкие партнеры консультировались в различных группах, в том числе я вносил несколько «ям», поэтому я думаю, что технический обмен Aofei « Go Modules, Go Module Proxy и goproxy.cn" очень практичны. Если у вас есть какие-либо предложения или вопросы в будущем, пожалуйста, не стесняйтесь обсуждать.
Наконец, спасибо людям, стоящим за goproxy.cn (@七牛云 и @shengaofei) за их бескорыстный вклад и преданность сообществу китайского языка го.