I'm totaly new to go (it looks fabulous btw).
So I want to build a "web-"app in go with the revel framework. The problem is I code on my mac (os : darwin, arch : amd64) and I want to deploy the app on my server (os : ubuntu 12.04, arch : amd64). I "go get" revel in local (so bin/revel
it's a: Mach-O 64-bit executable) which is non executable on my server.
For now when I push (with git), I've got a post-receive script to build the app (revel build myapp /path/to/deploy
). Before I've tried to "go get" revel on my server, but it failed too.
It's not working, I could understand why, but I don't have any idea how to get a workable workflow :
PS: I've read http://blog.gopheracademy.com/auto-deploy-revel-site, http://revel.github.io/manual/deployment.html as well as articles about cross-compilation)
I'm not sure if this helps.. but here goes..
Your exact situation is what I am currently doing daily whilst I develop my first proper web app in Go. I develop on both a Windows laptop (whilst bored at work.. I'm a .NET developer at my workplace!) and my Mac at home. I then deploy it to an Ubuntu server hosted on Digital Ocean.
My workflow is:
go build
the code in place on the servergo get
any libraries that it complains about which I don't have on the server (for example, gorilla/mux
wasn't on the server today so I just ran that)go build
again (if applicable)..then just run it on the server.
When starting with this workflow (which I am still trying to perfect with bash scripts, etc ...) I found that a consistent GOPATH
across environments really helps.
For example, my GOPATH
on each machine is:
C:\GOPATH
~/go-code/
/home/simon/go-code/
Each of them have exactly the same structure:
...etc. This greatly simplifies the entire thing and is what allows me to develop across 3 environments seamlessly.
I am still getting used to Go and this setup (being a .NET developer at my core) - but it seems to be doing the trick for now.
The simple, easy to test way is to cross-compile a Linux amd64 binary on your Mac and push the binary over to your server using scp/Fabric/other tool of choice here. There's no need to then fetch deps (and risk breaking things), build anything on your server: you just ship a binary.
Option 1: http://dave.cheney.net/2012/09/08/an-introduction-to-cross-compilation-with-go - and then build the binary using go-linux-amd64 build
or by setting the environmental variables directly (as per the below option).
Option 2: install Go using Homebrew brew install go --cross-compile-common
and then run GOOS=linux GOARCH=amd64 go build
- or use the -o
flag to specify a different output filename. I typically output mine as myapp-linux
so it doesn't overwrite the platform native binary.
In a similar situation, I wanted to code on mac and deploy on Linux. This quick and dirty way worked for me on Go 1.6.2 http://kumargaurav.co/2016/08/10/deploy-go-lang-app-linux-server/