Программисты New Go часто не знают или путают то, что делает основная команда сборки сборки.
Что делают команды go build
и go install
и где они помещают результат/вывод?
Программисты New Go часто не знают или путают то, что делает основная команда сборки сборки.
Что делают команды go build
и go install
и где они помещают результат/вывод?
Что делает команда 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
компилирует ваше приложение во временную папку и запускает исполняемый двоичный файл. Когда приложение существует, оно правильно очищает временные файлы.
Вопрос, вдохновленный Дейвом Чейни Что делает сборка сборки?
Для пакета:
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
из стандартной библиотеки без оптимизации компилятора.