Использование инструмента обложки 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 с правильным ли в нем путем к файлу.