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}"