Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Packaging Go application for Debian

How can I put my Go binary into a Debian package? Since Go is statically linked, I just have a single executable--I don't need a lot of complicated project metadata information. Is there a simple way to package the executable and resource files without going through the trauma of debuild?

I've looked all over for existing questions; however, all of my research turns up questions/answers about a .deb file containing the golang development environment (i.e., what you would get if you do sudo apt-get install golang-go).

like image 551
weberc2 Avatar asked Feb 27 '13 04:02

weberc2


People also ask

How do I install packages on Debian?

Install Software Using Dpkg Command deb packages. but unlike other Linux package management systems, it cannot automatically download and install packages with their dependencies. To install a local package, use the dpkg command with the -i flag along with package name as shown.

What is dh make?

dh_make is a tool that adds necessary files for making Debian source package from upstream source according to the requirements of the Debian Policy. dh_make must be invoked within a directory containing the source code, which must be named <packagename>-<version>.


1 Answers

Well. I think the only "trauma" of debuild is that it runs lintian after building the package, and it's lintian who tries to spot problems with your package.

So there are two ways to combat the situation:

  • Do not use debuild: this tool merely calls dpkg-buildpackage which really does the necessary powerlifting. The usual call to build a binary package is dpkg-buildpackage -us -uc -b. You still might call debuild for other purposes, like debuild clean for instance.
  • Add the so-called "lintian override" which can be used to make lintian turn a blind eye to selected problems with your package which, you insist, are not problems.

Both approaches imply that you do not attempt to build your application by the packaging tools but rather treat it as a blob which is just wrapped to a package. This would require slightly abstraining from the normal way debian/rules work (to not attempt to build anything).

Another solution which might be possible (and is really way more Debian-ish) is to try to use gcc-go (plus gold for linking): since it's a GCC front-end, this tool produces a dynamically-linked application (which links against libgo or something like this). I, personally, have no experience with it yet, and would only consider using it if you intend to try to push your package into the Debian proper.

Regarding the general question of packaging Go programs for Debian, you might find the following resources useful:

  • This thread started on go-nuts by one of Go for Debian packagers.
  • In particular, the first post in that thread links to this discussion on debian-devel.
  • The second thread on debian-devel regarding that same problem (it's a logical continuation of the former thread).

Update on 2015-10-15.

(Since this post appears to still be searched and found and studied by people I've decided to update it to better reflec the current state of affairs.)

Since then the situation with packaging Go apps and packages got improved dramatically, and it's possible to build a Debian package using "classic" Go (the so-called gc suite originating from Google) rather than gcc-go. And there exist a good infrastructure for packages as well.

The key tool to use when debianizing a Go program now is dh-golang described here.

like image 101
kostix Avatar answered Sep 29 '22 22:09

kostix