You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
148 lines
5.5 KiB
Plaintext
148 lines
5.5 KiB
Plaintext
11 years ago
|
# gvm
|
||
|
by Josh Bussdieker (jbuss, jaja, jbussdieker)
|
||
|
|
||
|
GVM provides an interface to manage Go versions.
|
||
|
|
||
|
Features
|
||
|
========
|
||
|
* Install/Uninstall Go versions with `gvm install [tag]` where tag is "60.3", "go1", "weekly.2011-11-08", or "tip"
|
||
|
* List added/removed files in GOROOT with `gvm diff`
|
||
|
* Manage GOPATHs with `gvm pkgset [create/use/delete] [name]`. Use `--local` as `name` to manage repository under local path (`/path/to/repo/.gvm_local`).
|
||
|
* List latest release tags with `gvm listall`. Use `--all` to list weekly as well.
|
||
|
* Cache a clean copy of the latest Go source for multiple version installs.
|
||
|
* Link project directories into GOPATH
|
||
|
|
||
|
Background
|
||
|
==========
|
||
|
When we started developing in Go mismatched dependencies and API changes plauged our build process and made it extremely difficult to merge with other peoples changes.
|
||
|
|
||
|
After nuking my entire GOROOT several times and rebuilding I decided to come up with a tool to oversee the process. It eventually evolved into what gvm is today.
|
||
|
|
||
|
Installing
|
||
|
==========
|
||
|
|
||
|
To install:
|
||
|
|
||
|
bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)
|
||
|
|
||
|
Or if you are using zsh just change `bash` with `zsh`
|
||
|
|
||
|
Installing Go
|
||
|
=============
|
||
|
gvm install go1
|
||
|
gvm use go1 [--default]
|
||
|
Once this is done Go will be in the path and ready to use. $GOROOT and $GOPATH are set automatically.
|
||
|
|
||
|
Additional options can be specified when installing Go:
|
||
|
|
||
|
Usage: gvm install [version] [options]
|
||
|
-s, --source=SOURCE Install Go from specified source.
|
||
|
-n, --name=NAME Override the default name for this version.
|
||
|
-pb, --with-protobuf Install Go protocol buffers.
|
||
|
-b, --with-build-tools Install package build tools.
|
||
|
-B, --binary Only install from binary.
|
||
|
-h, --help Display this message.
|
||
|
|
||
|
List Go Versions
|
||
|
================
|
||
|
To list all installed Go versions (The current version is prefixed with "=>"):
|
||
|
|
||
|
gvm list
|
||
|
|
||
|
Uninstalling
|
||
|
============
|
||
|
To completely remove gvm and all installed Go versions and packages:
|
||
|
|
||
|
gvm implode
|
||
|
|
||
|
If that doesn't work see the troubleshooting steps at the bottom of this page.
|
||
|
|
||
|
Mac OS X Requirements
|
||
|
====================
|
||
|
* Install Mercurial from http://mercurial.berkwood.com/
|
||
|
* Install Xcode Command Line Tools from the App Store.
|
||
|
|
||
|
Linux Requirements
|
||
|
==================
|
||
|
|
||
|
Debian/Ubuntu
|
||
|
==================
|
||
|
sudo apt-get install curl
|
||
|
sudo apt-get install git
|
||
|
sudo apt-get install mercurial
|
||
|
sudo apt-get install make
|
||
|
sudo apt-get install binutils
|
||
|
sudo apt-get install bison
|
||
|
sudo apt-get install gcc
|
||
|
sudo apt-get install build-essential
|
||
|
|
||
|
Redhat/Centos
|
||
|
==================
|
||
|
|
||
|
sudo yum install curl
|
||
|
sudo yum install git
|
||
|
sudo yum install make
|
||
|
sudo yum install gcc
|
||
|
sudo yum install bison-devel
|
||
|
sudo yum install glibc-devel
|
||
|
|
||
|
* Install Mercurial from http://pkgs.repoforge.org/mercurial/
|
||
|
|
||
|
FreeBSD Requirements
|
||
|
====================
|
||
|
|
||
|
sudo pkg_add -r bash
|
||
|
sudo pkg_add -r git
|
||
|
sudo pkg_add -r mercurial
|
||
|
|
||
|
Vendoring Native Code and Dependencies
|
||
|
==================================================
|
||
|
GVM supports vendoring package set-specific native code and related
|
||
|
dependencies, which is useful if you need to qualify a new configuration
|
||
|
or version of one of these dependencies against a last-known-good version
|
||
|
in an isolated manner. Such behavior is critical to maintaining good release
|
||
|
engineering and production environment hygiene.
|
||
|
|
||
|
As a convenience matter, GVM will furnish the following environment variables to
|
||
|
aid in this manner if you want to decouple your work from what the operating
|
||
|
system provides:
|
||
|
|
||
|
1. ``${GVM_OVERLAY_PREFIX}`` functions in a manner akin to a root directory
|
||
|
hierarchy suitable for auto{conf,make,tools} where it could be passed in
|
||
|
to ``./configure --prefix=${GVM_OVERLAY_PREFIX}`` and not conflict with any
|
||
|
existing operating system artifacts and hermetically be used by your
|
||
|
workspace. This is suitable to use with ``C{PP,XX}FLAGS and LDFLAGS``, but you will have
|
||
|
to manage these yourself, since each tool that uses them is different.
|
||
|
|
||
|
2. ``${PATH}`` includes ``${GVM_OVERLAY_PREFIX}/bin`` so that any tools you
|
||
|
manually install will reside there, available for you.
|
||
|
|
||
|
3. ``${LD_LIBRARY_PATH}`` includes ``${GVM_OVERLAY_PREFIX}/lib`` so that any
|
||
|
runtime library searching can be fulfilled there on FreeBSD and Linux.
|
||
|
|
||
|
4. ``${DYLD_LIBRARY_PATH}`` includes ``${GVM_OVERLAY_PREFIX}/lib`` so that any
|
||
|
runtime library searching can be fulfilled there on Mac OS X.
|
||
|
|
||
|
5. ``${PKG_CONFIG_PATH}`` includes ``${GVM_OVERLAY_PREFIX}/lib/pkgconfig`` so
|
||
|
that ``pkg-config`` can automatically resolve any vendored dependencies.
|
||
|
|
||
|
Recipe for success:
|
||
|
|
||
|
gvm use go1.1
|
||
|
gvm pkgset use current-known-good
|
||
|
# Let's assume that this includes some C headers and native libraries, which
|
||
|
# Go's CGO facility wraps for us. Let's assume that these native
|
||
|
# dependencies are at version V.
|
||
|
gvm pkgset create trial-next-version
|
||
|
# Let's assume that V+1 has come along and you want to safely trial it in
|
||
|
# your workspace.
|
||
|
gvm pkgset use trial-next-version
|
||
|
# Do your work here replicating current-known-good from above, but install
|
||
|
# V+1 into ${GVM_OVERLAY_PREFIX}.
|
||
|
|
||
|
See examples/native for a working example.
|
||
|
|
||
|
Troubleshooting
|
||
|
===============
|
||
|
Sometimes especially during upgrades the state of gvm's files can get mixed up. This is mostly true for upgrade from older version than 0.0.8. Changes are slowing down and a LTR is imminent. But for now `rm -rf ~/.gvm` will always remove gvm. Stay tuned!
|