Подтвердить что ты не робот

"go build" стало очень медленным после установки новой версии Go

После обновления с Go 1.2.1 до 1.3 (Windows 7 64 бит) время выполнения "go build" увеличилось с 4 до 45 секунд. Изменений не было, кроме обновления версии go. Отключение антивирусного сканера кажется неэффективным. Любые подсказки?

4b9b3361

Ответ 1

У вас, вероятно, есть зависимости, которые перекомпилируются каждый раз. Попробуйте go install -a mypackage перестроить все зависимости.

Удаление $GOPATH/pkg также помогает гарантировать, что у вас нет старых объектных файлов.

Здание с флагом -x покажет вам, если инструментальная цепочка находит несовместимые версии.

Ответ 3

Использование go1.6,

Просто запустите go build -i.

Он скомпилирует все зависимости и сохранит их в $GOPATH/pkg/*/* как .a.

Позже, когда вы запустите go run main.go, все будет намного быстрее.

Что действительно замечательно в том, что если вы используете зависимые от поставщика (IE: папку поставщика в вашем проекте), депо встроены соответствующим образом в пределах $GOPATH/pkg/**/yourproject/vendor/**

Таким образом, вы не должны go get install/get/whatever и иметь смешанные зависимости поставщиков/глобальных.

Я подозреваю, что вам нужно перестроить файлы .a после обновления deps (glide update или smthg, как это), но я еще не тестировал это.

Ответ 4

Я только что испытал ту же проблему - обновление с 1.4 до 1.5. Кажется, что версии olds каким-то образом несовместимы или каждый раз перестраиваются, когда отображается go build -x. Выполнение go get -v отменяет все пакеты или повторяет их, я не совсем уверен, а go build -x показывает довольно малое количество выходных данных.

Ответ 5

Вы можете построить sqlite3 следующим образом:

cd ./vendor/github.com/mattn/go-sqlite3/
go install

После этого ваш проект будет построен намного быстрее.

Ответ 6

Если вы попытаетесь, так как все остальные сказали, но все еще не работают, я предлагаю удалить каталог $GOPATH, например:

sudo rm -rf $GOPATH
cd yourproject 
go get -d
go get -u -v github.com/mattn/go-sqlite3

Ответ 7

После перехода 1.10 вам просто нужно ввести go build. Вам не нужно вводить: go build -i.

Из документа проекта Go 1.10 здесь.


Сборка и установка

Команда go build теперь обнаруживает устаревшие пакеты, основанные исключительно на содержании исходных файлов, указанных флагов сборки и метаданных, хранящихся в скомпилированных пакетах. Время модификации больше не рассматривается или не имеет отношения к делу. Старый совет для добавления -a для принудительного восстановления в случаях, когда времена модификации вводят в заблуждение по той или иной причине (например, изменения в строках) больше не требуется: теперь сборки всегда обнаруживают, когда пакеты должны быть перестроены. (Если вы заметили иное, напишите об ошибке.)

...

Команда go build теперь поддерживает кеш недавно созданных пакетов, отдельно от установленных пакетов в $GOROOT/pkg или $GOPATH/pkg.. Эффект кэша должен заключаться в скорости сборки не устанавливайте явно пакеты или при переключении между разными копиями исходного кода (например, при изменении между разными ветвями в системе управления версиями). Старый совет по добавлению флага -i для скорости, как в go build -i или go test -i, больше не нужен: сборка выполняется так же быстро, как и -i. Для получения дополнительной информации см. Раздел "Кэш справки".