Что идет сборка сборка?

Программисты на новом 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 использует из стандартной библиотеки без оптимизации компилятора.

Другие вопросы по тегам