# Go Modules

{% embed url="<https://github.com/golang/go/wiki/Modules>" %}

{% embed url="<https://golang.org/ref/mod>" %}

## Go Modules

* `go mod init <import-name>` - создает новый модуль
* Standard commands like `go build` or `go test` will automatically add new dependencies as needed to satisfy imports (updating `go.mod` and downloading the new dependencies).

{% embed url="<https://encore.dev/guide/go.mod>" %}

* Что бы импортировать модуль -- он должен быть published
* `go get <url>` забирает последнюю версию модуля и обновляет `go.sum`
* `go get -u` - обновить модуль до последней минорной или патч версии
* `go get -u=patch` - обновить модуль до последней патч версии
* `go get package@v1.2.3` - обновится до конкретной версии
* `go get package@<commit-has>`- взять версию пакета по конкретному коммиту.
* `go get ./...`, `go mod download` - загрузит все зависимости в случае свежего репозитория (аналогично `npm install`). Так же зависимости будут установлены когда выполняется `go run` или `go build`, но нужно очистить кэш `go clean -cache -modcache -i -r`.&#x20;
* `go list -m -version <package-name>` - список версий пакета

```
go get -d -u ./...                        # upgrade all modules used in subdirs

go get -d github.com/dep/legacy@none      # remove dep
```

Нет автоматического способа обновится на другую мажорную версию. С точки зрения Go модулей, мажорная версия — это совершенно *другой пакет*.&#x20;

Есть у вас есть модуль, то версия модуля делается путем добавления git tag-а и отправки его в репозиторий:

```bash
$ git commit -m "Release v1.0.0"
$ git tag v1.0.1
$ git push --tags origin v1
```

**Версии 2&#x20;*****и более*****&#x20;должны сменить путь импорта.** Теперь это разные библиотеки. Мы сделаем это добавив новый *версионный путь* к названию нашего модуля.

```go
module github.com/user/module/v2
```

Чтобы обновиться, надо соответствующим образом изменить мою программу:

```go
import "github.com/robteix/testmod/v2"
```

* `go mod tidy` чистит зависимости
* `go mod why <module>` - скажет как этот модуль используется

On a more general note, the purpose of `go mod tidy` is to also add any dependencies needed for other combinations of OS, architecture, and build tags. **Make sure to run this before every release**.

By default all our packages from all projects are downloaded into `$GOPATH/pkg/mod` directory. If you use Docker containers when developing stuff locally, this may become an issue because dependencies are stored outside of project path (shared with a host filesystem via a bind-mounted volume).

1. Set `GOPATH` to the project
2. Another way is to copy over your project dependencies to *vendor* folder.

## Vendoring

* `go mod vendor` - создаст каталог vendor с исходниками зависимостей.&#x20;
