Відповіді:
Те, що go
робить команда, залежить від того, чи будемо ми виконувати її для «звичайного» пакету або для спеціального "main"
пакету.
Для пакетів
go build
будує ваш пакет, а потім відкидає результати .go install
потім будує пакунок, інсталює пакет у вашому $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 Code ".
Більше інформації про go
інструмент: Command 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
команди будуютьКожен раз, коли інструмент 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
", це встановить amyprog
побудований без оптимізацій компілятора, але він більше не переустановлює використання пакетів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
, це не дивно, оскільки я просто створив цілий пакет, і я використовую цей приклад як основу, і я створив більш базову версію, яка працювала (але не використовувала цю бібліотеку). Я не бачу, як це не було встановлено з пакетом вуса.