Использование инструмента обложки Go 1.2 с GVM

Я использую GVM для управления установками и путями go, и все, кажется, работает нормально - я могу запускать тесты и создавать сборки. Я сейчас пытаюсь создать файл покрытия кода, и у меня возникли некоторые трудности.

Мой пакет определен в /home/bill/dev/server/model,

Когда я бегу:

$ go test -cover -coverprofile cover.out

Тесты пройдены успешно и создан файл покрытия. Однако пути в файле покрытия выглядят так:

_/home/bill/dev/server/model/activity.go:19.34,21.2 1 1

И я получаю следующую ошибку при попытке создать HTML-файл обложки:

$ go tool cover -html=cover.out

cover: can't find "activity.go": cannot find package "_/home/bill/dev/server/model/" in any of:
    /home/bill/.gvm/gos/go1.2/src/pkg/_/home/bill/dev/server/model (from $GOROOT)
    /home/bill/.gvm/pkgsets/go1.2/global/src/_/home/bill/dev/server/model (from $GOPATH)

Как это исправить?

Дополнительные детали

~ gvm use go1.2
Now using version go1.2

~ echo $GOPATH
/home/bill/.gvm/pkgsets/go1.2/global

~ echo $GOROOT
/home/bill/.gvm/gos/go1.2

Я попытался вручную установить $GOPATH, но это не изменило файл cover.out. Я также попытался вручную отредактировать файл cover.out, но я не могу понять, какие пути он на самом деле хочет. В конфигурации по умолчанию, показанной выше, работает go test работает как ожидалось.

Попытка исправить GOPATH

~ export GOPATH=/home/bill/dev/
~ ln -s /home/bill/dev/server /home/bill/.gvm/gos/go1.2/src

~ go test
cannot find package "code.google.com/p/go.crypto/pbkdf2" in any of:
/home/bill/.gvm/gos/go1.2/src/pkg/code.google.com/p/go.crypto/pbkdf2 (from $GOROOT)
/home/bill/dev/src/code.google.com/p/go.crypto/pbkdf2 (from $GOPATH)
../util/log.go:4:2: cannot find package "github.com/kr/pretty" in any of:
/home/bill/.gvm/gos/go1.2/src/pkg/github.com/kr/pretty (from $GOROOT)
/home/bill/dev/src/github.com/kr/pretty (from $GOPATH)

Это дополнительные зависимости, которые я ранее загружал, используя go get, Они заканчиваются в /home/bill/.gvm/pkgsets/go1.2/global/src, на который указывал $GOPATH. Так что я изменил GOPATH

~ export GOPATH=/home/bill/dev/:/home/bill/.gvm/pkgsets/go1.2/global

Так что тесты запускаются снова, но файл cover.out по-прежнему содержит те же каталоги и выдает мне ту же ошибку.

4 ответа

Решение

У меня была такая же проблема месяц назад. Я решил это с помощью следующих шагов.

Имя моего пакета называется alpaca

Мой рабочий каталог (код) /home/pksunkara/coding/alpaca

$ gvm use go1.2
Now using version go1.2

$ echo $GOPATH
/usr/local/lib/gvm/pkgsets/go1.2/global

$ echo $GOROOT
/usr/local/lib/gvm/gos/go1.2

Чтобы исправить проблему, я сделал это

$ mkdir -p $GOPATH/src/github.com/pksunkara
$ ln -s /home/pksunkara/coding/alpaca $GOPATH/src/github.com/pksunkara/alpaca

В основном я должен связать текущую рабочую папку в $GOPATH/src папка и результирующий путь к пакету для alpaca стал github.com/pksunkara/alpaca,

Теперь go test & cover работает следующим образом

$ go test -coverprofile=coverage.out github.com/pksunkara/alpaca
$ go tool cover -html=coverage.out

ЭТО ВАЖНО

Я много споткнулся, чтобы это исправить. Я пытался все виды вещей, в том числе те, которые вы пытались. Я понял проблему, прочитав об организации кода в golang, который должен прочитать каждый, кто работает с go.

Упомянутая здесь организация кода очень важна для работы с golang.

Пути пакета важны для Голанга. И вы никогда не должны использовать локальный путь при импорте в golang. Они будут работать, но это не рекомендуется.

Давайте предположим, что ваше имя пакета model, Вы можете просто связать model каталог для $GOPATH/src/model и тогда у вас будет путь к пакету с именем model которые вы можете импортировать с помощью import "model", Но чтобы избежать коллизий, go рекомендует использовать более крупный путь к пакету.

Я бы порекомендовал вам связать его с $GOPATH/src/bill.com/server/model и импортировать его как import "bill.com/server/model", Аналогично с ./query а также ./util у тебя есть.

Если у вас все еще есть сомнения, пожалуйста, спросите. Я постараюсь объяснить больше.

Вот способ получить все преимущества GVM, не разрушая вашу идеальную среду разработки go, как описано здесь, и не прибегая к неуклюжим хакерским атакам на специальные символы.

Предположим, я настроил всю свою разработку в соответствии со стандартом в ~/go (так что пакет foo в моем GitHub будет в ~/go/github.com/gepoch/foo)

Прежде всего, мы собираемся создать специальный пакет pkgset, который будет рад ссылаться на нашу среду разработки. Просто запустите:

$ gvm pkgset create dev

Это добавит pkgset. Далее, мы можем сделать некоторые настройки того, куда именно он помещает путь перехода. Бежать:

$ gvm pkgenv dev

Вы должны увидеть ваш любимый текстовый редактор с открытым набором определений переменных среды. Просто измените GOPATH запись для включения вашего корня разработчика! Например, я изменяю это:

export GOPATH; GOPATH="$GVM_ROOT/pkgsets/go1.2/dev"

В это:

export GOPATH; GOPATH="$GVM_ROOT/pkgsets/go1.2/dev:$HOME/go"

Кроме того, gvm правильно настроил ваш путь, изменив это:

export PATH; PATH="${GVM_ROOT}/pkgsets/go1.2/global/bin:${GVM_ROOT}/gos/go1.2/bin:${GVM_OVERLAY_PREFIX}/bin:${GVM_ROOT}/bin:${PATH}"

в это:

export PATH; PATH="${GVM_ROOT}/pkgsets/go1.2/global/bin:${GVM_ROOT}/gos/go1.2/bin:${GVM_OVERLAY_PREFIX}/bin:${GVM_ROOT}/bin:${PATH}:$HOME/go/bin"

Перезапустите свой терминал, и все! Всякий раз, когда вы бежите $ gvm pkgset use dev у вас будет легкий доступ к вашей среде разработки.

Это означает (среди прочего), что это работает как задумано:

$ go test -coverprofile=coverage.out github.com/gepoch/foo
$ go tool cover -html=coverage.out

Вы можете добавить это в любую среду pkgset, которую вы пожелаете, для быстрого доступа к дереву разработчиков.

Вы пытались поставить проблему на сайте разработчиков gvm? https://github.com/moovweb/gvm (я не уверен, что это основной сайт)

Дважды проверьте значение $GOPATH, как установлено гвм.

Я бы попробовал установить $GOPATH вручную только для тестирования /home/bill (с символической ссылкой src->dev), просто чтобы увидеть, создает ли go-test -файл файлы cover.out с правильным ли в нем путем к файлу.

Другие вопросы по тегам