1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/voidint-gbb

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Применение

Сценарии использования

  • Сценарий 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 можно обобщить следующим образом:

  1. Однократная компиляция всех пакетов go в каталоге проекта.
  2. Поддержка автоматической «вставки» информации во время компиляции в двоичный исполняемый файл. Типичным примером является встраивание информации о времени компиляции и исходном коде Commit в информацию о версии двоичного исполняемого файла.
  3. После первого запуска в корневом каталоге проекта создаётся конфигурационный файл 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 в двоичные файлы, рекомендуется прочитать весь текст от начала до конца.

Шаг 0

Чтобы отобразить информацию о времени компиляции и 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

Step2

В корне проекта выполните 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.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.5.0 — 2017/09/10

  • Добавлена функция: поддержка объединения значений опции -ldflags. #23 (https://github.com/voidint/gbb/issues/23)
  • Исправлена ошибка: в gbb.json, если значение version не соответствует формату xx.xx.xx, в конце подсказки неожиданно появляется знак %. #20 (https://github.com/voidint/gbb/issues/20)
  • Исправлена ошибка: если в атрибуте tool файла gbb.json есть пробел, компиляция невозможна. #24 (https://github.com/voidint/gbb/issues/24)
  • Исправлена ошибка: команда gbb init не может получить содержимое пробела, введённого с клавиатуры. #1 (https://github.com/voidint/gbb/issues/1)
  • Улучшено покрытие юнит-тестов.

0.4.0 — 2017/04/08

0.3.0 — 2017/01/09

0.2.0 — 2016/12/30

  • Атрибуты package и variables в файле gbb.json стали необязательными. Если атрибут variables пуст, то при вызове компилятора не добавляются параметры типа -ldflags '-X "xxx.yyy=zzz"'. #8 (https://github.com/voidint/gbb/issues/8)
  • Если номер версии программы не совпадает со значением version в файле gbb.json, файл gbb.json принудительно пересоздаётся.

0.1.1 — 2016/12/24

  • Возможность инициализации конфигурации с помощью команды gbb init и создания файла конфигурации gbb.json.
  • Компиляция всех исходных файлов в корне проекта одним нажатием клавиши и создание одного или нескольких исполняемых двоичных файлов. #4 (https://github.com/voidint/gbb/issues/4)
  • Возможность вызова gb или go build/install и предоставления подробной информации о версии для скомпилированных исполняемых файлов, включая время компиляции и версию исходного кода из системы контроля версий.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Ассистент: Compile assistant написан на golang. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/voidint-gbb.git
git@api.gitlife.ru:oschina-mirror/voidint-gbb.git
oschina-mirror
voidint-gbb
voidint-gbb
master