Как обрабатывать 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/

Лично я предпочел бы, чтобы они были включены, по крайней мере для внутреннего импорта, именно по той причине, которую вы описываете.

Теперь, как справиться с ситуацией?

  1. Если ваш форк - это всего лишь небольшое исправление из другого проекта, который, вероятно, скоро будет принят в качестве пиара - просто отредактируйте git remotes так, чтобы он ссылался на ваше собственное git-репо, а не на оригинальный. Если вы используете вендорное решение, такое как godep, оно будет работать бесперебойно, так как при его сохранении будет продаваться только разветвленный код go get никогда не используется напрямую.

  2. Если ваш форк - большое изменение, и вы намерены остаться разветвленным, перепишите все пути импорта. Вы можете автоматизировать это с sed или вы можете использовать gofmt -r это поддерживает переписывание кодируемого кода.

[РЕДАКТИРОВАТЬ] Я также нашел этот инструмент, который разработан, чтобы помочь в этой ситуации: https://github.com/rogpeppe/govers

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

Я также могу подумать о дополнении к инструментам для продажи, позволяющим автоматизировать этот материал, но я не думаю, что кто-либо из них поддерживает его в настоящее время.

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