2015-08-18 3 views
2

go build and go run очень медленны на крошечной программе, которую я имею (в частности, cgo invocations). Я хотел бы перейти к кешированию двоичного файла, чтобы он восстанавливался только тогда, когда источник является более новым. Я бы использовал простой Makefile с правилом%, но разработчики языка утверждают, что поддержка сборки go не требует Makefile.`go build` перестраивается без необходимости

Есть ли другая альтернатива, которую я забыл? Предполагается ли, что сообщество go предпочитает другую систему сборки, возможно, вместо хэш-функции, для кэширования и повторного использования продуктов сборки?

+6

'go install' и/или' go build -i'; они установят зависимые пакеты, которые в будущем не будут восстановлены, если не будут изменены.Простое 'go build' будет перестраивать измененные зависимые пакеты, но не сохранит результаты. –

+1

Это именно то, что нужно для 'go install'. – JimB

+0

'go build -x' говорит мне, что время потрачено на восстановление крошечной программы. Зависимости кэшируются в порядке. – Tobu

ответ

1

Я написал tool, что случается, чтобы решить это как побочный эффект. Только go build не проверяет, является ли исполняемый файл, который он производит, уже обновлен. go install делает, и если вы настроите его для установки в выбранное вами местоположение, вы получите желаемый результат, похожий на go build.

Вы можете увидеть поведение вы описываете, делая что-то вроде этого:

$ go get -d github.com/anacrolix/missinggo/cmd/nop 
$ time go run "$GOPATH"/src/github.com/anacrolix/missinggo/cmd/nop/*.go 

real 0m0.176s 
user 0m0.142s 
sys  0m0.048s 

Это на теплую перспективе. go run будет ссылаться на каждый вызов, точно так же, как go build. Обратите внимание: github.com/anacrolix/missinggo/cmd/nop - это программа, которая абсолютно ничего не делает.

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

$ time godo github.com/anacrolix/missinggo/cmd/nop 

real 0m0.073s 
user 0m0.029s 
sys  0m0.033s 

Для больших программ, разница должна быть более выраженным.

Итак, ваш стандартный вариант оснастки должен использовать go install, или альтернативу, подобную годо.

1

go build и go install скоро (Go 1.10, Q1 2018) гораздо быстрее: см this thread и this проект документа.

Команда идут в настоящее время поддерживает кэш встроенных пакетов и других мелких метаданных (CL 68116 и CL 75473). Кэш по умолчанию относится к каталогу кэша пользователя, определенному операционной системой, но его можно переместить, установив $GOCACHE.
Запустите «go env GOCACHE», чтобы увидеть текущую эффективную настройку. Прямо сейчас команда go никогда ничего не удаляет из кеша. Если кеш становится слишком большим, запустите «go clean -cache» вместо удаления каталога. Эта команда сохранит файл log.txt кэша. Через несколько недель я попрошу людей опубликовать свои файлы log.txt по проблеме Github, чтобы мы могли оценить подходы к управлению размером кеша.

Основной эффект кеша сборки заключается в том, что команды, такие как «go test» и «go build», выполняются быстро и делают инкрементные сборки всегда, повторное использование предыдущих шагов сборки как можно более агрессивно.
Вам не нужно использовать «go test -i» или «go build -i» или «go install», чтобы получить быстрые инкрементные сборки. Нам больше не придется обучать новых пользователей этим обходным решениям. Все будет быстро.

Обратите внимание, что go install не устанавливает зависимости от названных пакетов: см «What does go build build?».

Смежные вопросы