Программисты-новички на Go часто не знают или не понимают, что делает основная команда сборки go.
Что именно go build
и go install
команды строить и где они ставят результат / вывод?
Ответы:
Что go
делает команда, зависит от того, запускаем ли мы ее для «обычного» пакета или для специального "main"
пакета.
Для пакетов
go build
строит ваш пакет, а затем отбрасывает результаты .go install
builds затем устанавливает пакет в ваш $GOPATH/pkg
каталог.Для команд (пакет main
)
go build
строит команду и оставляет результат в текущем рабочем каталоге .go install
создает команду во временном каталоге, а затем перемещает в него $GOPATH/bin
.go build
?Вы можете передавать пакеты тем go build
пакетам, которые хотите собрать. Вы также можете передать список .go
файлов из одного каталога, который затем будет рассматриваться как список исходных файлов, определяющих один пакет.
Если пакеты (пути импорта) не указаны, сборка применяется к текущему каталогу.
Путь импорта может содержать один или несколько "..."
подстановочных знаков (в этом случае это шаблон ). ...
может соответствовать любой строке, например, net/...
соответствует net
пакету и пакетам, находящимся в любой из его подпапок. Команда
go build ./...
часто используется для сборки пакета в текущей папке и повторения всех пакетов. Эта команда, введенная в корне проекта, создает полный проект.
Для получения дополнительных сведений об указании пакетов запустите go help packages
.
Предварительная поддержка модулей Go была представлена в Go 1.11, а модули стали стандартными, начиная с Go 1.13. Когда go
инструмент запускается из папки, содержащей go.mod
файл (или одного из родительских элементов текущей папки), go
инструмент работает в режиме с учетом модуля (устаревший режим называется режимом GOPATH ).
В режиме с поддержкой модулей GOPATH больше не определяет значение импорта во время сборки, но по-прежнему сохраняет загруженные зависимости (в GOPATH / pkg / mod) и установленные команды (в GOPATH / bin, если GOBIN не установлен).
При сборке модулей то, что создается, указывается в списке сборки . Список сборки изначально содержит только основной модуль (модуль, содержащий каталог, в котором выполняется go
команда), а зависимости основного модуля добавляются в список сборки рекурсивно (также добавляются зависимости зависимостей).
Для получения дополнительной информации запустите go help modules
.
В основном вы можете использовать go build
в качестве проверки, что пакеты могут быть собраны (вместе с их зависимостями), а go install
также (навсегда) устанавливают результаты в соответствующие папки вашего $GOPATH
.
go build
молча завершится, если все в порядке, и выдаст вам сообщения об ошибках, если пакеты не могут быть собраны / скомпилированы.
Всякий раз, когда go
инструмент устанавливает пакет или двоичный файл, он также устанавливает любые зависимости, которые у него есть, поэтому запуск go install
также автоматически установит пакеты, от которых зависит ваша программа (общедоступные, "go gettable" пакеты).
Для начала прочтите официальную страницу How to Write Go Code .
Подробнее об go
инструменте: Command go
Вы также можете получить дополнительную помощь, выполнив следующую команду:
go help build
Также стоит отметить, что начиная с Go 1.5 go install
также удаляются исполняемые файлы, созданные go build
( источник ):
Если «go install» (без аргументов, то есть текущий каталог) завершается успешно, удалите исполняемый файл, записанный «go build», если он есть. Это позволяет избежать устаревших двоичных файлов ...
Чтобы завершить список, go run
компилирует ваше приложение во временную папку и запускает этот исполняемый двоичный файл. Когда приложение закрывается, оно правильно очищает временные файлы.
Вопрос вдохновлен вопросом Дэйва Чейни « Что нужно построить?»
Для пакета:
go build
: строит ваш пакет, а затем отбрасывает результаты
Этого не будет после Go 1.10 (1 квартал 2018 г.), спасибо CL 68116 и CL 75473 . См. Эту ветку , на которую я ссылаюсь здесь.
Что именно строят команды
go build
иgo install
Всякий раз, когда инструмент go устанавливает пакет или двоичный файл, он также устанавливает любые зависимости, которые у него есть, поэтому запуск go install также автоматически установит пакеты, от которых зависит ваша программа (общедоступные, "go gettable" пакеты).
На самом деле ... go install
изменится также с Go 1.10, в дополнение к новому кешу:
Команда "
go install
" больше не устанавливает зависимости названных пакетов ( 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
используемые из стандартной библиотеки, без оптимизации компилятора.
go build
, делать get
с? У меня ошибка сборки cannot find package "github.com/spf13/cobra" in any of:…
. Я не знаю, как сказать, чтобы получить это. Мне нужно явно получать?
go.mod
файл?
go version go1.11.4 linux/amd64
. Насчет go.mod не знаю. Я перестраиваю https://github.com/cbroglie/mustache/blob/master/cmd/mustache/main.go
, это странно, поскольку я только что собрал весь пакет и использую этот пример в качестве основы, и я создал более базовую версию, которая работала (но не использую эту библиотеку). Я не вижу, как он не был установлен с пакетом усов.