Почему многие проекты Golang напрямую импортируются из GitHub? - PullRequest
0 голосов
/ 19 октября 2018

Я совершенно новичок в golang, и мне интересно, почему многие проекты golang пишут в своем исходном коде так:

import  "github.com/stretchr/testify/assert"

Что если этот testify переместился в bitbucket?

Почему бы не скачать свидетельство и import testify, как и другие языки?

Ответы [ 3 ]

0 голосов
/ 19 октября 2018

почему бы не скачать свидетельство и импортировать свидетельство, как и другие языки?

Некоторые библиотеки будут делать это (я имею в виду загрузку), поскольку Go не имеет надлежащего управления пакетами иобходным путем было использование техники под названием vendoring , которая в основном означала клонирование / создание снимка кода, где бы он ни существовал, и использование этой структуры пакета в ваших операторах импорта

Недостатокэтот подход заключается в том, что вы будете явно проигрывать в последних обновлениях до повторения этого процесса, и вы не всегда гарантируете, что код, который вы извлекаете, является стабильным выпуском

0 голосов
/ 19 октября 2018

Этот вопрос вызывает серьезную обеспокоенность в отношении проектирования путей импорта в го.Как упоминалось в @xpare, go переносит зависимости в ваш локальный $ GOPATH.Но вопрос OP не был полностью решен.

Да, если авторы / сопровождающие github.com/stretchr/testify переместили пакет в bitbucket, то это вызовет проблему.Это может не вызвать проблемы на вашем компьютере, поскольку у вас есть зависимости на вашем компьютере, но это вызовет проблему для всех, кто хочет внести свой вклад в приложение.Мало того, но это также вызовет проблемы на сервере сборки, если сервер сборки будет каждый раз вытягивать зависимости.

Даже если люди не часто переходят с github на bitbucket, это оказалось все ещебеспокойство.Когда Microsoft купила github, многие пакеты перешли к другим поставщикам.Нет гарантии, что какой-либо провайдер, github или другие, сохранит те же цены, то же качество обслуживания, те же функции и т. Д. Это неизбежно, что все будет двигаться.

Не только это, но ичто авторы иногда перемещают пакеты в другое место в github под другим пользователем.Это тоже случается.

Так это проблема?Да, хотя дизайн URL-адресов импорта в go позволяет четко указывать зависимости, недостатком является то, что при перемещении пакета код должен меняться.Вендоринг помогает сделать приложение устойчивым к этим изменениям, но вендинг не помогает, если вы хотите обновить пакет.

При разработке go требовалось децентрализованное управление пакетами.Такая конструкция имеет иммунитет к таким проблемам, как перерыв многих приложений НПХ в связи с НПМ спорно удаление Kirk пакета .Так что, если люди не согласны с философией npm, это будет большой проблемой.Но если людям не нравится github, они обычно переходят к другим провайдерам, и пакеты всегда будут там (на ходу это приведет к изменению исходного кода).Из-за этого golang не гарантирует, что все имена пакетов будут уникальными, и, следовательно, необходим полный путь импорта.

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

0 голосов
/ 19 октября 2018

Прежде чем я отвечу на ваш вопрос, вам необходимо понять, как golang управляет своими пакетами и зависимостями.


Чтобы загрузить пакеты, используйте команду go get.Пример использования:

$ go get github.com/stretchr/testify

Приведенная выше команда загружает пакет testify, а затем сохраняет его локально в рабочем пространстве со структурой, следующей за его URL ( TL; DR путь к рабочему пространствузарегистрирован как $GOPATH переменная env).

$GOPATH/src/github.com/stretchr/testify

Объяснение из документа , почему имя загруженного пакета будет следовать за его URL:

Получитьзагружает пакеты, названные путями импорта, вместе с их зависимостями.


Теперь о вашем вопросе:

Почему многие проекты golang напрямую импортируются из GitHub?

Заявление import "github.com/stretchr/testify/assert" не означает, что пакет напрямую импортируется с веб-сайта github (через http) .Он импортирован из вашего локального, с github.com/stretchr/testify пути в $GOPATH/src.Пакет был загружен и сохранен там ранее, поэтому его можно импортировать в любой проект.

Ниже приведено объяснение документации об операторах импорта:

Путь Go ($GOPATH) используется для разрешения операторов импорта.

Также взгляните на приведенный ниже код (взят из моего локального).

$ echo $GOPATH
/Users/novalagung/Documents/go

$ go get -u github.com/stretchr/testify
# package will be downloaded into $GOPATH/src folder using the same structure as the github url

$ tree -L 1 $GOPATH/src/github.com/stretchr/testify
/Users/novalagung/Documents/go/src/github.com/stretchr/testify
├── Gopkg.lock
├── Gopkg.toml
├── LICENSE
├── README.md
├── _codegen
├── assert
├── doc.go
├── http
├── mock
├── package_test.go
├── require
├── suite
└── vendor

Итакесли вы хотите импортировать какие-либо пакеты, он должен находиться в папке $GOPATH/src.


что, если это свидетельство перемещено в bitbucket?

Это не имеет никакого эффектав вашем локальном проекте, потому что требуемый пакет уже загружен ранее.Однако, если вы хотите обновить его, вам может понадобиться изменить путь к пакету, чтобы он соответствовал его новому URL, например, bitbucket.org/stretchr/testify/assert?зависит от того, как выглядит новый URL-адрес bitbucket.

Но я не думаю, что владелец свидетельства сделает это, так как это сломает много людей кодов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...