Голанский эквивалент 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
!"
Поэтому я попробовал очевидную вещь:
-
Добавьте GOPATH=/usr
в корневой каталог .bashrc
.
И это сработало!
Вроде, как бы, что-то вроде.
На самом деле, нет.
Оказывается, sudo
не выполняет root .bashrc
. Для "безопасности" или чего-то в этом роде.
-
Сделайте env_set
или что-то в /etc/sudoers
Оказывается, /etc/sudoers
может удалять только переменные окружения. Там нет директивы env_set
.
(Насколько я могу найти)
-
Копай через man sudoers
.
Откуда sudo получает набор переменных окружения по умолчанию?
Ну, первый в списке это /etc/environment
, так что тот, который я использовал.
sudo echo "GOPATH=/usr" >> /etc/environment
sudo go get <repo>
Двоичные файлы будут помещены в /usr/bin
, а исходные файлы будут помещены в /usr/src
.
Запуск go от имени пользователя root будет использовать GOPATH "нормальным" способом.