Що потрібно будувати? .


106

Програмісти New Go часто не знають і не плутають те, що робить основна команда go build.

Що саме роблять команди go buildта go installкоманди, і куди вони ставлять результат / результат?


Відповіді:


125

Те, що 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компілює вашу програму у тимчасову папку та запускає цей виконуваний двійковий файл. Коли програма закривається, вона належним чином очищає тимчасові файли.

Питання, натхнене твором Дейва Чейні: Що робити, будувати?


1
здається дивним, що go install не оновлює виконуваний файл, якщо його ідентичний попередньо встановленому ... будь-яка інформація тут?
Скотт Стенсленд

14

Для упаковки:

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:…. Я не знаю, як це сказати, щоб отримати. Чи потрібно явно дістати?
ctrl-alt-delor

@ ctrl-alt-delor З якою версією Go? Чи має у вашому проекті go.modфайл?
VonC

go version go1.11.4 linux/amd64. Я не знаю про go.mod. Я відновлюю будівництво https://github.com/cbroglie/mustache/blob/master/cmd/mustache/main.go, це не дивно, оскільки я просто створив цілий пакет, і я використовую цей приклад як основу, і я створив більш базову версію, яка працювала (але не використовувала цю бібліотеку). Я не бачу, як це не було встановлено з пакетом вуса.
ctrl-alt-delor

@ ctrl-alt-delor, тому cobr постачається github.com/cbroglie/mustache/tree/master/cmd/mustache/vendor/… . Правильно налаштовано ваш GOPATH?
VonC

Я виявив те, що ви вже знайшли. Пакет знаходиться у підкаталозі постачальника: саме тому його не встановили. Однак я не знаю, чому він не встановлює його зараз у збірці. Або як використовувати каталог постачальників (якщо я скопіюю його до свого каталогу).
ctrl-alt-delor
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.