Как я могу вручную получить зависимости от go.mod? - PullRequest
0 голосов
/ 11 сентября 2018

Я использую Go 1.11 с поддержкой модулей.Я понимаю, что инструмент go теперь устанавливает зависимости автоматически при сборке / установке.Я также понимаю причину.

Я использую Docker для сборки своих двоичных файлов.Во многих других экосистемах обычно копируют манифест зависимостей (package.json, needs.txt и т. Д.) И устанавливают зависимости отдельно от этапа сборки.Это использует преимущества кэширования слоев докера и значительно ускоряет перестройку, поскольку в общем случае код значительно превосходит количество изменений зависимостей.

Мне было интересно, есть ли у vgo какой-либо способ сделать это?

Ответы [ 3 ]

0 голосов
/ 11 сентября 2018

Вы можете использовать команду go mod vendor, которая создаст папку vendor в корневой папке основного модуля и скопирует в нее все зависимости. После этого вы можете передать параметр -mod=vendor в инструмент go, а затем зависимости из папки vendor будут использованы для сборки / компиляции / тестирования вашего приложения.

Итак, что вы можете сделать, чтобы ускорить ваши сборки:

  1. Запустите команду go mod vendor, чтобы получить актуальную версию ваших зависимостей.
  2. Сохранить / кэшировать эту папку vendor.
  3. Во время сборки восстановите эту папку vendor и соберите / установите приложение, передав аргумент -mod=vendor инструменту go, чтобы не загружались зависимости, но будет использоваться содержимое папки vendor .

Цитата из go help mod:

Модули и вендинг

При использовании модулей команда go полностью игнорирует каталоги поставщиков.

По умолчанию команда go удовлетворяет зависимости, загружая модули из их источников и с использованием этих загруженных копий (после проверки, как описано в предыдущем разделе). Разрешить взаимодействие со старшими версии Go, или чтобы гарантировать, что все файлы, используемые для сборки, сохранены вместе в одном файловом дереве 'go mod vendor' создает каталог с именем поставщика в корневой каталог основного модуля и хранит там все пакеты из модулей зависимостей, которые необходимы для поддержки сборок и тесты пакетов в основном модуле.

Чтобы построить с использованием каталога поставщика верхнего уровня основного модуля, чтобы удовлетворить зависимости (отключение использования обычных сетевых источников и локальных кэши), используйте 'go build -mod = vendor'. Обратите внимание, что только основной модуль используется каталог поставщиков верхнего уровня; каталоги поставщиков в других местах все еще игнорируются.

0 голосов
/ 20 июня 2019

Это была проблема # 26610 , которая исправлена.

Так что теперь вы можете просто использовать:

go mod download

Чтобы это работало, вам нужны только файлы go.mod / go.sum.

Например, вот как сделать кэшированную многоступенчатую сборку Docker:

FROM golang:1.12-alpine as builder
RUN apk --no-cache add ca-certificates git
WORKDIR /build/myapp

# Fetch dependencies
COPY go.mod ./
RUN go mod download

# Build
COPY . ./
RUN CGO_ENABLED=0 go build

# Create final image
FROM alpine
WORKDIR /root
COPY --from=builder /build/myapp/myapp .
EXPOSE 8080
CMD ["./myapp"]
0 голосов
/ 11 сентября 2018

Вы можете использовать менеджер пакетов, таких как dep , glide и govendor . dep новее и собирается быть интегрированным в набор инструментов go как официальный инструмент управления зависимостями.

Мы также создаем образы докеров для приложений go, и мы используем dind для создания этих образов, и мы подготовили образ CI / CD со всеми предустановленными зависимостями, чтобы ускорить сборку. Тем не менее, чтобы склеить все вместе, потребовалось немного сценариев.

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

...