Приложение Packaging Go для Debian
Как я могу поместить my Go в пакет Debian? Поскольку Go статически связан, у меня просто один исполняемый файл - мне не нужно много сложной информации метаданных проекта. Есть ли простой способ упаковать исполняемые файлы и файлы ресурсов, не пройдя травму debuild
?
Я рассмотрел все существующие вопросы; тем не менее, все мои исследования вызывают вопросы/ответы о файле .deb, содержащем среду разработки golang (т.е. что вы получите, если будете делать sudo apt-get install golang-go
).
Ответы
Ответ 1
Ну. Я думаю, что единственная "травма" debuild
заключается в том, что она запускает lintian
после сборки пакета, а она lintian
пытается обнаружить проблемы с вашим пакетом.
Итак, есть два способа борьбы с ситуацией:
- Не используйте
debuild
: этот инструмент просто вызывает dpkg-buildpackage
, который действительно выполняет необходимую пауэрлифтинг. Обычный вызов для создания бинарного пакета - dpkg-buildpackage -us -uc -b
. Вы по-прежнему можете вызвать debuild
для других целей, например debuild clean
.
- Добавьте так называемый "lintian override" , который можно использовать, чтобы сделать
lintian
закрывать глаза на выбранные проблемы с вашим пакетом, который, вы настаиваете, не являются проблемами.
Оба подхода подразумевают, что вы не пытаетесь создать приложение с помощью упаковочных инструментов, а относитесь к нему как к блобу, который просто завернут в пакет. Это потребовало бы незначительного отклонения от обычного способа работы debian/rules
(чтобы не пытаться ничего построить).
Другим решением, которое может быть возможно (и это действительно больше Debian-ish), является попытка использовать gcc-go
(плюс gold
для привязки): поскольку он является интерфейсом GCC, этот инструмент производит динамически- (которое ссылается на libgo
или что-то вроде этого). У меня лично нет опыта с этим, и я буду рассматривать его только в том случае, если вы намереваетесь подтолкнуть свой пакет к самому Debian.
Что касается общего вопроса о упаковке Go программ для Debian, возможно, вам понадобятся следующие ресурсы:
- Этот поток начал работать на гайках одним из пакетов Go для Debian.
- В частности, первое сообщение в этом потоке связывается с этим обсуждением на debian-devel.
- Второй поток по debian-devel относительно этой же проблемы (это логическое продолжение предыдущего потока).
Обновить в 2015-10-15 годах.
(Поскольку этот пост, похоже, все еще находится в поиске, найден и изучен людьми, которых я решил обновить, чтобы лучше отразить текущее состояние дел.)
С тех пор ситуация с упаковкой Go приложений и пакетов значительно улучшилась, и можно создать пакет Debian с использованием "классического" Go (так называемого пакета gc
, исходящего из Google), а не gcc-go
.
И есть хорошая инфраструктура для пакетов.
Ключевым инструментом, который будет использоваться при девиации программы Go, теперь dh-golang
описан здесь.
Ответ 2
Я просто изучал это сам, и я в основном там.
Описание
Посредством "заимствования" из ветки "package" из одного из канонических существующих проектов Go вы можете создать свой пакет с помощью dpkg-buildpackage.
-
установить зависимости и захватить ветвь 'package' из другого репо.
# I think this list of packages is enough. May need dpkg-dev aswell.
sudo apt-get install bzr debhelper build-essential golang-go
bzr branch lp:~niemeyer/cobzr/package mypackage-build
cd mypackage-build
-
Отредактируйте метаданные.
- изменить файл debian/control (имя, версия, источник). Вам может потребоваться изменить стабильную стабильность, связанную с голангом, на golang-go.
- Файл debian/control является манифестом. Обратите внимание на "зависимости сборки" (
Build-Depends: debhelper (>= 7.0.50~), golang-stable
) и 3 архитектуры. Используя Ubuntu (без сусликов ppa), мне пришлось менять голанг-стабильный на golang-go.
- отредактируйте файл debian/rules (поместите имя своего пакета вместо cobzr).
- Файл debian/rules в основном представляет собой файл "make", и он показывает, как создается пакет. В этом случае они сильно зависят от дебюта. Здесь они настраивают GOPATH и вызывают "go install".
Здесь волшебная строка "go install":
cd $(GOPATH)/src && find * -name '*.go' -exec dirname {} \; | xargs -n1 go install
- Также обновите файл авторского права, readme, лицензию и т.д.
-
Поместите свой источник в папку src. например.
git clone https://github.com/yourgithubusername/yourpackagename src/github.com/yourgithubusername/yourpackagename
или, например,
cp .../yourpackage/ src/
-
создать пакет
# -us -uc skips package signing.
dpkg-buildpackage -us -uc
Это должно создать двоичный файл .deb для вашей архитектуры, а также "исходный deb" (.tgz) и файл описания исходного deb (.dsc).
Подробнее
Итак, я понял, что Canonical (люди Ubuntu) используют Go и создают пакеты .deb для некоторых своих проектов Go. Ubuntu основан на Debian, поэтому по большей части один и тот же подход должен применяться к обоим дистрибутивам (имена зависимостей могут незначительно меняться).
В репозиториях Ubuntu Launchpad вы найдете несколько пакетов на основе Go. До сих пор я нашел cobzr (git -строчное разветвление для bzr) и juju-core (проект devops, портированный с Python).
В обоих этих проектах есть ветвь "trunk" и "package", и вы можете увидеть папку debian/
внутри ветки пакета. 2 наиболее важных файла здесь debian/control и debian/rules - я связался с 'view source.
Наконец
Что-то, что я не рассматривал, это кросс-компиляция вашего пакета (для остальных 2-х архитектур 3, 386/arm/amd64). Кросс-компиляция не слишком сложна в работе (вам нужно построить инструментальную цепочку для каждой целевой платформы, а затем установить некоторые ENV-вары во время "сборки go" ), и я сам работал над утилитой кросс-компилятора. В конце концов, я надеюсь, добавлю поддержку .deb в мою утилиту, но сначала мне нужно кристаллизовать эту задачу.
Удачи. Если вы сделаете какой-либо прогресс, пожалуйста, обновите мой ответ или добавьте комментарий. Благодаря
Ответ 3
Создание пакетов deb или rpm из Go Applications также очень просто с fpm.
Возьмите его с rubygems:
gem install fpm
После создания двоичного кода, например. foobar, вы можете упаковать его следующим образом:
fpm -s dir -t deb -n foobar -v 0.0.1 foobar=/usr/bin/
fpm поддерживает всевозможные расширенные варианты упаковки.
Ответ 4
Существует официальный документ политики Debian, описывающий процедуру упаковки для Go: http://pkg-go.alioth.debian.org/packaging.html
Для библиотек. Используйте dh-make-golang для создания скелета пакета. Назовите свой пакет именем, полученным из пути импорта, с суффиксом -dev
, например. golang-GitHub Пб-рд-DEV. Укажите зависимости ont Depends:
. (Это исходные зависимости для построения, а не бинарные зависимости для запуска, поскольку Go статически связывает весь источник.)
Установка пакета библиотеки установит исходный код на /usr/share/golang/src
(возможно, скомпилированные библиотеки могут войти в .../pkg
). В зависимости от типа Go пакеты будут использовать артефакты из этих общесистемных локаций.
Для исполняемых файлов. Используйте dh-golang для создания пакета. Укажите зависимости в строке Build-Depends:
(см. Выше, касающуюся упаковки зависимостей).
Ответ 5
Недавно я обнаружил https://packager.io/ - Я доволен тем, что они делают. Может быть, открыть один из пакетов, чтобы посмотреть, что они делают?