У чому різниця між 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.