Программисты-новички на Go часто не знают или не понимают, что делает основная команда сборки go.
Что именно go build
и go install
команды строить и где они ставят результат / вывод?
go
build
compilation
icza
источник
источник
Ответы:
Что
go
делает команда, зависит от того, запускаем ли мы ее для «обычного» пакета или для специального"main"
пакета.Для пакетов
go build
строит ваш пакет, а затем отбрасывает результаты .go install
builds затем устанавливает пакет в ваш$GOPATH/pkg
каталог.Для команд (пакет
main
)go build
строит команду и оставляет результат в текущем рабочем каталоге .go install
создает команду во временном каталоге, а затем перемещает в него$GOPATH/bin
.На что перейти
go build
?Вы можете передавать пакеты тем
go build
пакетам, которые хотите собрать. Вы также можете передать список.go
файлов из одного каталога, который затем будет рассматриваться как список исходных файлов, определяющих один пакет.Если пакеты (пути импорта) не указаны, сборка применяется к текущему каталогу.
Путь импорта может содержать один или несколько
"..."
подстановочных знаков (в этом случае это шаблон )....
может соответствовать любой строке, например,net/...
соответствуетnet
пакету и пакетам, находящимся в любой из его подпапок. Командачасто используется для сборки пакета в текущей папке и повторения всех пакетов. Эта команда, введенная в корне проекта, создает полный проект.
Для получения дополнительных сведений об указании пакетов запустите
go help packages
.Что касается модулей
Предварительная поддержка модулей Go была представлена в Go 1.11, а модули стали стандартными, начиная с Go 1.13. Когда
go
инструмент запускается из папки, содержащейgo.mod
файл (или одного из родительских элементов текущей папки),go
инструмент работает в режиме с учетом модуля (устаревший режим называется режимом GOPATH ).При сборке модулей то, что создается, указывается в списке сборки . Список сборки изначально содержит только основной модуль (модуль, содержащий каталог, в котором выполняется
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 1.5
go install
также удаляются исполняемые файлы, созданныеgo build
( источник ):Чтобы завершить список,
go run
компилирует ваше приложение во временную папку и запускает этот исполняемый двоичный файл. Когда приложение закрывается, оно правильно очищает временные файлы.Вопрос вдохновлен вопросом Дэйва Чейни « Что нужно построить?»
источник
Для пакета:
Этого не будет после Go 1.10 (1 квартал 2018 г.), спасибо CL 68116 и CL 75473 . См. Эту ветку , на которую я ссылаюсь здесь.
На самом деле ...
go install
изменится также с Go 1.10, в дополнение к новому кешу:источник
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
, это странно, поскольку я только что собрал весь пакет и использую этот пример в качестве основы, и я создал более базовую версию, которая работала (но не использую эту библиотеку). Я не вижу, как он не был установлен с пакетом усов.