Обычно используемый геймплей при разработке модов для Go — обязательное условие для разработки

Go

что такое го мод

go modulesЭто новая функция, добавленная в golang 1.11.

Итак, вопрос в том, какую проблему он решает?На самом деле, основная проблема в том, что он может не иметь понятия GoPath, поэтому он очень удобен, но когда вы не знаете, как его использовать, вы будете думать, что это очень сложно использовать.

PS: После создания файла go.mod его содержимое будет полностью контролироваться цепочкой инструментов go. Цепочка инструментов go будет изменять и поддерживать файл go.mod при выполнении различных команд, таких как go get, go build и go mod.

Простой в использовании

Например, теперь есть требование, что мы хотим создать новый проект с именем проекта go-kit-demo, В настоящее время нам нужны зависимости go-kit, так что же нам делать?

первый шаг

% mkdir go-kit-demo

% cd go-kit-demo

% go mod init go-kit-demo // 初始化一个项目名为 go-kit-demo,这个路径其实是你相对于GOPATH的路径,以后你的包就是 import "go-kit-demo/util" 之类的

% ls
go.mod // 发现多了个文件

% cat go.mod
module go-kit-demo // 模块名字

go 1.13 // go版本

% go mod edit -require=github.com/go-kit/kit@latest //添加go-kit的依赖

% go mod download //下载依赖

% cat go.mod
module go-kit-demo

go 1.13

require github.com/go-kit/kit v0.10.0 // indirect

% ls
go.mod    go.sum//校验包

Второй шаг — действительно нужен код, чтобы редактор мог его найти.Очевидно, что текущая официальная версия go не поддерживает его, и требуется третья сторона.

Но напрямую использовать go-kit здесь нельзя, причина в том, что инструмент goland не поддерживает такого рода зависимости модулей, поэтому его нужно внедрить в вендор, т.е.

Здесь рекомендуется инструмент, который может упаковать зависимости в поставщика, что довольно приятно.

https://github.com/nomad-software/vend

Просто приходите по запросу

go get github.com/nomad-software/vend

как ниже

~/go/code/mode-test % vend
vend: copying cloud.google.com/go (v0.34.0)
vend: copying github.com/BurntSushi/toml (v0.3.1)
vend: copying github.com/Knetic/govaluate (v3.0.1-0.20171022003610-9aa49832a739+incompatible)
vend: copying github.com/Shopify/sarama (v1.19.0)
vend: copying github.com/Shopify/toxiproxy (v2.1.4+incompatible)
vend: copying github.com/VividCortex/gohistogram (v1.0.0)
vend: copying github.com/afex/hystrix-go (v0.0.0-20180502004556-fa1af6a1f4f5)
vend: copying github.com/alecthomas/template (v0.0.0-20190718012654-fb15b899a751)
vend: copying github.com/alecthomas/units (v0.0.0-20190717042225-c3de453c63f4)
vend: copying github.com/apache/thrift (v0.13.0)
vend: copying github.com/armon/circbuf (v0.0.0-20150827004946-bbbad097214e)

Так что это все еще очень удобно, вы можете скопировать все зависимости поставщику и можете использовать его с удовольствием.

другие команды

Например, проблема внутренних источников нуждается в пересмотре.

export GOPROXY=https://goproxy.cn

Во-вторых, например, младшую версию го, возможно, нужно будет принудительно открыть для го мода.

export GO111MODULE=on

Как и другие команды, я не буду их представлять, например, это могут быть часто используемые команды, такие какgo mod vendor, Скопируйте зависимости в каталог vendor, но есть проблема, что он копирует только то, от чего зависит код, поэтому нам иногда это неудобно, поэтому нужно использовать инструменты, которые я рекомендовал выше.

Например

go get github.com/go-kit/kit //此时会在go.mod文件中添加依赖,也就是说不需要手动的去执行 go mod edit -require=github.com/go-kit/kit@latest了

и другие команды

Go mod provides access to operations on modules.

Note that support for modules is built into all the go commands,
not just 'go mod'. For example, day-to-day adding, removing, upgrading,
and downgrading of dependencies should be done using 'go get'.
See 'go help modules' for an overview of module functionality.

Usage:

	go mod <command> [arguments]

The commands are:

	download    download modules to local cache//下载
	edit        edit go.mod from tools or scripts//编辑go.mod
	graph       print module requirement graph// 打印依赖
	init        initialize new module in current directory //初始化
	tidy        add missing and remove unused modules // 删除没用的依赖
	vendor      make vendored copy of dependencies // copy到vendor
	verify      verify dependencies have expected content // 校验
	why         explain why packages or modules are needed

Use "go help mod <command>" for more information about a command.

go.mod предоставляетmodule, require,replaceа такжеexcludeчетыре команды

  • moduleОператор указывает имя пакета
  • requireмодуль зависимости, указанный оператором
  • replaceОператоры могут заменять модули зависимостей
  • excludeоператор для игнорирования модулей зависимостей

На самом деле, они не нуждаются в уходе

Как решить локальный склад

Спрос, у нас сейчас есть еще один проект, который нам нужно внедрить в этот проект.

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

Инициализируйте проект A\B с именами demo-1, demo-2.

~/go/code/test % cd demo-1
~/go/code/test/demo-1 % ls
~/go/code/test/demo-1 % go mod init demo-1
go: creating new go.mod: module demo-1

Наша текущая структура каталогов выглядит так:

~/go/code/test % tree .
.
├── demo-1
│   └── go.mod
└── demo-2
    ├── api
    │   └── userservice.go
    └── go.mod

3 directories, 3 files

Сейчас мы демо-1 этого проекта, нам нужно использовать интерфейс пользовательского сервиса

package api

type UserService interface{
	GetUserInfo()*UserInfo
}

type UserInfo struct{
	Name string `json:"name"`
	Age  int  `json:"age"`
}

На данный момент вам нужно только сделать замену в демо-1, как показано на следующем рисунке.

module demo-1

go 1.13

require demo_2 v0.0.0

replace demo_2 => ../demo-2

Тогда мы demo-1 можно использовать с удовольствием

package main

import (
	"demo_2/api"
	"fmt"
)

func main() {
	info := api.UserInfo{
		Name: "tom",
		Age:  18,
	}
	fmt.Println(info)
}

Так что в реальности пакет зависимостей может обновляться, а мастер нужно вовремя подтягивать.Что делать с этим обновлением очень просто, достаточно выполнитьgo mod vendorВытащите его из нового

Обратите внимание, что локальные пакеты не могут проверять хэш

Почему вы должны использовать каталог поставщиков

  • 1. Зависимости могут быть локальными или частными складами, которые не могут быть разрешены
  • 2. Рабочая среда может работать медленно
  • 3. Общего решения нет, ждите пока разработают в будущем

вgo build -mod=vendorЭто значит включить режим Vendor, в зависимости от каталога Vendor, а другой не будет Care, и он не онлайн.

Как решить частный склад

Все публичные репозитории хороши, но как насчет приватных?

Эти три схемы теоретически осуществимы, но все они имеют недостатки.

Сам по себе прокси goproxy не решает проблему получения приватного кода проекта с сервера gitlab и не имеет отработанного механизма аутентификации. Поэтому он больше подходит для статического публичного кода.

Примеры можно увидеть:goproxy.cn/

Прокси nginx тоже не решает проблему аутентификации.Настроил прокси, а аутентификация ssl не удалась(слабая курица).По идее это решение лучшее решение.

go replace нужно добавлять в каждый проект, а обновлять зависимости сложнее.

Таким образом, используется решение, или местная зависимость.

В настоящее время онлайн-решения заключаются в изменении локального git, конфигурации и Baidu путем настройки некоторой информации, но проблемы все еще есть. Лучше построить прокси.Чтобы решить эту проблему с прокси-слоя, вы можете обратиться к прокси-серверу выше.