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

Go

ранее представленныйКак упаковать в онлайн-среде, это может решить проблему, но поскольку пакет зависимостей загружается через прокси, процесс упаковки идет медленно, и я чувствую, что запуск проекта занимает 2 минуты. И тут есть серьезная проблема, то есть раз загрузка не удалась, упаковка не получается, и надо пробовать снова. Этот опыт очень плохой. Что касается упаковки модулей Go, я чувствую, что дальнейшее направление развития остается таким же, как и у Java.Вы должны завершить свой собственный частный сервер, чтобы упаковка была быстрой и безопасной. Упаковываем и скачиваем с приватного сервера, если приватный сервер кеширует текущую версию пакета, то он вернется напрямую, иначе приватный сервер скачает соответствующую версию кода.

Установка частного сервера

Сначала вам нужно установить GO1.11.

я используюAthens, Афина.

Сначала загрузите код:

git clone https://github.com/gomods/athens
cd athens

Даже если вы используете частные серверы, вам все равно придется настроить прокси:

export HTTP_PROXY=10.244.255.3:7766
export HTTPS_PROXY=10.244.255.3:7766

Скомпилируйте и установите бинарники:

go install

запускать

Потому что это черезgo installустановлен, поэтому он будет установлен на$GOBIN, он будет глобальным и может вызываться напрямую.

./proxy

Но это слишком элементарно, я используюSupervisorЧтобы быть демоном процесса, файл конфигурации выглядит следующим образом:

[program:proxy]
command=/path/to/proxy -config_file=/path/to/github.com/gomods/athens/config.dev.toml
environment=HTTP_PROXY="10.244.255.3:7766",HTTPS_PROXY="10.244.255.3:7766"
stdout_logfile=/tmp/proxy.log
stderr_logfile=/tmp/proxy.log
autostart=true
autorestart=true
startsecs=5
priority=1
stopasgroup=true
illasgroup=true

сценарий упаковки

Раньше это был четырехстрочный скрипт, на этот раз он стал двухстрочным:

export GO111MODULE=on
export GOPROXY=http://127.0.0.1:3000

После упаковки начала, PW log, чтобы увидеть такой лог:

handler: GET /github.com/spf13/afero/@v/v1.1.1.zip [200]

И журнал упаковки выглядит так:

go: downloading github.com/spf13/pflag v1.0.2

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

go: gopkg.in/tomb.v1@v1.0.0-20141024135613-dd632973f1e7: unexpected status (http://10.244.255.3:7766/gopkg.in/tomb.v1/@v/v1.0.0-20141024135613-dd632973f1e7.info): 500 Internal Server Error

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

{
	"Version": "v1.0.0-20141024135613-dd632973f1e7",
	"Time": "2014-10-24T13:56:13Z"
}

GOPROXY

На самом деле, самое главное, это вышеGOPROXY, что является официальной настройкой прокси-сервера Go, иHTTP_PROXYО разные.

можно использовать командуgo help goproxyПодробнее см. такжездесь.

Модуль Go поддерживает загрузку через прокси, если переменная окруженияGOPROXYустановлен, все пакеты будут загружаться с этого прокси.

Действуя ACTING METHION MESSHORE Время на основе HTTP-протокола запросило никаких аргументов, до тех пор, пока он соответствует фиксированным правилам, любой сервер может сделать прокси-сервер. Например, статический файловый сервер.

Правила таковы:

ПОЛУЧИТЬ $GOPROXY/ /@v/list возвращает все известные номера версий текущего модуля, по одному в строке

GET /github.com/mnhkahn/gogogo/@v/list
v1.0.0
v1.0.1
v1.0.2
v1.0.3
v1.0.4
v1.0.5

ПОЛУЧИТЬ $GOPROXY//@v/ .info возвращает метаданные версии в формате JSON.

GET /github.com/mnhkahn/gogogo/@v/v1.0.5.info
{
	"Version": "v1.0.5",
	"Time": "2018-09-26T02:47:43Z"
}

Определение структуры Go для метаданных:

type Info struct {
    Version string    // version string
    Time    time.Time // commit time
}

ПОЛУЧИТЬ $GOPROXY//@v/ .mod возвращает файл go.mod для этой версии модуля.

GET /github.com/mnhkahn/gogogo/@v/v1.0.5.mod
module github.com/mnhkahn/gogogo

require (
	github.com/BurntSushi/toml v0.3.0 // indirect
	github.com/ChimeraCoder/gojson v1.0.0
	github.com/davecgh/go-spew v1.1.1 // indirect
	github.com/magiconair/properties v1.8.0
	github.com/pmezard/go-difflib v1.0.0 // indirect
	github.com/sasbury/mini v0.0.0-20161224193750-64bd399395db
	github.com/stretchr/testify v1.2.2
	golang.org/x/net v0.0.0-20180826012351-8a410e7b638d
	gopkg.in/natefinch/lumberjack.v2 v2.0.0-20170531160350-a96e63847dc3
	gopkg.in/yaml.v2 v2.2.1 // indirect
)

ПОЛУЧИТЬ $GOPROXY//@v/ .zip возвращает zip-архив соответствующей версии этого модуля.

GET /github.com/mnhkahn/gogogo/@v/v1.0.5.mod
v1.0.5.zip

Все имена пакетов будут закодированы на строчные буквы. Если есть заглавная буква, предшествует его восклицательным знакам.

github.com/Azure => github.com/!azure

Реализация Афин

Эти переменные среды считываются при загрузке:

func PrepareEnv(gopath string) []string {
	pathEnv := fmt.Sprintf("PATH=%s", os.Getenv("PATH"))
	httpProxy := fmt.Sprintf("HTTP_PROXY=%s", os.Getenv("HTTP_PROXY"))
	httpsProxy := fmt.Sprintf("HTTPS_PROXY=%s", os.Getenv("HTTPS_PROXY"))
	noProxy := fmt.Sprintf("NO_PROXY=%s", os.Getenv("NO_PROXY"))
	gopathEnv := fmt.Sprintf("GOPATH=%s", gopath)
	cacheEnv := fmt.Sprintf("GOCACHE=%s", filepath.Join(gopath, "cache"))
	disableCgo := "CGO_ENABLED=0"
	enableGoModules := "GO111MODULE=on"
	...
}

HTTP_PROXYиHTTPS_PROXYИменно настройки прокси будут использоваться при скачивании пакетов с приватных серверов, иNO_PROXYМожно добавить вайтлист, который не идет на прокси:

export NO_PROXY=gopkg.in,$NO_PROXY

Эти переменные среды будут использоваться как временные переменные среды для загрузки кода. И логика загрузки пакетов зависимостей:

cmd := exec.Command(goBinaryName, "mod", "download", fullURI)
cmd.Env = PrepareEnv(gopath)
cmd.Dir = repoRoot
o, err := cmd.CombinedOutput()

Фактическое исполнение:

HTTP_PROXY=10.244.255.3:7766 HTTPS_PROXY=10.244.255.3:7766 GOPATH=/tmp/athens167327692 GOCACHE=/tmp/athens167327692/cache go mod download golang.org/x/text@v0.3.0

Оригинальная ссылка:Создайте частный сервер для модуля Go,Если воспроизводится, укажите источник!