Почему go -u занимает очень много времени в каталоге модулей, но быстро завершается снаружи в golang? - PullRequest
1 голос
/ 03 июня 2019

У меня очень медленная нестабильная сеть.

Первое наблюдение, запущенное локально

Например, когда я запускаю go get -u github.com/jinzhu/gorm в новой директории модуля (в которой есть main.go).Он распечатывает много строк и никогда не сможет успешно завершиться в моей локальной среде из-за медленной нестабильной сети.

Но если я выполню ту же команду за пределами каталога модуля, она может быть выполнена за разумное время без какого-либо стандартного вывода.

Второе наблюдение, запущенное удаленно

У меня есть пультVPS сервер, который находится в США.Я создаю там тот же каталог модулей и запускаю ту же команду внутри модуля на удаленном компьютере: go get -u github.com/jinzhu/gorm, и go.mod будет иметь следующее содержимое:

require (
    cloud.google.com/go v0.39.0 // indirect
    github.com/denisenkom/go-mssqldb v0.0.0-20190515213511-eb9f6a1743f3 // indirect
    github.com/golang/mock v1.3.1 // indirect
    github.com/google/btree v1.0.0 // indirect
    github.com/google/pprof v0.0.0-20190515194954-54271f7e092f // indirect
    github.com/jinzhu/gorm v1.9.8 // indirect
    github.com/jinzhu/inflection v0.0.0-20190603042836-f5c5f50e6090 // indirect
    github.com/kr/pty v1.1.4 // indirect
    github.com/lib/pq v1.1.1 // indirect
    go.opencensus.io v0.22.0 // indirect
    golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5 // indirect
    golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522 // indirect
    golang.org/x/image v0.0.0-20190523035834-f03afa92d3ff // indirect
    golang.org/x/lint v0.0.0-20190409202823-959b441ac422 // indirect
    golang.org/x/mobile v0.0.0-20190509164839-32b2708ab171 // indirect
    golang.org/x/mod v0.1.0 // indirect
    golang.org/x/net v0.0.0-20190603091049-60506f45cf65 // indirect
    golang.org/x/oauth2 v0.0.0-20190523182746-aaccbc9213b0 // indirect
    golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed // indirect
    golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 // indirect
    golang.org/x/tools v0.0.0-20190603152906-08e0b306e832 // indirect
    google.golang.org/appengine v1.6.0 // indirect
    google.golang.org/genproto v0.0.0-20190530194941-fb225487d101 // indirect
    google.golang.org/grpc v1.21.0 // indirect
    honnef.co/go/tools v0.0.0-20190602125119-5a4a2f4a438d // indirect
)

, а затем я запускаю go mod tidy,go.mod становится:

require (
    cloud.google.com/go v0.39.0 // indirect
    github.com/denisenkom/go-mssqldb v0.0.0-20190515213511-eb9f6a1743f3 // indirect
    github.com/google/go-cmp v0.3.0 // indirect
    github.com/jinzhu/gorm v1.9.8
    github.com/jinzhu/inflection v0.0.0-20190603042836-f5c5f50e6090 // indirect
    github.com/lib/pq v1.1.1 // indirect
    golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5 // indirect
    google.golang.org/appengine v1.6.0 // indirect
)

Но если я полностью удаляю секцию require(...) из go.mod и затем выполняю go mod tidy, я получаю следующее содержимое в go.mod:

require github.com/jinzhu/gorm v1.9.8

Требуется только один.И с этой одной строкой я запускаю go build, модуль может быть собран и успешно запущен без каких-либо проблем.

Так что я очень озадачен тем, что на самом деле go get -u делает в моем каталоге модулей.

Мои два вопроса:

  • Должен ли я запустить go get -u в каталоге модуля или я могу просто запустить его вне каталога модуля?

  • Почему go get -u вне каталога модуля можно легко завершить?Доза ли она делает то же самое скачивание / обновление по сравнению с запуском внутри каталога модуля?

Я использую последнюю стабильную версию golang go1.12.5.Потому что go get -u звонит git и git звонит curl, но curl очень плохо в нестабильной сети (по сравнению с wget).Я не могу заполнить go get -u внутри каталога модуля.Я получу много error: RPC failed; The remote end hung up unexpectedly; fatal: early EOF; fatal: index-pack failed;.Я не знаю, есть ли решение этой проблемы или нет.Но я могу использовать go get -u вне каталога модуля.

Большое спасибо.

(Кстати, если go get может использовать wget, он будет работать в моей локальной среде. У меня никогда не было проблем с wget, и wget наконец завершит загрузку после ожиданияв течение долгого времени. Но, к сожалению, wget не является предпочтительным инструментом в мире разработки)

1 Ответ

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

Должен ли я запустить go get -u внутри каталога модуля или я могу просто запустить его вне каталога модуля?

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

Зачем переходить -u вне директории модуля можно легко завершить?Доза делает это то же самое скачивание / обновление по сравнению с запуском внутри каталога модуля?

Они довольно разные по поведению.go help get, go help module-get и go help modules должны объяснить некоторые различия, и в вашем случае проверьте модуль doc :

Распространенная ошибка - думать, что go get -ufoo получает только последнюю версию foo.В действительности, -u in go get -u foo или go -u foo @ latest означает также получение последних версий для всех прямых и косвенных зависимостей foo.

Go.Мод для gorm включает в себя множество вещей (https://github.com/jinzhu/gorm/blob/master/go.mod), включая драйверы для каждой возможной базы данных, которые он поддерживает, что кажется довольно интенсивным. Так как вы просто делаете общий -u и не указываете @v1.9.3 или что-то ещепытается обновить все зависимости Gorm (и зависимости!) в режиме с поддержкой модулей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...