blob: ba58ec3f6956959a33bad2e358cd33c7736edf9b [file] [log] [blame] [view]
## Introduction
A common use case is to create a reusable library and an application that consumes it, and host both on GitHub. We will illustrate this with a trivial application called "` uselessd `" that consumes a likewise trivial library called "` useless `".
## Code Layout
The app and both libraries live on GitHub, each in its own repository. ` $GOPATH ` is the root of the _project_ - each of your GitHub repos will be checked out several folders below ` $GOPATH `.
Your code layout would look like this:
```
$GOPATH/
src/
github.com/
jmcvetta/
useless/
.git/
useless.go
useless_test.go
README.md
uselessd/
.git/
uselessd.go
uselessd_test.go
README.md
```
Each folder under ` src/github.com/jmcvetta/ ` is the root of a separate git checkout.
## $GOPATH
Your ` $GOPATH ` variable will point to the root of your Go workspace, as described in [How to Write Go Code](http://golang.org/doc/code.html).
## Note for Eclipse Users
Both Go and Eclipse use the term "workspace", but they use it to mean something different. What Go calls a "workspace" is what Eclipse calls a "project". Whenever this document uses either term, it refers to a Go workspace.
### Setup the Workspace
Let's assume we are starting from scratch. Initialize the two new repositories on GitHub, using the "Initialize this repository with a README" option so your repos can be cloned immediately. Then setup the project like this:
```sh
cd ~/workspace # Standard location for Eclipse workspace
mkdir mygo # Create your Go workspace
export GOPATH=~/workspace/mygo # GOPATH = Go workspace
cd $GOPATH
mkdir -p src/github.com/jmcvetta
cd src/github.com/jmcvetta
git clone git@github.com:jmcvetta/useless.git
git clone git@github.com:jmcvetta/uselessd.git
```
## Libraries
Conventionally, the name of the repository is the same as the name of the package it contains. Our ` useless ` repo contains ` useless.go ` which defines ` package useless `:
```Go
package useless
func Foobar() string {
return "Foobar!"
}
```
## Applications
An application - Go code that will be compiled into an executable command - always defines ` package main ` with a ` main() ` function.
So ` uselessd.go ` looks like this:
```Go
package main
import (
"net/http"
"golang.org/x/net/websocket"
"github.com/jmcvetta/useless"
)
func main() {
http.Handle("/useless", websocket.Handler(func(ws *websocket.Conn) {
ws.Write([]byte(useless.Foobar()))
}))
http.ListenAndServe(":3000", nil)
}
```
## Dependencies
Your project will probably depend on some existing packages. The application above depends upon ` golang.org/x/net/websocket `. You can install all dependencies by running "` go get -v ./... `" from the root of your workspace. The "` go get `" command is similar to "` go install `" in that it will attempt to build and install all packages in the workspace (technically, all packages matched by "` ./... `"), except that it will also examine their dependencies and download (and install) any that are missing first.
See the output of "` go help packages `" for a full explanation of the "` ... `" syntax.
All dependencies will be installed alongside your code under "` $GOPATH/src `". All GitHub reposities checked out by "` go get `" will be use the read-only ` https:// ` repository by default. To push changes back to github from one of these repositories, change the "` origin/master `" ref in ` .git/config ` to match the SSH repository from GitHub.
## Build
During development you can build the ` useless ` library by itself with the command "` go build ...useless `". You could also give the full path to the package name, "` go build github.com/jmcvetta/useless `".
To compile ` uselessd.go ` and its dependencies into an executable, use the command "` go build ...uselessd `".
## Example Code
FWIW all the repo addresses on this page are real, and the ` uselessd ` application should compile if you follow the directions above.