Пакет поставщика Golang с подпакетами поставщиков

Ситуация:

Предположим, у меня есть пакет с именем mypackage. Он предоставляет один метод с именем Build(), который возвращает конкретную структуру, предоставленную сторонней библиотекой с именем thirdpartypackage, например. как показано ниже:

package mypackage

import tpp "github.com/thirdpartycompany/thirdpartypackage"

func Build() *tpp.SharedStruct{
   //...implementation
}

Пакет, раскрывающий SharedStruct, продается внутри mypackage, потому что я хочу распространять его и сделать этот пакет независимым.

Проблема:

После импорта mypackage в другой проект и использования thirdpartypackage в моих (интеграционных) тестах я получаю следующую ошибку:

нельзя использовать XXXX (введите "github.com/mycompany/mymainproject/vendor/github.com/mycompany/mypackage/vendor/github.com/ Thirdcompany/ ThirdPartypackage-go".Token) в качестве типа "github.com/empatica/mycompany/ поставщик/github.com/третья компания/третьипартипакет"

По сути, компилятор различает сторонний пакет в моей библиотеке и сторонний пакет, который я поместил в свой основной проект.

Вопрос:

Существуют ли способы решения этой проблемы, которые не удаляют зависимости от поставщиков из моей библиотеки, как предложено здесь? Я что-то упускаю?


person Alessio    schedule 12.12.2016    source источник
comment
Вендор хорошо работает для команд и хуже для отдельных пакетов...   -  person Volker    schedule 12.12.2016
comment
Можете ли вы указать точную структуру каталогов, ваша точка зрения не ясна   -  person Abhishek Soni    schedule 12.12.2016
comment
Вот почему большинство инструментов для вендоров сглаживают каталог вендоров. Govendor делает это по умолчанию, я не уверен в инструментах других поставщиков. Парадигма, которую я начал использовать для наших библиотек, предназначенных для импорта (в отличие от самих приложений), заключается в добавлении /vendor/*/ к нашему .gitignore. Это игнорирует вложенные папки в /vendor/, но НЕ файлы (например, vendor.json, для govendor). Затем Govendor изящно справляется с выравниванием дерева зависимостей, и ваша ошибка исчезает, поскольку теперь оба пакета используют один и тот же полный путь импорта для пакета структуры.   -  person Kaedys    schedule 12.12.2016


Ответы (1)


Я думаю, что вам не хватает этого момента:

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

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

Вы можете понять, что это похоже на функцию protected.

Поэтому, если вы хотите использовать эту версию в любом другом пакете, то этот vendor должен присутствовать на том же уровне. Например

ParentDirectory
 > mypackage
 > otherpackage (this will be importing mypackage)
 > vendor (vendor should be present in here so that all children under ParentDirectory can access this)

Я надеюсь, что я ясно с моей точки зрения.

person Abhishek Soni    schedule 12.12.2016