---
metadata:
  - name: generator
    content: Diplodoc Platform v5.70.0
alternate:
  - https://sourcecraft.dev/portal/docs/ru/sourcecraft/operations/configure-go.md
  - href: https://sourcecraft.dev/portal/docs/ru/sourcecraft/operations/configure-go.md
    type: text/markdown
    title: Markdown version
  - href: https://sourcecraft.dev/portal/docs/ru/llms.txt?revision=r22101122
    rel: describedby
title: Настроить Go для работы с реестром SourceCraft
description: Инструкция по созданию, загрузке и скачиванию модулей Go с помощью реестра пакетов SourceCraft.
---
> **Documentation Index:** Fetch the complete configuration index at https://sourcecraft.dev/portal/docs/ru/llms.txt?revision=r22101122


# Настроить Go

Реестр Go в SourceCraft поддерживает [протокол Go Module Proxy](https://go.dev/ref/mod#goproxy-protocol). Вы можете загрузить в реестр ZIP-архив модуля и подключить опубликованный модуль к другому проекту с помощью команды `go get`.

Чтобы получать модули напрямую из публичного репозитория SourceCraft, воспользуйтесь инструкцией [Использовать репозиторий SourceCraft в качестве источника пакетов для Go](https://sourcecraft.dev/portal/docs/ru/sourcecraft/operations/go-get.md).

## Подготовка к работе {#prepare}

1. [Установите Go](https://go.dev/doc/install).
1. [Создайте реестр](https://sourcecraft.dev/portal/docs/ru/sourcecraft/operations/packages-management.md) типа **Go** или [подключите существующий](https://sourcecraft.dev/portal/docs/ru/sourcecraft/operations/packages-management.md#existing-registry).
1. [Создайте](https://sourcecraft.dev/portal/docs/ru/sourcecraft/security/pat.md#create) персональный токен (PAT).
1. Создайте переменные окружения с данными для аутентификации:

    ```bash
    export REGISTRY_USERNAME="iam"
    export REGISTRY_PASSWORD="<персональный_токен_PAT>"
    ```

<!-- source: ru/_includes/sourcecraft/get-slug-registry-id-notice.md -->
{% note tip %}

Слаг организации и идентификатор реестра вы можете узнать на странице реестра в интерфейсе SourceCraft.

{% endnote %}
<!-- endsource: ru/_includes/sourcecraft/get-slug-registry-id-notice.md -->

## Создать модуль {#create-module}

1. Создайте директорию модуля и перейдите в нее:

    ```bash
    mkdir mymodule
    cd mymodule
    ```

1. Инициализируйте модуль, указав его полный путь в реестре:

    ```bash
    go mod init pkg.sourcecraft.tech/go/<слаг_организации>/<идентификатор_реестра>/mymodule
    ```

1. Создайте файл `hello.go` с кодом модуля:

    ```go
    package mymodule

    func Hello() string {
        return "Hello from my module!"
    }
    ```

1. Синхронизируйте зависимости:

    ```bash
    go mod tidy
    ```

## Подготовить архив и загрузить модуль {#push}

Команда `go` не поддерживает публикацию модулей. Для загрузки подготовьте ZIP-архив: пути всех файлов в нем должны начинаться с `<полный_путь_модуля>@<версия>/`. Полный путь должен совпадать со значением директивы `module` в файле `go.mod`, а версия должна содержать префикс `v`, например `v1.0.0`.

1. В директории созданного модуля соберите архив:

    ```bash
    bsdtar -a -cf ../mymodule-v1.0.0.zip \
      -s '|^|pkg.sourcecraft.tech/go/<слаг_организации>/<идентификатор_реестра>/mymodule@v1.0.0/|' \
      go.mod hello.go
    ```

    Утилита `bsdtar` входит в состав [libarchive](https://www.libarchive.org/). В Debian и Ubuntu ее можно установить командой `sudo apt install libarchive-tools`. В macOS используйте команду `tar` с теми же параметрами.

    Пример содержит два файла. Для своего модуля включите в архив нужные исходные файлы, `go.mod` и `go.sum`, если он существует. Архив должен соответствовать [требованиям Go](https://go.dev/ref/mod#zip-files); его размер не должен превышать 500 МБ.

1. Проверьте структуру архива:

    ```bash
    unzip -l ../mymodule-v1.0.0.zip
    ```

    Пути файлов должны иметь вид:

    ```text
    pkg.sourcecraft.tech/go/<слаг_организации>/<идентификатор_реестра>/mymodule@v1.0.0/go.mod
    pkg.sourcecraft.tech/go/<слаг_организации>/<идентификатор_реестра>/mymodule@v1.0.0/hello.go
    ```

1. Загрузите архив в реестр HTTP-запросом методом PUT:

    ```bash
    curl \
      --request PUT \
      --user "$REGISTRY_USERNAME:$REGISTRY_PASSWORD" \
      --upload-file ../mymodule-v1.0.0.zip \
      "https://pkg.sourcecraft.tech/go/<слаг_организации>/<идентификатор_реестра>/mymodule/1.0.0/mymodule-v1.0.0.zip"
    ```

    В URL для загрузки версия передается без префикса `v`: для `v1.0.0` укажите `1.0.0`. Имя модуля указывается без префикса `pkg.sourcecraft.tech/go/<слаг_организации>/<идентификатор_реестра>/`. Для модулей версии 2 и выше также уберите суффикс `/vN` из имени в URL загрузки. Например, для модуля `sample/module/v2` используйте имя `sample/module` и версию `2.0.0`.

    При необходимости добавьте параметр `--header "X-Checksum-SHA256: <хеш_архива>"`, чтобы сервис проверил целостность архива после загрузки.

## Скачать модуль и подключить к проекту {#pull}

1. Укажите реестр как прокси для загрузки модулей:

    ```bash
    export GOPROXY="https://pkg.sourcecraft.tech/go/<слаг_организации>/<идентификатор_реестра>,https://proxy.golang.org,direct"
    export GONOSUMDB="pkg.sourcecraft.tech/go/<слаг_организации>/<идентификатор_реестра>/*"
    ```

    `GOPROXY` задает порядок поиска: реестр SourceCraft, публичный прокси Go, затем исходный репозиторий. `GONOSUMDB` исключает модули вашего реестра из проверки через публичную базу контрольных сумм.

1. Добавьте в файл `~/.netrc` данные для аутентификации:

    ```text
    machine pkg.sourcecraft.tech login iam password <персональный_токен_PAT>
    ```

    Укажите значение токена: файл `~/.netrc` не подставляет переменные окружения. Ограничьте доступ к файлу:

    ```bash
    chmod 600 ~/.netrc
    ```

1. Перейдите в корень проекта, в который вы хотите добавить модуль. Если в проекте еще нет файла `go.mod`, выполните `go mod init <имя_проекта>`.
1. Подключите опубликованную версию модуля:

    ```bash
    go get pkg.sourcecraft.tech/go/<слаг_организации>/<идентификатор_реестра>/mymodule@v1.0.0
    ```

    Команда скачает модуль и добавит его в зависимости проекта. Для модулей версии 2 и выше укажите суффикс `/vN`, например `sample/module/v2@v2.0.0`.

#### Полезные ссылки {#see-also}

* [Пакеты (packages)](https://sourcecraft.dev/portal/docs/ru/sourcecraft/concepts/index.md#packages)
* [Создать реестр (registry) в SourceCraft](https://sourcecraft.dev/portal/docs/ru/sourcecraft/operations/packages-management.md)
* [Подключить реестр (registry) к репозиторию SourceCraft](https://sourcecraft.dev/portal/docs/ru/sourcecraft/operations/connect-registry.md)
* [Работать с реестром Binary](https://sourcecraft.dev/portal/docs/ru/sourcecraft/operations/configure-binary.md)
