Что идет сборка сборка?
Программисты на новом Go часто не знают или не понимают, что делает основная команда go build.
Что именно go build
а также go install
команды сборки и куда они кладут результат / вывод?
2 ответа
Что за go
Команда зависит от того, запускаем ли мы ее для "нормального" пакета или для специального "main"
пакет.
Для пакетов
go build
строит ваш пакет, затем отбрасывает результаты.go install
builds затем устанавливает пакет в ваш$GOPATH/pkg
каталог.
Для команд (пакет main
)
go build
строит команду и оставляет результат в текущем рабочем каталоге.go install
строит команду во временном каталоге, затем перемещает ее в$GOPATH/bin
,
В основном вы можете использовать go build
как проверка того, что пакеты могут быть собраны (вместе с их зависимостями), в то время как go install
также (навсегда) устанавливает результаты в соответствующие папки вашего $GOPATH
,
go build
молча прекратит работу, если все в порядке, и выдаст вам сообщения об ошибках, если пакеты не могут быть собраны / скомпилированы.
Всякий раз, когда go
Инструмент устанавливает пакет или двоичный файл, он также устанавливает любые зависимости, которые у него есть, поэтому работает go install
также автоматически установит пакеты, от которых зависит ваша программа (общедоступные, пакеты "go gettable").
Для начала ознакомьтесь с официальной страницей " Как написать код".
Больше информации о go
инструмент: Command go
Вы также можете получить дополнительную помощь, выполнив следующую команду:
go help build
Также стоит отметить, что начиная с Go 1.5 go install
также удаляет исполняемые файлы, созданные go build
( источник):
Если "go install" (без аргументов, то есть текущего каталога) завершается успешно, удалите исполняемый файл, написанный "go build", если он есть. Это позволяет избежать устаревших двоичных файлов...
Чтобы завершить список, go run
компилирует ваше приложение во временную папку и запускает этот исполняемый двоичный файл. Когда приложение закрывается, оно правильно очищает временные файлы.
Вдохновленный Дейвом Чейни вопрос " Что делать, строить строить?
Для пакета:
go build
: строит ваш пакет, затем отбрасывает результаты
Это не будет правдой после Go 1.10 (Q1 2018), спасибо CL 68116 и CL 75473. Смотрите эту ветку, на которую я ссылаюсь здесь.
Что именно
go build
а такжеgo install
сборка командВсякий раз, когда инструмент go устанавливает пакет или двоичный файл, он также устанавливает любые зависимости, которые у него есть, поэтому при запуске go install также автоматически устанавливаются пакеты, от которых зависит ваша программа (общедоступные, пакеты go gettable).
На самом деле... go install
будет меняться также с Go 1.10, в дополнение к новому кешу:
"
go install
msgstr "команда больше не устанавливает зависимости именованных пакетов ( CL 75850).Если вы бежите
go install foo
", единственное, что установленоfoo
,Раньше это менялось. Если зависимости устарели, "
go install
"также установлены любые зависимости.
Неявная установка зависимостей приgo install
"вызвало много путаницы и головной боли у пользователей, но ранее было необходимо включить инкрементные сборки.
Уже нет.
Мы думаем, что новыйinstall what I said
"семантика будет гораздо более понятной, особенно с учетом того, что из сообщений об ошибках ясно, что многие пользователи уже ожидали их.
Принудительно устанавливать зависимости во время "go install
"используй новый"go install -i
" по аналогии с"go build -i
" а также "go test -i
".Дело в том, что "
go install
"используется для установки любых перестроенных зависимостей, вызывая путаницу чаще всего в связи с-a
, что значит "force rebuild of all dependencies
".
Сейчас, "go install -a myprog
"приведет к полной перестройке всех зависимостейmyprog
, так же какmyprog
сам, но толькоmyprog
будет установлен. (Конечно, все восстановленные зависимости все равно будут сохранены в кеше сборки.)
Заставить этот случай работать более понятным образом особенно важно в сочетании с новым анализом устаревания на основе содержимого, поскольку он видит веские причины для перестройки зависимостей чаще, чем раньше, что увеличило бы путаницу "почему мои зависимости были установлены".
Например, если вы запуститеgo install -gcflags=-N myprog
", который устанавливаетmyprog
построен без оптимизации компилятора, но больше не переустанавливает пакетыmyprog
использует из стандартной библиотеки без оптимизации компилятора.