2015-08-23 2 views
2

Существует много вопросов по этому вопросу, в том числе почему вы не должны использовать import "./my/path" и почему это работает только потому, что это требует код устаревшего кода.как обращаться с импортом абсолютных путей и вилок github?

Если это так, как вы обрабатываете инкапсуляцию проекта и расширения виджетами github? В каждом другом языке я могу сделать виртуализацию проекта, или git clone, и там все инкапсулировано. Как мне получить такое же поведение из проекта go?

Простой пример с использованием примера «привет мир».

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/? Мне нужно менять каждый каждый раз, когда кто-то вилки? Это много посторонних изменений и бессмысленный git commit.

Что мне здесь не хватает? Почему относительные пути такие плохие? Как переделать проект, который ссылается на его собственные вспомогательные каталоги (и их пакеты), не меняя десятки файлов?

ответ

3

Что касается рассуждений за не допуская относительного импорта, вы можете прочитать эту дискуссию по какой-то точки зрения: https://groups.google.com/forum/#!msg/golang-nuts/n9d8RzVnadk/07f9RDlwLsYJ

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

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

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

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

[EDIT] Я также нашел этот инструмент, который разработан, чтобы помочь с этой ситуацией: https://github.com/rogpeppe/govers

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

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

+0

Таким образом, идея о пакете абсолютно. Период. Вы можете размещать каталоги выше/ниже друг друга, но если одно требует другого, и не находится в одном пакете, это абсолютный импорт. Это означает, что вы не создаете программное обеспечение, состоящее из пакетов, которые собираются вместе и не являются абсолютными, или принимают много расточительных перезаписей. Я не понимаю. Разве они не думали об этом, когда они проектировали пространство имен пакетов? – deitch

+0

Философия Google в этом заключается в том, что они продают все в одно дерево источников и все. Таким образом, это делает эту идею взаимозависимостей forking зависимыми, так как каждая зависимость уже разветвлена ​​в некотором смысле. –

+0

Это смешно, потому что я вот-вот раскошу библиотеку, и я не уверен, куда идти :) –

Смежные вопросы