Как обрабатывать Go Импорт абсолютных путей и вилок Github?
Есть много вопросов по этому поводу, в том числе, почему вы не должны использовать import "./my/path"
и почему это работает только потому, что некоторый устаревший код go требует этого.
Если это правильно, как вы справляетесь с инкапсуляцией проекта и расширением github? На любом другом языке я могу сделать github-форк проекта или git clone, и там все заключено в капсулу. Как я могу получить то же поведение из проекта Go?
Простой пример, использующий пример "Hello World".
hello.go
package main
import ("fmt"
"github.com/golang/examples/stringutil")
func main() {
fmt.Printf(stringutil.Reverse("hello, world")+"\n")
}
Выше работает отлично. Но если я хочу использовать свой собственный stringutil, который находится в подкаталоге и скомпилируется в один двоичный файл, мне все равно нужен полный путь:
package main
import ("fmt"
"github.com/myrepo/examples/util/stringutil")
func main() {
fmt.Printf(stringutil.Reverse("hello, world")+"\n")
}
Теперь, если кто-то копирует или разветвляет мое репо, он имеет прямую зависимость от "github.com/myrepo/", даже если это полностью используется внутри компании!
Что делать, если есть 20 различных файлов, которые импортируют utils/
? Мне нужно менять каждый раз, когда кто-то разветвляется? Это много посторонних изменений и бессмысленных мерзавцев.
Что мне здесь не хватает? Почему относительные пути такие плохие вещи? Как раскошелиться на проект, который ссылается на собственные дочерние каталоги (и их пакеты), не меняя десятки файлов?
1 ответ
Что касается причин, запрещающих относительный импорт, вы можете прочитать это обсуждение с некоторой точки зрения: https://groups.google.com/forum/
Лично я предпочел бы, чтобы они были включены, по крайней мере для внутреннего импорта, именно по той причине, которую вы описываете.
Теперь, как справиться с ситуацией?
Если ваш форк - это всего лишь небольшое исправление из другого проекта, который, вероятно, скоро будет принят в качестве пиара - просто отредактируйте git remotes так, чтобы он ссылался на ваше собственное git-репо, а не на оригинальный. Если вы используете вендорное решение, такое как godep, оно будет работать бесперебойно, так как при его сохранении будет продаваться только разветвленный код
go get
никогда не используется напрямую.Если ваш форк - большое изменение, и вы намерены остаться разветвленным, перепишите все пути импорта. Вы можете автоматизировать это с
sed
или вы можете использоватьgofmt -r
это поддерживает переписывание кодируемого кода.
[РЕДАКТИРОВАТЬ] Я также нашел этот инструмент, который разработан, чтобы помочь в этой ситуации: https://github.com/rogpeppe/govers
Я сделал и 1 и 2 - когда у меня была небольшая ошибка в какой-то библиотеке, я просто сменил пульт и проверил его. Когда я на самом деле разветвлял библиотеку без намерения объединить свои изменения обратно, я изменил все пути импорта и продолжал использовать только мое хранилище.
Я также могу подумать о дополнении к инструментам для продажи, позволяющим автоматизировать этот материал, но я не думаю, что кто-либо из них поддерживает его в настоящее время.