Skip to content

Latest commit

 

History

History
455 lines (366 loc) · 31.6 KB

File metadata and controls

455 lines (366 loc) · 31.6 KB

All Contributors

Mentioned in Awesome Go reviewdog Coverage Go Reference Go Report Card GitHub

English | 日本語 | Русский | 中文 | 한국어 | Español | Français

📖 Это перевод, который может отставать от английского README — основного источника информации.

gup - Обновляет бинарные файлы, установленные через "go install"

sample

Команда gup обновляет бинарные файлы, установленные через "go install", до последней версии. gup обновляет все бинарные файлы параллельно, поэтому работает очень быстро. Она также предоставляет подкоманды для управления бинарными файлами в $GOPATH/bin ($GOBIN). Это кроссплатформенное программное обеспечение, которое работает на Windows, Mac и Linux.

Если вы используете oh-my-zsh, то для gup установлен алиас. Этот алиас - gup - git pull --rebase. Поэтому убедитесь, что алиас oh-my-zsh отключен (например, $ \gup update).

Поддерживаемые ОС (модульное тестирование с GitHub Actions)

  • Linux
  • Mac
  • Windows

Как установить

gup уже доступен через winget, mise и nix помимо go install и Homebrew.

Использовать "go install"

Если на вашей системе не установлена среда разработки golang, пожалуйста, установите golang с официального сайта golang.

go install github.com/nao1215/gup@latest

Использовать homebrew

brew install nao1215/tap/gup

Использовать winget (Windows)

winget install --id nao1215.gup

Использовать mise-en-place

mise use -g gup@latest

Использовать nix (профиль Nix)

nix profile install nixpkgs#gogup

Установка из пакета или бинарного файла

Страница релизов содержит пакеты в форматах .deb, .rpm и .apk. Команда gup использует команду go внутренне, поэтому требуется установка golang.

Проверка целостности релиза

Каждый релиз поставляется с метаданными цепочки поставок, чтобы вы могли проверить то, что скачиваете:

  • Подписанные контрольные суммыchecksums.txt подписан с помощью cosign (без ключей), создавая checksums.txt.sigstore.json.
  • SBOM — к каждому архиву релиза прикреплена SPDX Software Bill of Materials.
  • Происхождение сборки — происхождение сборки SLSA удостоверяется через GitHub OIDC.

Проверьте подписанные контрольные суммы (затем сверьте свой архив с checksums.txt):

cosign verify-blob \
  --bundle checksums.txt.sigstore.json \
  --certificate-identity-regexp 'https://github.com/nao1215/gup/\.github/workflows/release\.yml@refs/tags/.*' \
  --certificate-oidc-issuer 'https://token.actions.githubusercontent.com' \
  checksums.txt
sha256sum --check --ignore-missing checksums.txt

Проверьте происхождение сборки скачанного артефакта с помощью GitHub CLI:

gh attestation verify gup_<version>_<os>_<arch>.tar.gz --repo nao1215/gup

Как использовать

Обновить все бинарные файлы

Если вы хотите обновить все бинарные файлы, просто выполните $ gup update.

$ gup update
update binary under $GOPATH/bin or $GOBIN
[ 1/30] github.com/cheat/cheat/cmd/cheat (Already up-to-date: v0.0.0-20211009161301-12ffa4cb5c87 / go1.22.4)
[ 2/30] fyne.io/fyne/v2/cmd/fyne_demo (Already up-to-date: v2.1.3 / go1.22.4)
[ 3/30] github.com/nao1215/gal/cmd/gal (v1.0.0 to v1.2.0 / go1.22.4)
[ 4/30] github.com/matsuyoshi30/germanium/cmd/germanium (Already up-to-date: v1.2.2 / go1.22.4)
[ 5/30] github.com/onsi/ginkgo/ginkgo (Already up-to-date: v1.16.5 / go1.22.4)
[ 6/30] github.com/git-chglog/git-chglog/cmd/git-chglog (Already up-to-date: v0.15.1 / go1.22.4)
   :
   :

Обновить указанный бинарный файл

Если вы хотите обновить только указанные бинарные файлы, укажите несколько имён команд, разделённых пробелом.

$ gup update subaru gup ubume
update binary under $GOPATH/bin or $GOBIN
[1/3] github.com/nao1215/gup (v0.7.0 to v0.7.1, go1.20.1 to go1.22.4)
[2/3] github.com/nao1215/subaru (Already up-to-date: v1.0.2 / go1.22.4)
[3/3] github.com/nao1215/ubume/cmd/ubume (Already up-to-date: v1.4.1 / go1.22.4)

Исключить бинарные файлы во время gup update

Если вы не хотите обновлять некоторые бинарные файлы, просто укажите бинарные файлы, которые не должны быть обновлены, разделённые ',' без пробелов в качестве разделителя. Также работает в сочетании с --dry-run

$ gup update --exclude=gopls,golangci-lint    //--exclude или -e, этот пример исключит 'gopls' и 'golangci-lint'

Обновить бинарные файлы с @main, @master или @latest

Если вы хотите управлять источником обновления для каждого бинарного файла, используйте следующие опции:

  • --main (-m): обновление через @main (при ошибке откат на @master)
  • --master: обновление через @master
  • --latest: обновление через @latest

Выбранный канал сохраняется в gup.json и переиспользуется в следующих запусках gup update.

$ gup update --main=gup,lazygit --master=sqly --latest=air

Вывести список имён команд с путём пакета и версией в $GOPATH/bin

Подкоманда list выводит информацию о командах в $GOPATH/bin или $GOBIN. Выводимая информация - это имя команды, путь пакета и версия команды. sample

Удалить указанный бинарный файл

Если вы хотите удалить команду в $GOPATH/bin или $GOBIN, используйте подкоманду remove. Подкоманда remove спрашивает, хотите ли вы её удалить, перед удалением.

$ gup remove subaru gal ubume
gup:CHECK: remove /home/nao/.go/bin/subaru? [Y/n] Y
removed /home/nao/.go/bin/subaru
gup:CHECK: remove /home/nao/.go/bin/gal? [Y/n] n
cancel removal /home/nao/.go/bin/gal
gup:CHECK: remove /home/nao/.go/bin/ubume? [Y/n] Y
removed /home/nao/.go/bin/ubume

Если вы хотите принудительное удаление, используйте опцию --force.

$ gup remove --force gal
removed /home/nao/.go/bin/gal

Проверить, является ли бинарный файл последней версией

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

$ gup check
check binary under $GOPATH/bin or $GOBIN
[ 1/33] github.com/cheat/cheat (Already up-to-date: v0.0.0-20211009161301-12ffa4cb5c87 / go1.22.4)
[ 2/33] fyne.io/fyne/v2 (current: v2.1.3, latest: v2.1.4 / current: go1.20.2, installed: go1.22.4)
   :
[33/33] github.com/nao1215/ubume (Already up-to-date: v1.5.0 / go1.22.4)

If you want to update binaries, the following command.
           $ gup update fyne_demo gup mimixbox

Как и другие подкоманды, вы можете проверить только указанные бинарные файлы.

$ gup check lazygit mimixbox
check binary under $GOPATH/bin or $GOBIN
[1/2] github.com/jesseduffield/lazygit (Already up-to-date: v0.32.2 / go1.22.4)
[2/2] github.com/nao1215/mimixbox (current: v0.32.1, latest: v0.33.2 / go1.22.4)

If you want to update binaries, the following command.
           $ gup update mimixbox

Тихий вывод для большого набора инструментов

По умолчанию check и update выводят каждый бинарный файл, что создаёт много шума, когда у вас установлено множество инструментов. Передайте --quiet (-q), чтобы скрыть строки об актуальных версиях и показать только бинарные файлы, которые были обновлены (или для которых доступно обновление), а также сбои, после чего следует однострочная сводка. Ошибки всегда выводятся в STDERR, поэтому они остаются видимыми. Если также указан --json, флаг --quiet игнорируется и выводится полный JSON-массив.

$ gup update --quiet
github.com/nao1215/gup (v0.7.0 to v0.7.1)
gup: 1 updated, 8 up-to-date, 0 failed

$ gup check -q
github.com/nao1215/gup (current: v0.7.0, latest: v0.7.1 / go1.22.4)

If you want to update binaries, run the following command.
           $ gup update gup
gup: 1 update available, 8 up-to-date, 0 failed

Машиночитаемый вывод JSON (для скриптов / CI)

list, check и update принимают --json, выводя JSON-массив вместо человекочитаемого вывода (который остаётся по умолчанию).

$ gup check --json
[
  {
    "name": "gup",
    "import_path": "github.com/nao1215/gup",
    "module_path": "github.com/nao1215/gup",
    "channel": "latest",
    "current_version": "v1.0.0",
    "latest_version": "v1.1.0",
    "current_go_version": "go1.22.4",
    "installed_go_version": "go1.22.4",
    "status": "update-available"
  }
]

Каждый элемент имеет следующие поля: name, import_path, module_path, channel (latest/main/master), current_version, latest_version (пусто для list), current_go_version, installed_go_version, status и error (опускается, если отсутствует). status принимает значения installed (list), up-to-date, update-available (check), updated (update) или error.

Массив всегда является корректным JSON, включая случаи частичных сбоев (такие пакеты получают "status": "error"; детали ошибки также выводятся в STDERR, поэтому STDOUT остаётся чистым JSON). Коды завершения не изменяются — check, сообщающий update-available, по-прежнему завершается с кодом 0.

Поведение в пустом окружении

Пустое глобальное окружение (ещё ни один бинарный файл не установлен через go install) рассматривается как нормальная ситуация первого запуска, а не как ошибка:

  • list, check и update завершаются с кодом 0, выводя короткое информационное сообщение (или валидный пустой массив [] с --json).
  • export завершается с кодом 0 и записывает пустой gup.json.

Указание неустановленного бинарного файла или исключение всех бинарных файлов по-прежнему является ошибкой использования и завершается с кодом 1.

Подкоманда Export/Import

Используйте export/import, если хотите установить одинаковые бинарные файлы golang на нескольких системах. gup.json хранит import path, версию бинарного файла и канал обновления (latest / main / master). import устанавливает точно ту версию, которая записана в файле.

{
  "schema_version": 1,
  "packages": [
    {
      "name": "gal",
      "import_path": "github.com/nao1215/gal/cmd/gal",
      "version": "v1.1.1",
      "channel": "latest"
    },
    {
      "name": "posixer",
      "import_path": "github.com/nao1215/posixer",
      "version": "v0.1.0",
      "channel": "main"
    }
  ]
}

По умолчанию:

  • gup export записывает в $XDG_CONFIG_HOME/gup/gup.json
  • gup import, gup check и gup update автоматически ищут файл в следующем порядке:
    1. $XDG_CONFIG_HOME/gup/gup.json (если существует)
    2. ./gup.json (если существует)

Если существуют оба файла gup.json (на уровне пользователя и ./gup.json), import, check и update сразу завершаются с ошибкой и просят устранить неоднозначность через --file, вместо того чтобы молча выбрать один. Путь всегда можно переопределить через --file (-f).

gup export всегда определяет сохранённые каналы обновления из канонического gup.json на уровне пользователя; --file/--output меняют только место назначения экспорта, поэтому экспорт в новый файл никогда не сбрасывает канал пакета обратно на latest.

※ Окружение A (например, ubuntu)
$ gup export
Export /home/nao/.config/gup/gup.json

※ Окружение B (например, debian)
$ gup import

Также export может вывести содержимое gup.json в STDOUT через --output. import может читать конкретный файл через --file.

※ Окружение A (например, ubuntu)
$ gup export --output > gup.json

※ Окружение B (например, debian)
$ gup import --file=gup.json

Перенос бинарных файлов в новый $GOBIN

gup migrate BEFORE_PATH AFTER_PATH [BINARY...]

gup migrate переустанавливает Go-бинарные файлы из BEFORE_PATH в AFTER_PATH, используя точный import path@version, записанный в build info каждого бинарного файла (он никогда не выполняет тихое обновление до @latest). Внутренне он просто устанавливает GOBIN в AFTER_PATH и запускает обычный путь go install, поэтому бинарные файлы пересобираются с текущим используемым тулчейном Go.

Чем это полезно (например, с mise)

Когда вы управляете Go с помощью mise, обновление Go может изменить реальный путь $GOBIN для каждой версии Go. В результате инструменты, установленные под предыдущим $GOBIN, больше не видны новому Go. gup migrate позволяет переустановить тот же набор Go-инструментов из старого $GOBIN в новый:

# Переустановить все go-install инструменты из старого GOBIN в новый GOBIN
$ gup migrate ~/.local/share/mise/installs/go/1.24.0/bin ~/.local/share/mise/installs/go/1.25.0/bin

# Перенести только указанные бинарные файлы
$ gup migrate /old/gobin /new/gobin gopls air

migrate работает только на добавление:

  • Он никогда не удаляет и не очищает файлы в AFTER_PATH.
  • Бинарные файлы, которые уже существуют в AFTER_PATH, по умолчанию пропускаются. Используйте --force, чтобы переустановить их поверх.
  • AFTER_PATH создаётся автоматически, если он не существует.
  • BEFORE_PATH и AFTER_PATH должны быть разными каталогами.

Бинарные файлы, чей import path или версию невозможно определить, а также сборки для разработки (devel / (devel)), пропускаются, а не обновляются, поэтому локальные или невоспроизводимые сборки никогда не ломаются.

Поддерживаемые флаги: --dry-run (-n), --notify (-N), --jobs (-j), --force.

Генерировать man-страницы (для linux, mac)

Подкоманда man по умолчанию генерирует man-страницы в /usr/share/man/man1. Если задан MANPATH, gup записывает в каталог man1 под каждой записью, создавая его, если он ещё не существует. Недоступный для записи путь завершается с понятной ошибкой.

$ sudo gup man
Generate /usr/share/man/man1/gup-bug-report.1.gz
Generate /usr/share/man/man1/gup-check.1.gz
Generate /usr/share/man/man1/gup-completion.1.gz
Generate /usr/share/man/man1/gup-export.1.gz
Generate /usr/share/man/man1/gup-import.1.gz
Generate /usr/share/man/man1/gup-list.1.gz
Generate /usr/share/man/man1/gup-man.1.gz
Generate /usr/share/man/man1/gup-migrate.1.gz
Generate /usr/share/man/man1/gup-remove.1.gz
Generate /usr/share/man/man1/gup-update.1.gz
Generate /usr/share/man/man1/gup-version.1.gz
Generate /usr/share/man/man1/gup.1.gz

Генерация файла автодополнения оболочки (для bash, zsh, fish и PowerShell)

completion выводит скрипты автодополнения в STDOUT, когда вы передаёте имя оболочки. Чтобы установить файлы автодополнения в пользовательское окружение для bash/fish/zsh, используйте --install. Для PowerShell перенаправьте вывод в файл .ps1 и подключите его из профиля.

$ gup completion bash > gup.bash
$ gup completion zsh > _gup
$ gup completion fish > gup.fish
$ gup completion powershell > gup.ps1

# Автоматически установить файлы в стандартные пользовательские пути
$ gup completion --install

--install требует, чтобы была задана HOME; при пустой HOME она сразу завершается с ошибкой (не записывая файлы в текущий каталог) и завершается с ненулевым кодом, если какой-либо файл автодополнения не удаётся записать.

Уведомления на рабочем столе

Если вы используете gup с опцией --notify, команда gup уведомляет вас на рабочем столе о том, было ли обновление успешным или неуспешным после завершения обновления.

$ gup update --notify

success warning

Отключить цветной вывод

По умолчанию gup раскрашивает свой вывод. Чтобы отключить цвета, передайте --no-color или установите переменной окружения NO_COLOR непустое значение (следуя соглашению NO_COLOR). Это полезно при перенаправлении вывода через конвейер, в логах CI или при глобально установленной NO_COLOR.

$ gup update --no-color
$ NO_COLOR=1 gup update

Бенчмарк

gup выполняет обновления параллельно, поэтому завершает работу быстрее, чем инструменты, обновляющие бинарные файлы по одному. Обновление 9 бинарных файлов, для каждого из которых была доступна более новая версия:

Инструмент Стратегия Время
gup update параллельно 0.7s
go-global-update последовательно 2.9s
цикл go install последовательно 2.9s

Измерено на AMD Ryzen AI Max+ 395 (32 ядра) / 64 ГБ ОЗУ / Ubuntu 26.04 / go 1.26.4, медиана из 5 запусков с прогретым кешем модулей Go. Время зависит от времени сборки каждого бинарного файла и вашего CPU.

Сравнение возможностей

Возможность gup go-global-update go install loop
Параллельное обновление Да Нет Вручную
Каналы обновления для каждого пакета (latest/main/master) Да Нет Вручную
Экспорт/импорт набора инструментов Да Нет Вручную
Перенос бинарных файлов в новый $GOBIN Да Нет Вручную
Машиночитаемый вывод JSON (--json) Да Нет Нет
Генерация/установка автодополнения оболочки Да Нет Нет
update переустанавливает актуальные бинарные файлы Нет Да Да
migrate --force переустанавливает, когда цель уже существует Да Нет Вручную
Диагностика сбоев / подсказки по дальнейшим шагам Нет Да Нет
Поддержка NO_COLOR Да Да
Не требуется дополнительный инструмент (только официальный тулчейн) Нет Нет Да

Участие в проекте

Прежде всего, спасибо за то, что уделяете время участию! ❤️ Смотрите CONTRIBUTING.md для получения дополнительной информации. Рабочий процесс разработки, чек-лист качества и управление инструментами описаны в CONTRIBUTING.md. Вклады связаны не только с разработкой. Например, GitHub Star мотивирует меня к разработке!

История звёзд

Star History Chart

Контакты

Если вы хотите отправить комментарии, такие как "найден баг" или "запрос дополнительных функций" разработчику, пожалуйста, используйте один из следующих контактов.

Вы можете использовать подкоманду bug-report для отправки отчёта о баге.

$ gup bug-report
※ Откроется страница GitHub issue в вашем браузере по умолчанию

ЛИЦЕНЗИЯ

Проект gup лицензирован на условиях Apache License 2.0.

Участники ✨

Спасибо этим замечательным людям (ключ emoji):

CHIKAMATSU Naohiro
CHIKAMATSU Naohiro

💻
KEINOS
KEINOS

💻
mattn
mattn

💻
Justin Lecher
Justin Lecher

💻
Lincoln Nogueira
Lincoln Nogueira

💻
Masaya Watanabe
Masaya Watanabe

💻
memreflect
memreflect

💻
Akimo
Akimo

💻
rkscv
rkscv

💻
Ville Skyttä
Ville Skyttä

💻
Zephyr Lykos
Zephyr Lykos

💻
iTrooz
iTrooz

💻
Tiago Peczenyj
Tiago Peczenyj

💻

Этот проект следует спецификации all-contributors. Приветствуются вклады любого рода!