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

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

Программисты New Go часто не знают или путают то, что делает основная команда сборки сборки.

Что делают команды go build и go install и где они помещают результат/вывод?

4b9b3361

Ответ 1

Что делает команда go, зависит от того, запускаем ли она ее для "нормального" пакета или специального пакета "main".

Для пакетов

  • go build   создает ваш пакет, затем отбрасывает результаты. Затем
  • go install устанавливает пакет в каталог $GOPATH/pkg.

Для команд (пакет main)

  • go build   создает команду и оставляет результат в текущем рабочем каталоге.
  • go install создает команду во временном каталоге, а затем перемещает ее на $GOPATH/bin.

В основном вы можете использовать go build как проверку того, что пакеты могут быть созданы (вместе с их зависимостями), в то время как go install также (постоянно) устанавливает результаты в соответствующие папки вашего $GOPATH.

go build будет молча завершать, если все в порядке, и вы получите сообщения об ошибках, если пакеты не могут быть созданы/скомпилированы.

Всякий раз, когда инструмент go устанавливает пакет или двоичный файл, он также устанавливает любые зависимости, которые он имеет, поэтому запуск go install также будет устанавливать пакеты, на которые ваша программа зависит (общедоступные, "get gettable" ), автоматически.

Для начала ознакомьтесь с официальной страницей Как написать код перехода.

Дополнительная информация о инструменте go: Команда go

Вы также можете получить дополнительную помощь, выполнив следующую команду:

go help build

Также стоит отметить, что начиная с Go 1.5 go install также удаляются исполняемые файлы, созданные go build (source):

Если "go install" (без аргументов, что означает текущий каталог) удаляет исполняемый файл, написанный "go build", если он присутствует. Это позволяет избежать остаточного двоичного файла...

Чтобы завершить список, go run компилирует ваше приложение во временную папку и запускает исполняемый двоичный файл. Когда приложение существует, оно правильно очищает временные файлы.

Вопрос, вдохновленный Дейвом Чейни Что делает сборка сборки?

Ответ 2

Для пакета:

go build: создает ваш пакет, затем отбрасывает результаты

Это не будет верно после Go 1.10 (Q1 2018), благодаря CL 68116 и CL 75473. См. этот поток, который я здесь упоминаю.

Что делают команды go build и go install build

Всякий раз, когда инструмент go устанавливает пакет или двоичный файл, он также устанавливает любые зависимости, которые он имеет, поэтому при запуске go install также будут устанавливаться пакеты, от которых зависит ваша программа (общедоступные, "get gettable" ).

На самом деле... go install также изменится с Go 1.10, кроме нового кеша:

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