Как работают пути пакетов go, когда каталог отличается? - PullRequest
0 голосов
/ 28 ноября 2018

Я немного взломал проект rclone , и я немного новичок.Я клонировал репозиторий в своем домашнем каталоге, /home/poundifdef/rclone.

. Когда я смотрю на файл, rclone.go, в каталоге верхнего уровня, я вижу следующую инструкцию импорта:

package main

import (
  _ "github.com/ncw/rclone/backend/all"
    "github.com/ncw/rclone/cmd"
  _ "github.com/ncw/rclone/cmd/all"
)

У меня такой вопрос: нигде в этом коде, насколько я могу судить, мы не указываем, что пакеты github.com/ncs/rclone/* должны ссылаться на локальные версии этих каталогов.Нигде в моей файловой системе я не использовал каталог с именем github.com/ncw.И все же, выполнение go run rclone.go способно выполнить этот код.

Где находится путь github.com/ncw/rclone, сопоставляемый с моим локальным каталогом, если эти пакеты, названные, не существуют?

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

github.com / ncw / rclone - это модуль , поскольку в корне хранилища находится файл с именем go.mod.Поскольку у вас установлено значение $GOPATH, функция экспериментального модуля включена.

Расположение модулей в вашей файловой системе не имеет значения.при построении путей импорта все имена каталогов в модуле добавляются к имени модуля.Имя модуля определяется в первой строке go.mod, здесь «github.com/ncw/rclone».Таким образом, пакет в ./cmd имеет путь импорта github.com/ncw/rclone/cmd.

Такие команды, как go build, go install, go test и т. Д., Автоматически загружают все остальные необходимые пакеты в $HOME/go/pkg/mod, если толькоуказывается флаг -mod=vendor, и в этом случае используются источники в vendor.

0 голосов
/ 28 ноября 2018

Golang имеет внутренний механизм для разрешения пути импорта.

Этот механизм основан на существовании нескольких переменных на вашем компьютере, GOROOT, GOPATH и для старых выпусков GO15VENDOREXPERIMENT.

Когда компиляторвстретить путь к пакету, он выполняет поиск по этим путям

  • GOROOT / src / [путь импорта]
  • GOPATH / src / [путь импорта]
  • cwd / vendor / [путь импорта]

Самый длинный путь побеждает и выбирается для дальнейшей обработки.

GOROOT - это путь к stdlib.GOPATH - это путь к вашему локальному рабочему пространству.

Для всех деталей https://go.googlesource.com/proposal/+/master/design/25719-go15vendor.md

Все зависит от настроек вашего компьютера, поэтому внимательно проверьте вывод go env.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...