I was working on a Go project with no modules support and introducing the modules was not an option at the time. All dependencies were installed by go get
. When breaking changes were introduced in some packages, the builds started failing.
A simple way to quickly fix the issue was to write a very basic package manager which could get dependencies by the specified version (which go get
does not support in GOPATH mode).
A package list can be a simple file which declares packages line by line. If no version specified, go get
will be used. If a release version, commit hash or branch is specified, a git clone and checkout on the specified version will be invoked.
github.com/gorilla/mux@v1.7.2 github.com/go-playground/validator github.com/apixu/apixu-go@0fe1e52
I wrote a Bash script which parses the file and handles the process for each of the two cases.
#!/usr/bin/env bash FILE=$PWD/packages [[ -z "${GOPATH}" ]] && echo "GOPATH not set" && exit 1; GOSRC=${GOPATH}/src [[ ! -d "${GOSRC}" ]] && echo "${GOSRC} directory does not exist" && exit 1; while IFS= read -r line do IFS=\@ read -a fields <<< "$line" pkg=${fields[0]} v=${fields[1]} echo ${GOSRC}/${pkg} if [[ -z ${v} ]] then go get -u ${pkg} else PKGSRC=${GOSRC}/${pkg} rm -rf ${PKGSRC} mkdir -p ${PKGSRC} cd ${PKGSRC} git clone https://${pkg} . git checkout ${v} cd - > /dev/null fi echo done < "${FILE}"