2017-01-12 2 views
0

У меня есть идти проект, имеющий следующие пакеты: -Использование вложенных каталогов поставщика в ходе 1.7

go list ./... | grep -v /vendor/ 

github.com/jab/JSes 
github.com/jab/JSes/src/common/config 
github.com/jab/JSes/src/common/logger 
github.com/jab/JSes/src/common/monitor 
github.com/jab/JSes/src/handlers/healthcheck 
github.com/jab/JSes/src/handlers/sessionuser 
github.com/jab/JSes/src/test/servicetest 

Все внешние dependensies добавляются в папке vendor: -

vendor/ 
    bitbucket.org 
     m 
      ses-ser 

Теперь ses-ser является имеющие следующие упаковки: -

ses-ser 
    vendor //Contains all the external dependencies 
    api 
    constants 
    exceptions 
    idgen 
    jsonDecoder 
    log 
    model 
    monitor 
    persistence 
    redis 
    routes 
    src/bddtest/servicetest 
    util 

Makefile выглядит следующим образом: -

.PHONY: deploy 

LOGLEVEL ?= 2 
GOFLAGS ?= $(GOFLAGS:) 

PKG = $(shell go list ./... | grep -v /vendor/ | tr "\n" " ") 
PWD = $(shell pwd) 

export GOPATH = $(PWD):$(shell echo $$GOPATH) 
export GOBIN = $(PWD)/bin 
export GOROOT = $(shell echo $$GOROOT) 

deploy: clean format build install conf 

build: 
    @rm -rf pkg/ 2>/dev/null 
    @rm -rf _libs/pkg/ 2>/dev/null 
    @go build $(GOFLAGS) $(PKG) 

Но делать make build я получаю ниже панику: -

jab-MacBook-Pro-4:JSe debraj$ make build 
panic: runtime error: slice bounds out of range 

goroutine 1 [running]: 
panic(0x3e1b40, 0xc420010130) 
    /usr/local/go/src/runtime/panic.go:500 +0x1a1 
main.vendoredImportPath(0xc4203df200, 0xc42037f301, 0x2f, 0x3, 0xc41fff4f00) 
    /usr/local/go/src/cmd/go/pkg.go:463 +0x66c 
main.loadImport(0xc42037f301, 0x2f, 0xc4201605b0, 0x64, 0xc4203df200, 0xc4201c99e0, 0xc42022f680, 0x1, 0x1, 0x1, ...) 
    /usr/local/go/src/cmd/go/pkg.go:333 +0x9ea 
main.(*Package).load(0xc4203df200, 0xc4201c99e0, 0xc420298e00, 0x0, 0x0, 0x4) 
    /usr/local/go/src/cmd/go/pkg.go:940 +0x12b6 
main.loadImport(0xc420356f01, 0x29, 0xc4203203c0, 0x45, 0xc4203de480, 0xc4201c99e0, 0xc4203570e0, 0x1, 0x1, 0x1, ...) 
    /usr/local/go/src/cmd/go/pkg.go:374 +0x470 
main.(*Package).load(0xc4203de480, 0xc4201c99e0, 0xc420293c00, 0x0, 0x0, 0x4) 
    /usr/local/go/src/cmd/go/pkg.go:940 +0x12b6 
main.loadImport(0xc42019c6b1, 0xd, 0xc42019e7c0, 0x33, 0xc4201ac480, 0xc4201c99e0, 0xc420192e70, 0x1, 0x1, 0x1, ...) 
    /usr/local/go/src/cmd/go/pkg.go:374 +0x470 
main.(*Package).load(0xc4201ac480, 0xc4201c99e0, 0xc420185180, 0x0, 0x0, 0xc) 
    /usr/local/go/src/cmd/go/pkg.go:940 +0x12b6 
main.loadImport(0x7fff5fbff891, 0x1a, 0xc420018044, 0x33, 0x0, 0xc4201c99e0, 0x0, 0x0, 0x0, 0x0, ...) 
    /usr/local/go/src/cmd/go/pkg.go:374 +0x470 
main.loadPackage(0x7fff5fbff891, 0x1a, 0xc4201c99e0, 0x0) 
    /usr/local/go/src/cmd/go/pkg.go:1658 +0x28f 
main.packagesAndErrors(0xc420152c80, 0x7, 0x7, 0xc42019c520, 0x20, 0x3f3e60) 
    /usr/local/go/src/cmd/go/pkg.go:1703 +0x337 
main.packagesForBuild(0xc42000c0b0, 0x7, 0x7, 0x493df8, 0xc420018180, 0x0) 
    /usr/local/go/src/cmd/go/pkg.go:1719 +0x75 
main.runBuild(0x628540, 0xc42000c0b0, 0x7, 0x7) 
    /usr/local/go/src/cmd/go/build.go:440 +0xd4 
main.main() 
    /usr/local/go/src/cmd/go/main.go:181 +0x624 
make: *** [build] Error 2 

Это, кажется, связано с 16656, который будет зафиксирован в Go 1.8.

В качестве обходного пути я попытался установить все внешние зависимости под _libs. И модифицирован в Makefile моего $GOPATH, как показано ниже: -

export GOPATH = $(PWD)/_libs:$(PWD)/_libs/src/bitbucket.org/m/ses-ser/vendor:$(PWD):$(shell echo $$GOPATH). 

Но тогда он начал давать мне ошибку, как показано ниже: -

src/handlers/healthcheck/health_check.go:23: cannot use func literal (type func(*"github.com/valyala/fasthttp".RequestCtx)) as type func(*"bitbucket.org/m/ses-ser/vendor/github.com/valyala/fasthttp".RequestCtx) in field value 

Может кто-то предложить как-нибудь обойти этот вопрос?

окружающей среды: -

  • go version go1.7.3 darwin/amd64
  • Mac OS X - Версия 10.11.6
+1

У вас никогда не должно быть вложенных каталогов поставщиков. Это также вызовет несоответствие типов, если один и тот же пакет будет продаваться несколько раз. – JimB

+0

'ses-ver' - это пакет, который я пытаюсь использовать в качестве зависимости для' JSes' и 'ses-ver' имеет всю свою зависимость от' vendor'. Поэтому я добавил 'ses-ver' под' vendor' в 'JSes'. Как же я разрешаю эту проблему? – tuk

+0

Вы выравниваете все зависимые от поставщика зависимости от верхнего уровня, либо вручную, либо с помощью таких инструментов, как govendor или godep. – JimB

ответ

1

В то время как сборка паника была ошибка, которая была исправлена, имея вложенные каталоги поставщиков приведет к типу конфликты между пакетами.

У вас должен быть только один каталог поставщиков для вашего проекта. Если какая-либо из ваших зависимостей имеет собственные каталоги поставщиков, их следует удалить и объединить в ваш единственный каталог поставщиков верхнего уровня.

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

+0

Я тоже столкнулся с этой проблемой и в итоге использовал инструмент скольжения, так как он содержит флаг «strip vendor» для установки зависимостей. – squiguy

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