Все, що ви хотіли знати про GOPATH і GOROOT

Незважаючи на те, що Go вважається однією з найлегших для входу мов, доводиться регулярно чути: «якось усе незрозуміло, якісь змінні GOROOT та GOPATH потрібно встановлювати». І хоча тема повністю розкрита на офіційному сайті Go, не зайвим буде пояснити зовсім простою мовою.

TL; DR

якщо

Тепер трохи докладніше:

GOROOT- це змінна, що вказує, де лежить, власне, вся бінарна збірка Go та вихідні коди. Щось на зразок JAVA_HOME. Встановлювати цю змінну ручками потрібно лише в тих випадках, якщо ви ставите Go під Windows не за допомогою MSI-інсталера, а із zip-архіву. Ну, або якщо ви хочете тримати кілька версій Go, кожна у своїй директорії.

Раніше (до Go 1.0) ця змінна була потрібна - її використовували скрипти збірки, так само як і GOARCH і GOOS. Але після Go 1.0 трохи змінилася внутрішня логіка роботи go tool і зараз значення GOROOT хардкодиться на етапі складання або інсталяції. Тобто, go - дефолтно проінстальований - знає це значення і так. Його можна подивитися за допомогою команди:

У MacOS X це /usr/local/go/, у Linux теж (хоча може залежати від дистрибутива), у Windows - С: \ Go.

А ось зміннаGOPATHдуже важлива і потрібна і її потрібно встановити обов'язково, втім лише один раз. Це ваш workspace, де буде лежати код та бінарні файли всього з чим ви будете в Go працювати. Тому вибирайте зручний вам шлях та зберігайте його в GOPATH. Наприклад:

Ну і обов'язково це збережіть в .profile або як ви зберігаєте там змінні:

Все, зробіть це один раз і забудьте. Створіть тільки цю директорію, якщо її ще немає, і на цьому готово. Тепер будь-який викликgo get github.com/someuser/somelibавтоматично завантажуватиме вихідники в $GOPATH/src, абінарний результат компіляції складати в $GOPATH/pkg або $GOPATH/bin (для бібліотек та файлів, що виконуються відповідно).

Це опціонально, але бажано відразу теж зробити, якщо ви взялися за налаштування середовища. Рано чи пізно ви захочете користуватися якимись Go-програмами, які будуть лежати у вашій GOPATH/bin. Щоб їх без зайвих рухів використовувати, додайте до PATH директорію $GOPATH/bin:

Командаgo installзбирає та встановлює бінарник саме в цю директорію, тому це виключно для зручності.

Структура Workspace

Тепер уважно подивимося на структуру директорії GOPATH. Візьму приклад із офіційної документації:

Достатньо просто, чи не так? Важливо розуміти, що ніхто не зобов'язує називати директорії у src/ за якимось форматом. Можна використовувати і src/test/my_first_app/main.go і src/anyname/main.go – але якщо ви працюєте з системами контролю версій (а ви таки працюєте)), то вам це безперечно стане зручно – утиліти go get/install використовують це угоди найменування, щоб зробити роботу з системами контролю версій безбожно простою.

Додатково

/other_workspace. Це в дуже поодиноких випадках буває корисно (наприклад, для роботи із зовнішніми менеджерами залежностей на кшталт gpm), але в 99% це не потрібно, і просто так рекомендується використовувати лише одну директорію в GOPATH.

Зрештою, якщо вам потрібні роздільні workspace-и, завжди можна замінити змінну GOPATH на потрібну (у скрипті збірки, наприклад). Так, власне, і роблять.