2016-12-12 4 views
0

давайте предположим, что у меня есть пакет mypackage, который предоставляет один метод, например Build(), которая возвращает конкретную-структуру открытой библиотекой третьей стороны, давайте называется thirdpartypackageGolang поставщика пакет с vendored суб-пакетов

Так, например, :

package mypackage 

import tpp "github.com/thirdpartycompany/thirdpartypackage" 

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

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

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

не может использовать XXXX (тип «GitHub. com/mycompany/mymainproject/vendor/github.com/mycompany/mypackage/vendor/github.com/ thirdcompany/thirdpartypackage-go ".Token) как тип" github.com/empatica/mycompany/vendor/github.com/thirdcompany/ thirdpartypackage "

В основном компилятор отличает сторонний пакет, поставляемый сторонними поставщиками, и пакет, который я положил в мой м ain project.

Есть ли способы решить эту проблему (которые не удаляют зависимые от поставщика зависимости из моей библиотеки, как предлагается here)? Или я чего-то не хватает?

Спасибо!

+1

Vendoring работает хорошо для команд и менее подходит для отдельных пакетов ... – Volker

+0

Можете ли вы указать свою точную структуру каталогов, ваша точка зрения не ясна –

+1

Вот почему большинство поставщиков инструментов сглаживают каталог поставщиков. Govendor делает это по умолчанию, я не уверен в других инструментах поставщика. Парадигма, которую я начал использовать для наших библиотек, предназначенных для импорта (в отличие от самих приложений), заключается в том, чтобы добавить '/ vendor/* /' в наш '.gitignore'. Это игнорирует подпапки в файлах '/ vendor /', но НЕ (например, 'vendor.json', для govendor). Затем Govendor изящно обрабатывает выравнивание дерева зависимостей, и ваша ошибка исчезает, потому что оба пакета теперь используют один и тот же полностью определенный путь импорта для пакета структуры. – Kaedys

ответ

0

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

Code below a directory named "vendor" is importable only by code in the directory tree rooted at the parent of "vendor", and only using an import path that omits the prefix up to and including the vendor element.

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

You can understand this samely to as Protected feature

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^