Голанский эквивалент npm install -g

Если у меня была скомпилированная программа Golang, которую я хотел установить, чтобы запустить ее с помощью команды bash из любого места на моем компьютере, как мне это сделать? Например, в nodejs

npm install -g express

Устанавливает выражение так, что я могу запустить команду

express myapp

и express будет генерировать каталог файлов для приложения node, называемого "myapp", в любом моем текущем каталоге. Есть ли эквивалентная команда для перехода? Я верю, что теперь с командой "go install" вы должны находиться в каталоге, который содержит исполняемый файл, чтобы запустить его

Спасибо заранее!

Ответ 1

Насколько я знаю, нет прямого эквивалента npm install -g. Ближайший эквивалент не будет go install, но go get. На странице справки (go help get):

использование: go get [-d] [-f] [-fix] [-insecure] [-t] [-u] [build flags] [packages]

Загрузите и установите пакеты, названные по пути импорта, наряду с их зависимостями.

По умолчанию go get устанавливает двоичные файлы в $GOPATH/bin, поэтому самый простой способ сделать эти двоичные файлы вызываемыми извне - это добавить этот каталог в ваш $PATH.

Для этого поместите следующую строку в .bashrc (или .zshrc, в зависимости от используемой оболочки):

export PATH="$PATH:$GOPATH/bin"

Кроме того, вы также можете скопировать или связать исполняемые файлы с /usr/local/bin:

ln -s $GOPATH/bin/some-binary /usr/local/bin/some-binary

Ответ 2

При использовании Go> = 1.11, если ваш текущий каталог находится в модульном проекте или вы установили GO111MODULE=on в вашей среде, go get не будет устанавливать пакеты "глобально". Вместо этого он добавит их в ваш файл go.mod проекта.

Начиная с Go 1.11.1, установка GO111MODULE=off работает, чтобы обойти это поведение:

GO111MODULE=off go get github.com/usr/repo

По сути, отключив функцию модуля для этой единственной команды, он будет установлен в GOPATH, как и ожидалось.

Проекты, не использующие модули, по-прежнему go get нормально $GOPATH/bin с установкой двоичных файлов в $GOPATH/bin.

Отсюда продолжительный разговор и множество проблем, связанных с этим изменением в поведении: golang/go - cmd/go: go get не должен добавлять зависимость к go.mod # 27643.

Ответ 3

Ближайшим аналогом этого в Go будет go get. По умолчанию он будет извлекать пакет Go из предоставленного URL-адреса репозитория и требует, чтобы в вашей оболочке была установлена ​​переменная $GOPATH, поэтому Go знает, где хранить пакеты (а затем, где их найти при компиляции кода в зависимости от go get -етные пакеты).

Пример синтаксиса:

$ go get github.com/user/repo

Поведение, предоставляемое флажком npm -g, по умолчанию, и пакеты, установленные с помощью go get, обычно доступны по всему миру.

Подробнее о команде см. go get --help.

Как упоминалось @helmbert, добавление вашего $GOPATH к вашему $PATH полезно, если вы устанавливаете автономные пакеты.

Ответ 4

TL; DR внизу. Я расскажу вам, как я пришел к такому выводу и почему не работают более очевидные решения.


Увидев этот вопрос, я подумал: "Если бы я мог установить root GOPATH=/usr, он установил бы вещи в /usr/bin/ и /usr/src !"

Поэтому я попробовал очевидную вещь:

  1. Добавьте GOPATH=/usr в корневой каталог .bashrc.
    И это сработало!
    Вроде, как бы, что-то вроде.
    На самом деле, нет.
    Оказывается, sudo не выполняет root .bashrc. Для "безопасности" или чего-то в этом роде.

  2. Сделайте env_set или что-то в /etc/sudoers
    Оказывается, /etc/sudoers может удалять только переменные окружения. Там нет директивы env_set.
    (Насколько я могу найти)

  3. Копай через man sudoers.
    Откуда sudo получает набор переменных окружения по умолчанию?
    Ну, первый в списке это /etc/environment, так что тот, который я использовал.


sudo echo "GOPATH=/usr" >> /etc/environment
sudo go get <repo>

Двоичные файлы будут помещены в /usr/bin, а исходные файлы будут помещены в /usr/src.

Запуск go от имени пользователя root будет использовать GOPATH "нормальным" способом.