Сценарии использования
Сценарий 1: Если в проекте есть несколько основных файлов входа, например:
$ tree ./github.com/voidint/test
./github.com/voidint/test
├── cmd
│ ├── apiserver
│ │ └── main.go
│ ├── dbtool
│ │ └── main.go
│ └── init
│ └── main.go
└── gbb.json
4 directories, 4 files
Для такой структуры каталогов как скомпилировать эти программы? Предположим, что мы используем собственные инструменты go build/install
. Возможно, мы сделаем следующее:
Введём полный путь для компиляции:
$ go install github.com/voidint/test/cmd/apiserver
$ go install github.com/voidint/test/cmd/dbtool
$ go install github.com/voidint/test/cmd/init
По очереди переключим рабочие каталоги и выполним go build/install
:
$ cd github.com/voidint/test/cmd/apiserver && go install && cd -
$ cd github.com/voidint/test/cmd/dbtool && go install && cd -
$ cd github.com/voidint/test/cmd/init && go install && cd -
После выполнения этих действий не покажется ли вам это очень утомительным? Если нужно компилировать этот проект несколько десятков раз в день, это будет неэффективно. К сожалению, на данный момент go build/install
не поддерживает компиляцию всех основных файлов в дочерних каталогах проекта из корневого каталога.
Сценарий 2: Программа, которая работала хорошо, внезапно выдаёт ошибку. Чтобы узнать её версию, компьютер холодно сообщает вам:
$ xxx --version
xxx version 1.0.12
Если нет подробной информации о выпуске, то вы, скорее всего, будете в отчаянии. Потому что вы не знаете, когда была скомпилирована эта версия 1.0.12
, и вы даже не знаете, из какой версии исходного кода она была скомпилирована. Отладка этой проблемы становится намного сложнее.
В таком же сценарии, если компьютер сообщит вам следующую информацию, отладка будет проще?
$ xxx --version
xxx version 1.0.12
date: 2016-12-18T15:37:09+08:00
commit: db8b606cfc2b24a24e2e09acac24a52c47b68401
Возможно, gbb
может помочь вам в этом случае. Давайте продолжим читать.
Основываясь на описанных выше сценариях, основные функции gbb
можно обобщить следующим образом:
go
в каталоге проекта.Commit
в информацию о версии двоичного исполняемого файла.gbb.json
, который используется для последующих операций компиляции без вмешательства пользователя.Установка из исходного кода:
Извлеките исходный код:
$ go get -u -v github.com/voidint/gbb
Скомпилируйте (по умолчанию go get
также компилирует установку):
$ cd $GOPATH/src/github.com/voidint/gbb && go install
Поместите исполняемый файл gbb
в переменную среды PATH
.
Выполните which gbb
, чтобы убедиться, что установка прошла успешно.
Если gbb
конфликтует с другими именами, рекомендуется установить псевдоним, например alias gbb=gbb2
.
Бинарная установка:
gbb
— это самоуправляемая программа. Другими словами, используя установленный исполняемый двоичный файл gbb
, можно скомпилировать исходный код gbb
. Например:
$ cd $GOPATH/src/github.com/voidint/gbb && gbb --debug
==> go build -ldflags '-X "github.com/voidint/gbb/build.Date=2016-12-17T17:00:04+08:00" -X "github.com/voidint/gbb/build.Commit=db8b606cfc2b24a24e2e09acac24a52c47b68401"'
$ ls -l ./gbb
-rwxr-xr-x 1 voidint staff 4277032 12 17 17:00 ./gbb
Можно видеть, что в текущем каталоге появился новый исполняемый двоичный файл. Да, этот ./gbb
является результатом компиляции исходного кода с использованием уже установленного gbb
.
Как использовать gbb
вместо go build/install
, или gb
для выполнения повседневных задач по компиляции кода? Это просто, следуйте шагам ниже и вы быстро научитесь.
Поскольку необходимо продемонстрировать использование метода, конечно, необходим пример проекта Go. Ниже мы используем проект gbb
в качестве примера.
Чтобы начать демонстрацию с нуля, пожалуйста, удалите файл gbb.json
в исходном каталоге. Роль и содержание файла gbb.json
будут объяснены позже.
$ rm -f gbb.json
Прежде всего, давайте чётко определим, что может делать инструмент gbb
:
Например, если вы обычно используете go build/install
для решения задач компиляции, и вам не нужно встраивать какую-либо информацию в двоичные исполняемые файлы, вы можете пропустить следующий шаг 0 и сразу перейти к шагу 1.
Если вас интересует встраивание информации о времени компиляции или commit
в двоичные файлы, рекомендуется прочитать весь текст от начала до конца.
Чтобы отобразить информацию о времени компиляции и commit
в информации о версии (и не только), необходимо сначала определить две экспортируемые переменные.
package build
var (
Date string
Commit string
)
Затем настройте использование этих двух переменных в функциональном коде. Например:
package cmd
import (
"fmt"
"github.com/spf13/cobra"
"github.com/voidint/gbb/build"
)
var (
// Version 版本号
Version = "0.1.0"
)
var versionCmd = &cobra.Command{
Use: "version",
Short: "Print version information",
Long: ``,
Run: func(cmd *cobra.Command, args []string) {
fmt.Printf("gbb version %s\n", Version)
if build.Date
Этот текст был переведён с помощью модели искусственного интеллекта YandexGPT. **Вот перевод текста на русский язык:**
### step1
В корне проекта выполните команду `gbb init`, следуя инструкциям, которые выдаёт команда. В итоге будет создан файл `gbb.json`. Подробнее о файле `gbb.json` можно узнать в разделе [подробное описание](https://github.com/voidint/gbb#gbbjson).
Если используется сценарий один, то нужно только заполнить поле `tool` (фактический вызываемый инструмент компиляции) и завершить процесс в соответствии с требованиями.
``` shell
$ gbb init
Эта утилита поможет вам создать файл gbb.json.
Он охватывает только наиболее распространённые элементы и пытается угадать разумные значения по умолчанию.
Нажмите ^C в любое время для выхода.
tool: (go install) go build
Вы хотите продолжить?[y/n] n
Если ситуация соответствует описанию сценария два, то необходимо продолжить сбор информации.
$ gbb init
Эта утилита поможет вам создать файл gbb.json.
Он охватывает только наиболее распространённые элементы и пытается угадать разумные значения по умолчанию.
Нажмите ^C в любое время для выхода.
tool: (go install) go build
Вы хотите продолжить?[y/n] y
importpath: (main) github.com/voidint/gbb/build
variable: Date
value: {{.Date}}
Вы хотите продолжить?[y/n] y
variable: Commit
value: {{.GitCommit}}
Вы хотите продолжить?[y/n] n
Будет создан файл /Users/voidint/cloud/workspace/go/lib/src/github.com/voidint/gbb/gbb.json со следующим содержимым:
{
"version": "0.6.1",
"tool": "go build",
"importpath": "github.com/voidint/gbb/build",
"variables": [
{
"variable": "Date",
"value": "{{.Date}}"
},
{
"variable": "Commit",
"value": "{{.GitCommit}}"
}
]
}
Это нормально?[y/n] y
В корне проекта выполните gbb --debug
, gbb
прочитает текущий каталог gbb.json
и выполнит компиляцию. Если файл gbb.json
не существует, gbb init
будет автоматически вызван для его создания.
$ gbb --debug
==> go build -ldflags '-X "github.com/voidint/gbb/build.Date=2020-05-03T16:11:47+08:00" -X "github.com/voidint/gbb/build.Commit=471876228386f1f4374fc39e675a54be4b7a3715"'
После завершения компиляции в каталоге появится новый двоичный файл. Попробуйте вывести информацию о версии, чтобы увидеть, достигнута ли наша цель.
$ ./gbb version
gbb версия 0.6.1
дата: 2020-05-03T16:11:47+08:00
фиксация: 471876228386f1f4374fc39e675a54be4b7a3715
😊
Файл gbb.json
— это конфигурационный файл инструмента gbb
, который автоматически создаётся командой gbb init
. Обычно он имеет следующий формат:
{
"version": "0.6.1",
"tool": "go build -v -ldflags='-s -w' -gcflags='-N -l'",
"importpath": "github.com/voidint/gbb/build",
"variables": [
{
"variable": "Date",
"value": "{{.Date}}"
},
{
"variable": "Commit",
"value": "{{.GitCommit}}"
},
{
"variable": "Branch",
"value": "$(git symbolic-ref --short -q HEAD)"
}
]
}
version
: версия gbb. gbb автоматически записывает свою версию в gbb.json.tool
: фактический инструмент компиляции, используемый gbb, который поддерживает параметры компилятора. Поддерживаемые инструменты компиляции включают: go build
, go install
, gb build
.importpath
: путь импорта пакета, например, переменные Date
, Commit
находятся в пакете github.com/voidint/gbb/build
.variables
: список переменных. Каждый элемент списка содержит атрибуты variable
и value
.
variable
: имя переменной, например Date
.value
: выражение переменной.
{{.Date}}
: вывод времени системы в формате RFC3339.{{.GitCommit}}
: выводит последний хэш коммита текущей ветки.$(
и заканчиваются )
. Содержимое строки между ними будет выполнено как команда. Например, выражение $(date)
приведёт к тому, что вывод команды date
станет результатом вычисления выражения переменной. В системах, отличных от Windows, будет использоваться оболочка по умолчанию для оценки выражений переменных, таких как /bin/bash -c "git symbolic-ref --short -q HEAD"
. Функция: оценка выражения переменных в форме команд в системах *NIX через shell. #34 (https://github.com/voidint/gbb/issues/34)Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )