У чому різниця між go get і go install?


83

Погравши goдеякий час з інструментом, це виглядає так go get:

  1. (необов’язково) завантаження,
  2. компілює,
  3. та встановлює

шматок програмного забезпечення, хоча і go installпросто

  1. складає
  2. та встановлює

це. Чому в цьому випадку go installіснує команда, яка go getзамінює її?

Відповіді:


79

go installє частиною робочого процесу при локальній роботі. Скажімо, ви хочете користуватися бібліотекою, але з якихось причин потрібні зміни. Ви зробите:

  • go get -d library, який лише завантажує його;
  • внесіть зміни в завантажений пакет;
  • go install library встановити локальну версію.

Наскільки я знаю go get, немає прапорів, які б вказували, що його не слід завантажувати, тому він не може замінити go installтут.

Той самий робочий процес використовується, коли ви розробляєте новий пакет з нуля.


1
Приємно, я думаю, я зараз розумію завдяки вашому першому прикладу. Однак у вашому другому (розробці нового пакету з нуля) я міг би go get ./path/to/local_packageтеж скористатися , і він би поводився так само, як ніби я go install ./path/to/local_package, правда? Оскільки в цьому випадку немає процесу завантаження.
thiagowfx

go installробить вашу мету більш чіткою, але я думаю, обидва досягли б одного і того ж. Я протестував із кількома пакунками, включаючи такі, що були оголошені як, mainі вони здавались еквівалентними. Документів дуже не вистачає на цю команду.
BoppreH

Тут сказано, вам потрібен gcc для, go getале не для go install. Як це пов’язано з цим описом?
AndreKR

3
Я не погоджуюся з цією відповіддю. Ви можете використовувати його go getзамість go installтретього пункту маркування, оскільки go getбібліотека не буде повторно завантажена (якщо ви не додасте -u). Ви також можете використовувати go getпри написанні бібліотеки з нуля. go installздається абсолютно зайвим.
Саймон

34

go get робить дві основні речі в такому порядку:

  • завантажує та зберігає в $GOPATH/src/<import-path>пакунках (вихідному коді), названих у шляхах імпорту, разом із їхніми залежностями

  • виконує a go install

-dПрапор ( go get -d) інструктує go getприпинити після завантаження пакетів; тобто вказує go getне робитиgo install


різниця:

go get // перевіряємо, чи потрібно завантажувати пакети, завантажуємо, якщо потрібно, потім компілюємо

go install // пропустити частину із завантаженням пакетів, просто скомпілювати (це призведе до помилки, якщо відсутні будь-які пакунки)


про GOPATHзмінну середовища

GOPATHМінлива оточення використовується утилітами Go. Він повинен бути встановлений для того , щоб бути в змозі get, buildі installпакети, і це визначає місце розташування вашого робочого простору. Ймовірно, це єдина змінна середовища, яку вам потрібно буде встановити при розробці коду Go.

Знову ж таки, GOPATHне повинно вказувати на інсталяцію Go, а на вашу робочу область.

Наприклад, у Windows, якщо ви вирішите, що ваша робоча область знаходиться c:\gowork\, вам потрібно буде встановити GOPATHзначення якc:\gowork

введіть тут опис зображення

Ваш вихідний код повинен бути в c:\gowork\src\<some project folder>\і після запуску go getв командному рядку зсередини c:\gowork\src\<some project folder>\ви побачите c:\gowork\bin\і c:\gowork\pkg\створюється.


go installзавантажує пакет в модульно налаштованому налаштуванні.
Беркант Іпек

2

Зверніть увагу, що перехід 1.16 (Q1 2021) зробить цю різницю зрозумілішою, реалізований із CL 266360 як частина випуску 40276 :

go installтепер приймає аргументи з суфіксами версій (наприклад, go install example.com/cmd@v1.0.0).
Це призводить go installдо побудови та встановлення пакунків у режимі модульного управління , ігноруючи go.modфайл у поточному каталозі або будь-якому батьківському каталозі, якщо він є.
Це корисно для встановлення виконуваних файлів, не впливаючи на залежності основного модуля .

go install, із суфіксом версії або без нього (як описано вище), зараз рекомендований спосіб створення та встановлення пакетів у модульному режимі.

go getслід використовувати з -dпрапором для регулювання залежностей поточного модуля без побудови пакетів, а використання go getдля побудови та встановлення пакетів застаріло .
У майбутньому випуску -dпрапор завжди буде ввімкнено .


можливо, я просто не знаю аргументів цього ... але я не розумію, чому ви хочете відключити одну команду build / install. це відрізняється від будь-якого іншого менеджера пакунків, якого я бачив
Тревор Джекс,

@TrevorJex перечитуючи github.com/golang/go/issues/40276 , там до цих пір є однією збірки / команди установки: go install. І робить це, встановлюючи пакети в певних версіях, незалежно від поточного контексту модуля. Це покращення порівняно зі старим go get.
VonC
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.