Используйте golang - пакеты Debian при программировании Go - PullRequest
0 голосов
/ 06 мая 2020

Чтобы понять этот вопрос Go, необходимо сначала немного понять суть пакетов Go модулей Debian. По сути, пакеты Debian модуля Go разработаны таким образом, что они могут использоваться только самими пакетами Debian, но не для наших ежедневных Go import.

Однако, поскольку это всего лишь файлы в файловой системе моей ОС, безусловно, есть способы, которыми мы можем использовать пакеты Debian в наших ежедневных Go import. Кто-нибудь успешно делал это раньше?

Причина, по которой я спрашиваю, заключается в том, что существует множество репозиториев github, содержащих ОГРОМНЫЕ модули, но мне нужна только крошечная / небольшая их часть, в то время как эта часть уже была упакована как пакет Debian. То есть, использование go get даст мне огромную базу кода, которая мне почти не нужна, а apt get может дать мне именно то, что мне нужно, если я смогу это использовать.

1 Ответ

3 голосов
/ 06 мая 2020

AFAIK, вам нужно добавить /usr/share/gocode к вашей переменной среды GOPATH (после вашего личного рабочего пространства Go, разделенного :), чтобы эти пакеты были доступны для go toolchain.

Пожалуйста, обратитесь к этому руководству (и посмотрите, что dpkg -L выводит для любого установленного Go пакета библиотеки, представляющего интерес - вы увидите, что путь импорта пакета действительно расположен под /usr/share/gocode/src).


(Чтобы подробнее рассказать о том, что @Flimzy предложил в своем комментарии к исходному сообщению, а @JimB расширился в своем…)

Возможно, вам потребуется четко сформулируйте для себя, в чем заключаются ваши намерения при разработке.

«Проблема» в том, что существует определенное замешательство в подходах Debian и Go к управлению зависимостями:

  • Общая практика, предлагаемая сообществом Go, состоит в том, чтобы либо исправить определенные версии ваших зависимостей (в наши дни - с помощью go модулей ), либо позволить инструментальной цепочке получить и установить их. или продавать свои зависимости - что логически одно и то же, но в этом случае вы фактически несете эти зависимости как часть своей кодовой базы (они просто находятся в определенном каталоге c).

    первый предлагается для библиотечного кода и, как правило, кода, который предоставляется для повторного использования третьими сторонами, в то время как последний обычно используется в «конечных» продуктах (обычно разрабатываемых собственными силами).

  • Подход, принятый Debian, основан на интеграции : они по понятным причинам отвергают идею неконтролируемого встраивания зависимостей и стараются убедиться, что все, что «обратно зависимо» от чего-либо еще, правильно упаковано, и в идеале только единственная версия данной библиотеки существует в любом конкретном выпуске ОС (хотя это не всегда возможно в реальной жизни).

Ни один из подходов в конечном итоге не является «правильным», потому что они обслуживают для разных вариантов использования.

Важно учитывать, что большинство (i е не все) команды, пишущие отраслевой код на Go, рассматривают базовую ОС как скучную деталь реализации - например, blob «чего-то», что не слишком интересно и просто необходимо для запуска целевой продукт (в наши дни этот подход доведен до крайности за счет использования контейнеров) и самостоятельно управлять их зависимостями.
Почему это так?
Это философский вопрос. Я думаю, что это в основном сводится к общему отсутствию на предприятиях должным образом квалифицированных специалистов для правильной интеграции с целевой платформой, и в то же время - к простоте поддержки ваших собственных проверенных и проверенных версий ваших зависимостей, а не предоставленных. дистрибутивом.

Теперь давайте посмотрим на библиотеки Go, упакованные в Debian из другого региона.
Упаковщики Debian решают свою задачу интеграции c, упаковывая пакеты Go библиотек в способ, который делает их доступными для помощников сборки Debian (см. dh-golang). То есть в Debian, когда вы готовите пакет какой-то программы, написанной на Go, вы неизбежно будете использовать эту dh-golang вещь, которая гарантирует, что набор инструментов Go вызывается таким образом, чтобы он мог использовать установленные пакеты. .

Теперь примите во внимание, что довольно значительная часть кода библиотеки Go, и многие исполняемые программы не зависят от платформы c, и , если вы пишете код Go, который предназначен для общего использования и, следовательно, будут где-то опубликованы (например, в некоторых популярных Git хостинговых решениях), гораздо лучше сохранить код организованным таким образом, чтобы любой разработчик мог просто взять его и иметь возможность работать над без специальной подготовки.

Итак, я веду вас к тому, что, если вы не пишете код, который определенно будет использоваться в Debian, ваш подход может быть правильным, но если вы пишете «обычный «Код Go, я бы рекомендовал разделить задачи« написание + поддержка кода »и« интеграция с Debian »- то есть напишите свой код так, как рекомендует Go сообщество, а затем напишите пакет Debian, который использует установленные зависимости.
Обратите внимание, что для последнего вам может потребоваться фактически упаковать все недостающие зависимости.

...