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:

  1. Использовать go get команда как обычно
  2. Добавьте следующие строки в .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
  1. Перезагрузите терминал или загрузите его. Установленные двоичные файлы будут доступны по всему миру.

Ближайшим аналогом этого в 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!"

Итак, я попробовал очевидное:

  1. добавлять GOPATH=/usr рутовать .bashrc.
    И это сработало!
    Вроде.
    На самом деле, нет.
    Оказывается,sudo не выполняет корень .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 "обычным" способом.

Если у вас не установлен go, вы можете использовать гобинарии . он создает двоичный файл проекта по запросу из репозитория github.

Команда для установки пакета go будет следующей:

      curl -sf https://gobinaries.com/rakyll/hey | sh
Другие вопросы по тегам