Рубрики
Uncategorized

Перейти к модулям и proxy.cn

Автор оригинала: David Wong.

Всем привет. Я обычная жареная рыба. Мне очень повезло пригласить @ afei (@ afei), автора goproxy.cn, чтобы прочитать нам 61-й выпуск модулей go, прокси-сервер модуля go и goproxy.cn в четверг вечером.

Совместное использование ночного чтения @ Shen gao fei-это хорошая интерпретация модулей go, которая ближе к инженерной практике. Я, конечно, надеюсь поделиться с вами большей частью этих знаний. Поэтому с сегодняшней статьей вы также можете уделить больше внимания ночному чтению go. Каждую неделю вы будете делиться техническими темами, связанными с онлайн-трансляцией zoom, в надежде помочь вам.

Исходный адрес: модули go и goproxy.cn

Предисловие

Модули, представленные go 1.11, открывают новые возможности для разработчиков языка go. Идеализированное решение для управления зависимостями заставляет язык go двигаться к первой утопии зависимостей в истории компьютерного программирования. С внедрением модулей появился также протокол прокси-сервера модуля, с помощью которого мы можем реализовать прокси-сервер модуля go, то есть полагаться на изображение.

Выпуск go 1.13 внес в модуль множество улучшений, поэтому исправление модуля-это самое большое изменение, которое разработчики могут непосредственно ощутить в выпуске go 1.13. Проблема в том, что переменная среды goproxy в go 1.13 имеет значение по умолчанию, недоступное в материковом Китае прокси. golang .org , после ожесточенной дискуссии в golang/goා (некоторые люди даже подняли свои слова до уровня “свободного мира”), основная команда go все еще не может предоставить официального агента модуля для китайских разработчиков, чтобы посетить материковый Китай.

Чтобы в будущем лучше развивать разработчиков языка go в Китае, qiniu cloud запустила некоммерческий проект goproxy.cn Его цель состоит в том, чтобы предоставить сусликам в Китае и других частях мира бесплатный, надежный, онлайн-агент и ускоренный модуль CDN. Можно предсказать, что будущее принадлежит модульности, поэтому чем раньше разработчики языка go смогут разрезать модули, тем скорее они смогут войти в будущее.

Если вы не хотите вмешиваться из-за несовершенства модулей в go 1.11 и go 1.12, то вы можете с уверенностью начать использовать go 1.13. В этом разделе будет рассказано о том, как использовать модули и агенты модулей, а также о недостатках, с которыми они часто сталкиваются при их использовании, а также объяснено, как быстро создавать собственные частные агенты модулей, и кратко представлено облако seven bull goproxy.cn И что важно для разработчиков китайского языка go.

Каталог

  • Введение в модули go
  • Быстрая миграция модулей проекта для перехода
  • Яма, часто встречающаяся при использовании модулей go

    • Pit 1: оцените, включены ли в проекте модули go
    • Шаг 2: управление переменными среды для go
    • Яма 3: переход от модулей DEP, glide и т. Д. К модулям go
    • Яма 4: вытащите частный модуль
    • Pit 5: обновление существующего модуля
    • Pit 6: основной номер версии
  • Введение в прокси-сервер модуля go
  • Go прокси Китай (прокси. CN)

Введение в модули go

Модули Go (ранее VGO) – это команда go (Расс Кокс) Сильный толчок Один Идеализация Решение Уровня языка класса Управления зависимостями, выпущенное вместе с go1.11, внесло много оптимизаций и корректировок в go1.13, и теперь оно стало довольно хорошим. Если вы хотите использовать модули go, но все еще остаетесь в версии 1.11/1.12, настоятельно рекомендуется выполнить обновление.

Три ключевых слова

Сильный толчок

Прежде всего, это не ерунда, потому что модули go действительно вытесняются, как показано ниже:

  • До: мы все знаем, что существует также проект под названием dep before go modules, который также является официальным экспериментальным проектом go, и его целью также является решение проблемы управления зависимостями go. До того, как Расс Кокс предложил модули go, почти все в сообществе думали, что deep является официальным решением для управления зависимостями go в будущем.
  • Позже: никто не ожидал, что убьет Чен Яоцзиня на полпути. Расс Кокс без колебаний запустил модули go, что мгновенно заставило камень поднять тысячу волн и позволить сообществу поджарить котел. Мы все согласились, что команда go была настолько властной и деспотичной, что мы даже не поздоровались. Я помню, что в Интернете было много людей, которые боролись с Рассом Коксом, и различные эксперты, полагающиеся на управленческие решения, вышли, чтобы выразить свое мнение. Сфера обсуждения даже вышла за рамки языка go на другие языки.

Идеализация

Он идеально подходит для обеспечения семантического контроля версий, как показано ниже:

  • Модули Go настолько сложны, что если ваш тег не соответствует семантическому управлению версиями, он проигнорирует ваш тег, а затем сгенерирует предполагаемый номер версии, соответствующий семантическому управлению версиями, в соответствии с вашим временем фиксации и значением хэша.
  • Go modules также по умолчанию считает, что до тех пор, пока ваш основной номер версии остается прежним, версия модуля, безусловно, не содержит критических изменений, поскольку семантический контроль версий регулируется таким образом. Это идеальный вариант.

Уровень языка в классе:

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

Кто толкает модули go

Итак, кто такой Расс Кокс, упомянутый выше? Многие люди должны его знать. Он является человеком, у которого в настоящее время больше всего отправлений кода в проекте go, даже более чем в два раза больше, чем на втором месте.

Расс Кокс также является нынешним лидером go (вы должны знать, что бывшим лидером go был Роб Пайк, но я слышал, что он покинул Соединенные Штаты, потому что ему не нравилось управление Трампом, а тогда он был довольно старым, поэтому он постепенно передавал власть, но сейчас он все еще участвует в развитии go).

Личные способности Расса Кокса довольно сильны, и его точка зрения очень уникальна. Вот почему он только что предложил концепцию модулей go, которая может вызвать такой широкий спектр откликов. Хотя это вынужденно, этот факт также доказывает, что текущие модули go действительно превосходны, поэтому он показывает, что в какой-то степени “диктатура” приемлема, по крайней мере, для обеспечения того, чтобы проект мог развиваться более конкретно в одном направлении.

В целом, модули go теперь являются неотъемлемой частью языка go.

ГОПАТ

Одной из целей модулей go является решение проблемы gopath, что эквивалентно отказу от gopath.

Регистрация

Модули Go все еще находятся на стадии регистрации, что означает, что вы можете использовать их, если хотите, использовать, если они вам не нужны, и не заставляйте вас. Но в будущем GO2, вероятно, будет вынужден использовать.

“модуль”

Необходимо исправить одну вещь: термины “модуль” и “пакет”, то есть “модуль” и “пакет” не эквивалентны. Они представляют собой взаимосвязь между “набором” и “элементом”. “Модуль” содержит “пакет”. “Пакет” принадлежит “модулю”. “Модуль” – это набор из нуля, одного или нескольких “пакетов”.

Свойства, связанные с модулями Go

Свойства, связанные с модулями Go

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. В нем описывается метаинформация текущего проекта (то есть текущего модуля). Каждая строка начинается с глагола. В настоящее время существует пять глаголов:

  • Модуль: используется для определения пути к модулю текущего проекта.
  • Go: используется для установки ожидаемой версии go.
  • Требуется: используется для установки определенной версии модуля.
  • Исключить: используется для исключения из использования определенной версии модуля.
  • Замена: используется для замены одной версии модуля на другую.

Формат заполнения здесь в основном представляет собой путь к ссылке на пакет + номер версии. Кроме того, это совершенно особенная версия go $ В настоящее время, из кода go1.13, это только функция знака, и неизвестно, будет ли она играть большую роль в будущем.

Формат заполнения здесь в основном представляет собой путь к ссылке на пакет + номер версии. Кроме того, это совершенно особенная || версия go $|| В настоящее время, из кода go1.13, это только функция знака, и неизвестно, будет ли она играть большую роль в будущем.

Go.sum-это своего рода файл, похожий на gopkg.блокировка 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.mod. Либо они существуют одновременно, либо существуют только в хэше go.mode.

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

GO111МОДУЛЬ

Эта переменная среды в основном является переключателем модулей go, в основном включающим следующие параметры:

  • Авто: включение модулей go только в том случае, если проект содержит файл go.mod. Это по-прежнему значение по умолчанию в go 1.13. Смотрите подробности :golang.org/issue/31857。
  • Вкл.: включить модули go без мозга, рекомендуемые настройки, значения по умолчанию в будущих версиях, создание истории gopath.
  • Выкл.: отключите модули go.

ГОПРОКСИ

Эта переменная среды в основном используется для настройки прокси-сервера модуля go следующим образом:

  • Его значение-разделенный запятыми список прокси-серверов модуля go (будет объяснено позже).

    • Функция: он используется для быстрого извлечения версии модуля go с зеркального сайта, что отличается от традиционного режима VCs. Он имеет значение по умолчанию: https://proxy.golang.org,прямая Но жаль proxy.golang.org Он недоступен в Китае, поэтому рекомендуется использовать goproxy.cn Вместо этого выполните инструкцию: go env -w://goproxy.cn,прямой
    • Установите значение “выкл.”: запретить go использовать любой прокси-сервер модуля go в последующих операциях.

Чуть выше мы видим, что в списке значений есть “прямой”. Что в этом толку? Фактически, “прямой” в списке значений-это специальный индикатор, который используется для указания того, что go возвращается к исходному адресу версии модуля для извлечения (например, GitHub и т. Д.). Когда предыдущий прокси-сервер модуля go в списке значений возвращает 404 или 410 ошибок, go автоматически попробует следующий в списке, вернется к источнику, когда он встретит “прямой”, завершится, когда он встретит EOF и выдаст ошибку “недопустимая версия: неизвестно” в редакции.

GOSUMDB

Его значение-база данных проверки go, которая используется для обеспечения того, чтобы данные о версии извлеченного модуля не были изменены, когда go извлекает версию модуля (будь то с исходной станции или через прокси-сервер модуля go), или она может быть “выключена”, что означает, что go запрещено проверять версию модуля в последующих операциях

  • Формат 1: <ИМЯ БАЗЫ ДАННЫХ SUM>+<ОТКРЫТЫЙ КЛЮЧ>
  • Формат 2: <ИМЯ БАЗЫ ДАННЫХ SUM>+<ОТКРЫТЫЙ КЛЮЧ> <ИМЯ БАЗЫ ДАННЫХ SUM>
  • Имеют значение по умолчанию: sum.golang.org (причина, по которой вышеуказанный формат не соблюдается, заключается в том, что значение по умолчанию специально обрабатывается go.).
  • Это может быть прокси-сервер с помощью прокси-сервера модуля go (подробнее см. прокси-сервер базы данных контрольной суммы).
  • sum.golang.org Он недоступен в Китае, поэтому рекомендуется установить прокси в proxy.cn Потому что goproxy.cn Агент поддержки sum.golang.org

Перейти К Базе Данных Контрольных Сумм

База данных go check в основном используется для защиты go от любого источника к измененной версии незаконного модуля go. Его функция (слева) и рабочий механизм (справа) заключаются в следующем:

Если вам интересно, вы можете ознакомиться с предложением: защитите экосистему общедоступного модуля go, в которой подробно описан механизм его алгоритма. Если вы хотите быть простым, проверьте перейдите в справочный модуль-auth Это также хороший выбор.

ПЕРЕЙТИ БЕЗ ПРОКСИ/GONOSUMDB/ПЕРЕЙТИ НА ЧАСТНУЮ

Эти три переменные среды используются в сценарии, в котором текущий проект зависит от частного модуля, то есть прокси-сервера модуля go, указанного goproxy, или модуля, недоступного для базы данных контрольных сумм go, указанной gosumdb

  • Три значения представляют собой префикс пути к модулю, разделенный запятой”,”, и правило сопоставления совпадает с path.match.
  • Go private является особенным, и его значение будет значением по умолчанию для go no proxy и gonosumdb, поэтому рекомендуется использовать только goprivate.

С точки зрения использования, например GOPRIVATE=*.corp.example.com Указывает все пути модуля к corp.example.com Доменное имя следующего уровня (например, team1.corp.example.com )Версии модулей с префиксами не будут проходить через прокси-сервер модуля go и проверять базу данных go. Пожалуйста, обратите внимание, что они не включают corp.example.com Сам.

Глобальное Кэширование

Это в основном для описания данных глобального кэша модулей go, как показано ниже:

  • Кэшируется только одна копия данных одной и той же версии модуля, а все остальные модули являются общими.
  • В настоящее время данные всех версий модулей существуют медленно $GOPATH/pkg/mod Sum $GOPATH/pkg/sum Далее, в будущем или перейдут в $GOCACHE/mod и $GOCACHE/sum Далее (может быть, когда $GOPATH После устранения).
  • есть доступ к go clean -mod cache Очистите все кэшированные данные версии модуля.

Кроме того, после go1.11 GOCACHE не разрешается устанавливать в положение off. Я думаю, что это также для подготовки к мобильному размещению кэша данных модуля, поэтому вам следует выполнить адаптацию как можно скорее.

Быстрая миграция модулей проекта для перехода

  • Шаг 1: обновитесь до версии 1.13.
  • Шаг 2: позвольте гопату полностью исчезнуть из вашего разума и шагните в будущее раньше.

    • Измените путь Gobin (необязательно): go env -w GOBIN=$HOME/bin
    • Откройте модули go: go env -w
    • Установите прокси-сервер: go env -w://goproxy.cn,прямой #Это необходимо в Китае, потому что его значение по умолчанию устанавливается стеной.
  • Шаг 3 (необязательно): реорганизуйте все свои проекты в соответствии с вашей любимой структурой каталогов.
  • Шаг 4: выполните в корневом каталоге вашего проекта go mod init Для создания файла go.mod.
  • Шаг 5: найдите способ убедить всех вокруг вас сделать первые четыре шага.

Изменение поведения go get после миграции

  • используйте go help module-get и go help gopath-get Чтобы понять поведение go get, когда модули go включены или нет
  • используйте go get Извлеките новые зависимости

    • Вытащите последнюю версию (предпочтительнее тег): go get golang.org/x/ [электронная почта защищена]
    • Вытащите мастер Последний коммит для ветки: идите и получите golang.org/x/ [электронная почта защищена]
    • Вытащите фиксацию с тегом v0.3.2: go get golang.org/x/ [электронная почта защищена]
    • Извлеките коммит, хэш которого равен 342b231, и он будет преобразован в v0.3.2 наконец: go get golang.org/x/ [электронная почта защищена]
    • используйте go get -u Обновите существующие зависимости
    • используйте скачать мод go Загрузите все зависимости, указанные в файле go.mod
    • используйте go mod аккуратно Организуйте существующие зависимости
    • используйте перейдите на график модов Просмотрите существующие структуры зависимостей
    • используйте go mod для инициализации Создания файла go.mod (единственная подкоманда в go 1.13, которая может генерировать файл go.mod)
  • используйте go mod редактировать Редактировать файл go.mod
  • используйте поставщик модов go Экспортируйте все существующие зависимости (на самом деле модули go преуменьшают концепцию поставщика)
  • используйте перейдите в режим проверки Проверьте, не был ли изменен модуль

Здесь мы замечаем, что есть два особых момента:

  • Во-первых, почему “извлеките коммит, хэш которого равен 342b231, и он, наконец, будет преобразован в v0.3.2”. Это связано с тем, что мы установили фиксацию pull @ 342b2e, но модули go будут сравниваться с тегами. Если будет обнаружено, что соответствующая фиксация связана с тегом, преобразование будет выполнено.
  • Во-вторых, почему бы не рекомендовать go mod vendor , поскольку модули go размывают концепцию поставщика, вполне вероятно, что G2 будет удален.

Яма, часто встречающаяся при использовании модулей go

Pit 1: оцените, включены ли в проекте модули go

Шаг 2: управление переменными среды для go

В основном речь идет о добавлении go1.13 go env-w , используемого для записи переменных среды, где os.UserConfigDir Возвращаемый путь следует отметить go env -w Никакой перезаписи.

Яма 3: переход от модулей DEP, glide и т. Д. К модулям go

В основном это относится к миграции со старых инструментов управления пакетами зависимостей (DEEP/glide и т. Д.), Из-за ошибки это приведет к прокси-серверу без goproxy. Есть два решения:

  • Вручную создайте файл go.mod, а затем выполните команду go mod tidy для дополнения.
  • На агенте это равносильно отказу от использования прокси-сервера.

Яма 4: вытащите частный модуль

Здесь я хочу осветить два момента знаний, а именно::

  • Прокси-сервер не имеет доступа к чьим-либо личным модулям, поэтому вы можете быть уверены, что безопасность в порядке.
  • В дополнение к настройке адреса агента модуля, прокси-серверу необходимо добавить специальный идентификатор “direct”, чтобы успешно получить доступ к частной библиотеке.

Pit 5: обновление существующего модуля

Pit 6: основной номер версии

Введение в прокси-сервер модуля go

Здесь я снова подчеркиваю функцию прокси-сервера модуля go (слева) и соответствующий процесс взаимодействия с протоколом (справа). Заинтересованные партнеры могут внимательно ознакомиться с ним.

Go прокси Китай (прокси. CN)

В этой части в основном рассказывается о практической работе goproxy, некоторых вопросах и ответах и недавней ситуации с goproxy.cn, следующим образом:

Вопросы и ответы

Вопрос: Что делать, если в китайском языковом сообществе go нет нашего собственного прокси-сервера модуля go?

A: В go 1.13 две переменные среды, goproxy и gosumdb, имеют значения по умолчанию, которые недоступны в Китае. Хотя я очень старался в golang.org/issue/31755, Я все еще не мог найти идеальное решение для наших разработчиков китайского языка go. Поэтому отныне все разработчики языка go в Китае, пока они используют модули go, должны модифицировать goproxy и gosumdb, прежде чем они смогут нормально использовать go для разработки, иначе они могут не запустить даже самую простую программу (пока это зависит от сторонних модулей).

Вопрос: Зачем я создал прокси-сервер в Китае?

Ответ: На самом деле, в начале этого года, в начале этого года, я также пытался попросить команду go войти golang.org/issue/31020 чтобы найти способ избежать того, чтобы значение по умолчанию, которое будет иметь goproxy в то время, было доступно в обычном режиме в Китае, но команда go, похоже, ничего не может с этим поделать, поэтому я твердо верил в создание goproxy.cn. Поскольку другие люди не могут нам помочь, мы должны делать это сами, ни для чего другого, просто чтобы все были более счастливы использовать язык go с хорошими модулями для разработки в будущем.

Сначала я предложил свою идею создания proxy.cn с Сюйшивеем, основателем и генеральным директором qiniu cloud. Это было сделано для того, чтобы попытаться, но я не ожидал, что Сюй Шу признал мою идею и выразил готовность продвигать ее вместе без более чем минутного размышления. В то время я как раз успел написать дипломную работу, поэтому после завершения разработки проекта я не передал ее в qiniu cloud, а работал на своем личном сервере. Так было до тех пор, пока на меня не напали goproxy.cn и потратил более 100 долларов во второй половине дня, чтобы я понял, что такого рода проект не может быть выполнен самостоятельно. Это ненадежно для отдельных людей. Если будет больше людей, которые зависят от этого проекта, и что-то случится с проектом, это приведет к ненужным потерям для всех. Поэтому я быстро передал goproxy.cn в облако qiniu и даже перенес доменное имя.

Последние события

  • Go прокси Китай (прокси. CN) является самым надежным прокси-сервером модуля go в Китае.
  • Он настроен для разработчиков китайского языка go и поддерживает значение по умолчанию proxy gosumdb. После глобального ускорения CDN он стал высокодоступным и может быть применен в сложной среде разработки компании или в качестве вышестоящего агента.
  • Некоммерческий проект с открытым исходным кодом, поддерживаемый инфраструктурой, предоставляемой надежным поставщиком облачных услуг Китая qiniu cloud.
  • Цель состоит в том, чтобы предоставить бесплатный, надежный, онлайн и CDN добавленный прокси-сервер модуля go для разработчиков языков go в Китае и во всем мире.
  • Доменное имя было подано qiniuyun (hcpb11037377-56).

Ситуация

Вот размер хранилища, в основном для кода пакета модуля. Вообще говоря, код не слишком большой. 0-10 Мб, 10-50 МБ приходится на большую часть, которую можно понять. Однако код пакета модуля размером более 100 МБ преувеличен.

В настоящее время он в основном показывает последние сетевые данные proxy.cn. Я верю, что в будущем она будет становиться все выше и выше, чего стоит с нетерпением ждать.

Вопросы и ответы

Вопрос: Как решить проблему, из-за которой go 1.13 по ошибке нашел версию целевого модуля по пути с неожиданным значением при извлечении версии модуля из gitlab, что привело к сбою при извлечении конечного целевого модуля?

A: Набор в gitlab с помощью goget Есть некоторые проблемы, приводящие к тому, что go 1.13 ошибочно определяет конкретный путь модуля. Это ошибка. Говорят, что это было исправлено в новой версии gitlab. Для получения более подробной информации см. https://github.com/golang/go/… Этот вопрос. Затем для текущего решения, в дополнение к обновлению версии gitlab, вы можете обратиться к https://github.com/developer -… За ответ.

Вопрос: Могу ли я полагаться на две или более уменьшенные версии (разные номера версий) одного и того же модуля одновременно при использовании модулей go?

A: Нет, модули go могут полагаться только на две или более основных версий модуля одновременно (основной номер версии отличается). Например, мы можем положиться на это одновременно example.com/ [электронная почта защищена] и example.com/foobar/ [email protected] |/Поскольку пути к их модулям разные, когда go modules указывает, что основной номер версии не V0 или V1, основной номер версии должен явно отображаться в конце пути к модулю. Однако не поддерживается одновременная работа с двумя или более уменьшенными версиями. Например, если модуль a напрямую зависит от модуля B и модуля C одновременно, и модуль a напрямую зависит от v1.0.0 модуля C, а затем модуль B напрямую зависит от v1.0.1 модуля C, то, наконец, модули go выберут v1.0.1 модуля C для модуля a вместо v1.0.0, указанного в файле go.mod модуля a.

Это связано с тем, что go modules считает, что до тех пор, пока основной номер версии остается прежним, остальные могут быть обновлены до последней версии. Но если будет принят последний результат и проект выйдет из строя, то модули go вернутся к предыдущей старой версии. Например, в предыдущем примере он вернется к версии v1.0.0.

Вопрос: В файле go.sum, когда данные проверки хэша версии модуля будут отображаться попарно и только в одной строке?

A: Как правило, в версии модуля в файле go.sum есть две строки данных проверки хэша. Первая строка-это данные проверки хэша в zip-файле модуля, а вторая строка-данные проверки хэша в файле go.mod модуля. Однако в некоторых случаях в файле go.mod модуля будет только одна строка данных проверки хэша, но не данные проверки хэша самого zip-файла модуля. Это происходит, когда модули go решают, что модуль не используется вашим текущим проектом и вообще не загружает zip-файл модуля, поэтому нет необходимости хэшировать его Для гарантии проверки, требуется только гарантия проверки хэша для файла go.mod модуля, потому что файл go.mod необходим для глубокого анализа зависимостей проекта.

Вопрос: Можете ли вы более подробно объяснить поведение и использование файла replace verbingo.mod?

A: Функция этого глагола замены состоит в замене одной “версии модуля” на другую “версию модуля”. Это путь “версия модуля” и “версия модуля”). Перед идентификатором “= > ” находится “путь к модулю” “версии модуля”, подлежащей замене. После этого указывается местоположение целевой” версии модуля”, подлежащей замене, то есть путь. Этот путь может быть относительным путем к локальному диску, абсолютным путем к локальному диску или сетевым путем, но в будущем целевой путь не будет отображаться в качестве “пути импорта” в коде проекта. “Путь импорта” в коде будет иметь префикс “путь к модулю” целевой “версии модуля”, которую вы заменили.

Кроме того, следует отметить, что модули go не поддерживают запись относительных путей в “путь импорта”. Например, если проект a опирается на модуль B, например, “путь к модулю” модуля B равен example.com/b , а затем он находится на пути к диску ~/b У вас есть строка в файле go.mod в проекте a заменить example.com/b=>~/b , а затем “импорт грунта” в коде в проекте a-это импорт"example.com/b" Вместо импорта"~/b" остальная часть работы выполняется автоматически модулями go.

Затем я также упомянул в разделе, что глаголы “исключить” и “заменить” работают только в текущем основном модуле, то есть в текущем проекте. Если версия модуля, которую вы хотите заменить, появится в других версиях модулей, от которых она зависит, модули go вытянут версию модуля, которую вы хотите заменить, для версии модуля, от которой вы зависите.

Например, например, проект a напрямую зависит от модуля B и модуля C, а затем модуль B также напрямую зависит от модуля C, поэтому вы можете использовать заменить c=>~/некоторый/путь/c Это влияет только на код, написанный в проекте a, но модуль B использует C перед заменой, который не заменяется вами ~/некоторым/путем/c Этот.

резюме

После выпуска go 1.13 все больше и больше людей вступали в контакт с модулями go и прокси-сервером go module. Они часто видели, как различные мелкие партнеры консультировались в различных группах, включая меня, который также внес свой вклад в несколько “ям”. Поэтому я думаю, что совместное использование технологий модулей go, прокси-сервера модулей go и proxy.cn по аофэю имеет большое практическое значение. Если у вас есть какие-либо дополнительные предложения или вопросы, пожалуйста, не стесняйтесь их обсуждать.

Наконец, я хотел бы поблагодарить людей, стоящих за proxy.cn (@ qiniuyun и @ shen gao fei) за их бескорыстный вклад и преданность языковому сообществу го в Китае.

Мой официальный аккаунт

Дальнейшее чтение

  • ночное чтение-вперед/выпуски/468
  • Станция B: [ночное чтение go] выпуск 61 модули go, прокси-сервер модуля go и proxy.cn
  • YouTube: [ночное чтение go] выпуск 61 модули go, прокси-сервер модуля go и proxy.cn