2015-08-12 2 views
0

Я использую wgo для управления зависимостями в Golang (хотя я думаю, что ВГО имеет мало общего с этим), ВГО имеет структуру папок, как этотИспользование внешнего Завис в библиотеке

project/ 
    .gocfg/ 
     gopaths 
     vendor.json 
    vendor/ 
     src/ 
      github.com_or_whatever/ 

У меня есть библиотека Я закодирован себя, который использует nsq-go типа в одном из экспортированных методов:

func AddNsqSubscription(
    topic, channel string, 
    handler nsq.Handler, 
    config *nsq.Config) error { } 

библиотека называется messi и я импортировать nsq-go как так "messi/vendor/src/github.com/bitly/go-nsq"

Проблема возникает, когда я пытаюсь использовать эту библиотеку в другом проекте. Например, в проекте под названием scribe У меня есть следующий код (обратите внимание на импорт):

import (
    "scribe/vendor/src/github.com/bitly/go-nsq" 
    "scribe/vendor/src/messi" 
) 

//... 
nsqHandler := nsq.HandlerFunc(func(message *nsq.Message) error { 
    msgHandler(MessiMessage{message}) 
    return nil 
}) 

return messi.AddNsqSubscription(destination, subdestination, nsqHandler, nsq.NewConfig()) 

Когда я go build возвращается следующее сообщение об ошибке:

не может использовать nsqHandler (тип "scribe /vendor/src/github.com/bitly/go-nsq".HandlerFunc) как тип «messi /vendor/src/github.com/bitly/go-nsq".Handler в аргументе для messi.AddNsqSubscription: "писар/поставщик/src/github.c ом/Bitly/идти-NSQ ".HandlerFunc не реализует "Messi/поставщик/SRC/github.com/Bitly/гоу-NSQ" .Handler (неправильный тип для метода HandleMessage)

имеют HandleMessage (" писец /vendor/src/github.com/bitly/go-nsq".Message) ошибка
хотят HandleMessage (
"Messi /vendor/src/github.com/bitly/go-nsq". Сообщение)

Почему ? Я не знаю, что происходит. Код go-nsq импортирован точно так же, но golang хочет, чтобы этот код происходил из одной и той же папки?

Что я делаю неправильно?

+2

AFAIK Лучшая практика считается не продажей deps в библиотеках, а только в приложениях, чтобы избежать этих ситуаций. Это то, что я лично делаю. –

+0

@Not_a_Golfer Как мне управлять зависимостью go-nsq в библиотеке? – eversor

+1

просто импортируйте пути as-is (github.com/foo/bar), и пусть разработчик приложения-поставщика все депонирует так, как они хотят - например, с переписыванием пути или без него. –

ответ

2

Пакеты в Go идентифицируются по полному пути импорта, а не по имени.

Например, в стандартной библиотеке имеются два разных пакета с одинаковым именем template, но разные пути импорта: text/template и html/template.

Вы должны убедиться, что пакет go-nsq импортирован по тому же пути.

+0

Как я могу решить эту проблему, которую у меня есть? – eversor

+0

В библиотеке 'messi' вам не должно быть зависимо от поставщика. Продайте их в проекте, который использует библиотеку. – kostya

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