Golang эквивалент npm установить -g
Если бы у меня была скомпилированная программа Golang, которую я хотел установить так, чтобы я мог запустить ее с помощью команды bash из любого места на моем компьютере, как бы я это сделал? Например, в nodejs
npm install -g express
Устанавливает экспресс так, что я могу запустить команду
express myapp
и Express сгенерирует файловый каталог для приложения узла под названием "myapp" в любом моем текущем каталоге. Есть ли эквивалентная команда для перехода? Я считаю, что теперь с командой "go install" вы должны находиться в каталоге, в котором находится исполняемый файл, чтобы запустить его
Заранее спасибо!
8 ответов
Насколько я знаю, нет прямого эквивалента 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
Используя 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
,
Отсюда продолжительный разговор и несколько зарегистрированных проблем, связанных с этим изменением поведения: golang / go - cmd / go: go get не должен добавлять зависимость к go.mod # 27643.
Начиная с Go> = 1.16, рекомендуемый способ установки исполняемого файла - использовать
go install package@version
Например,
go install github.com/fatih/gomodifytags@latest
.
Исполняемые файлы (основные пакеты) устанавливаются в каталог, названный
GOBIN
переменная среды, по умолчанию
$GOPATH/bin
или
$HOME/go/bin
если
GOPATH
переменная окружения не установлена. Вам нужно добавить этот каталог в свой
PATH
переменная для глобального запуска исполняемых файлов. В моем случае я добавил эту строку в свой
~/.zshrc
файл. (если вы используете bash, добавьте его в
~/.bash_profile
файл):
export PATH="$HOME/go/bin:$PATH"
Команда Go опубликовала в блоге сообщение об этом изменении, вот цитата с объяснением:
Раньше мы рекомендовали go get -u program для установки исполняемого файла, но это использование вызвало слишком сильную путаницу со значением go get для добавления или изменения требований к версии модуля в go.mod.
Ссылаться на go install
документация для более подробной информации
Краткое решение для пользователей Linux:
- Использовать
go get
команда как обычно - Добавьте следующие строки в
.bashrc
:
# This is the default GOPATH, you should confirm with the 'go env' command
export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
- Перезагрузите терминал или загрузите его. Установленные двоичные файлы будут доступны по всему миру.
Ближайшим аналогом этого в Go будет go get
, По умолчанию он извлекает пакет Go из предоставленного URL-адреса хранилища и требует $GOPATH
переменная, которая будет установлена в вашей оболочке, чтобы Go знал, где хранить пакеты (и, следовательно, где их искать при компиляции кода в зависимости от go get
пакеты).
Пример синтаксиса:
$ go get github.com/user/repo
Поведение предоставлено npm
"s -g
флаг установлен по умолчанию, и пакеты устанавливаются с использованием go get
обычно доступны во всем мире.
Увидеть go get --help
для получения дополнительной информации о команде.
Как уже упоминалось @helmbert, добавив $GOPATH
на ваш $PATH
полезно, если вы устанавливаете автономные пакеты.
если вы используете zsh:
сначала: установите свой пакет, используя:
go install package@version
затем вы редактируете файл .zshrc
nano ~/.zshrc
Добавьте эту строку в конец файла .zshrc:
export PATH="$HOME/go/bin:$PATH"
последний, но тем не менее важный :
source ~/.zshrc
затем откройте новый терминал и выполните свою команду :)
TL;DR внизу. Я расскажу, как я пришел к такому выводу и почему более очевидные решения не работают.
Увидев этот вопрос, я подумал: "Если бы я мог установить корневойGOPATH=/usr
, он установит вещи в /usr/bin/
а также /usr/src
!"
Итак, я попробовал очевидное:
добавлять
GOPATH=/usr
рутовать.bashrc
.
И это сработало!
Вроде.
На самом деле, нет.
Оказывается,sudo
не выполняет корень.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 "обычным" способом.
Если у вас не установлен go, вы можете использовать гобинарии . он создает двоичный файл проекта по запросу из репозитория github.
Команда для установки пакета go будет следующей:
curl -sf https://gobinaries.com/rakyll/hey | sh