Skip to content

Commit

Permalink
Fix vendoring for golang-http
Browse files Browse the repository at this point in the history
Tested with a private Go module which was vendored, setting
GO111MODULE: off in build_args in stack.yml

I also created a nested package called pkg and referenced it
as "handler/function/pkg" from handler.go which worked as
expected.

Closes: #78

Signed-off-by: Alex Ellis (OpenFaaS Ltd) <[email protected]>
  • Loading branch information
alexellis committed Oct 11, 2022
1 parent 1416b6f commit f1b01c6
Show file tree
Hide file tree
Showing 5 changed files with 157 additions and 6 deletions.
6 changes: 0 additions & 6 deletions go.work

This file was deleted.

4 changes: 4 additions & 0 deletions template/golang-http/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,10 @@ ENV CGO_ENABLED=${CGO_ENABLED}
RUN test -z "$(gofmt -l $(find . -type f -name '*.go' -not -path "./vendor/*" -not -path "./function/vendor/*"))" || { echo "Run \"gofmt -s -w\" on your Golang code"; exit 1; }

WORKDIR /go/src/handler/function

RUN sh ../modules-cleanup.sh


RUN mkdir -p /go/src/handler/function/static

RUN GOOS=${TARGETOS} GOARCH=${TARGETARCH} go test ./... -cover
Expand Down
2 changes: 2 additions & 0 deletions template/golang-http/function/go.mod
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
module handler/function

go 1.18

require github.com/openfaas/templates-sdk/go-http v0.0.0-20220408082716-5981c545cb03
2 changes: 2 additions & 0 deletions template/golang-http/function/go.sum
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
github.com/openfaas/templates-sdk/go-http v0.0.0-20220408082716-5981c545cb03 h1:wMIW4ddCuogcuXcFO77BPSMI33s3QTXqLTOHY6mLqFw=
github.com/openfaas/templates-sdk/go-http v0.0.0-20220408082716-5981c545cb03/go.mod h1:2vlqdjIdqUjZphguuCAjoMz6QRPm2O8UT0TaAjd39S8=
149 changes: 149 additions & 0 deletions template/golang-http/modules-cleanup.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
#!/usr/bin/env sh

set -e

GO111MODULE=$(go env GO111MODULE)

# move_vendor will copy the function's vendor folder,
# if it exists.
move_vendor() {
if [ ! -d ./function/vendor ]; then
echo "vendor not found"
return
fi

echo "moving function vendor"
mv -f ./function/vendor .
}


# cleanup_gomod will move the function's go module
cleanup_gomod() {

# Nothing to do when modules is explicitly off
# the z prefix protects against any SH wonkiness
# see https://stackoverflow.com/a/18264223
if [ "z$GO111MODULE" = "zoff" ]; then
echo "modules disabled, skipping go.mod cleanup"
return;
fi

if [ ! -f ./function/go.mod ]; then
echo "module not initialized, skipping go.mod cleanup"
return;
fi

echo "cleaning up go.mod"

# Copy the user's go.mod
mv -f ./function/go.mod .
mv -f ./function/go.sum .

# Clean up the go.mod

# Cleanup any sub-module replacements.
# This requires modifying any replace that points to "./*",
# the user has will use this to reference sub-modules instead
# of sub-packages, which we cleanup below.
echo "cleanup local replace statements"
# 1. Replace references to the local folder with `./function`
sed -i 's/=> \.\//=> \.\/function\//' go.mod


# Remove any references to the handler/function module.
# It is ok to just remove it because we will replace it later.
#
# Note that these references may or may not exist. We expect the
# go.mod to have a replace statement _if_ developer has subpackages
# in their handler. In this case they will need a this replace statement
#
# replace handler/function => ./
#
# `go mod` will then add a line that looks like
#
# handler/function v0.0.0-00010101000000-000000000000
#
# both of these lines need to be replaced, this grep selects everything
# _except_ those offending lines.
grep -v "\shandler/function" go.mod > gomod2; mv gomod2 go.mod

# Now update the go.mod
#
# 1. use replace so that imports of handler/function use the local code
# 2. we need to rename the module to handler because our main.go assumes
# this is the package name
go mod edit \
-replace=handler/function=./function \
-module handler



if [ "$DEBUG" -eq 1 ]; then
cat go.mod
echo ""
fi
}


# cleanup_vendor_modulestxt will cleanup the modules.txt file in the vendor folder
# this file is needed when modules are enabled and it must be in sync with the
# go.mod. To function correctly we need to modify the references to handler/function,
# if they exist.
cleanup_vendor_modulestxt() {
if [ ! -d ./vendor ]; then
echo "no vendor found, skipping modules.txt cleanup"
return
fi

# Nothing to do when modules is explicitly off
# the z prefix protects against any SH wonkiness
# see https://stackoverflow.com/a/18264223
if [ "z$GO111MODULE" = "zoff" ]; then
echo "modules disabled, skipping modules.txt cleanup"
return;
fi

echo "cleanup vendor/modules.txt"

# just in case
touch "./vendor/modules.txt"

# when vendored, we need to do similar edits to the vendor/modules.txt
# as we did to the go.mod

# 1. we need to replace any possible copy of the handler code
rm -rf vendor/handler && \

# 2. in modules.txt, we remove existing references to the handler/function
# we reconstruct these in the last step
grep -v "\shandler/function" ./vendor/modules.txt> modulestext; mv modulestext ./vendor/modules.txt

# 3. Handle any other local replacements.
# any replace that points to `./**` needs to be udpat echo "cleanup local replace statements"
sed -i 's/=> \.\//=> \.\/function\//' ./vendor/modules.txt

# 4. To make the modules.txt consistent with the new go.mod,
# we add the mising replace to the vendor/modules.txt
echo "## explicit" >> ./vendor/modules.txt
echo "# handler/function => ./function" >> ./vendor/modules.txt

if [ "$DEBUG" -eq 1 ]; then
cat ./vendor/modules.txt;
echo ""
fi
}

# has_local_replacement checks if the file contains local go module replacement
has_local_replacement() {
return "$(grep -E -c '=> \./\S+' "$1")"
}


################
# main
################
move_vendor

cleanup_gomod

cleanup_vendor_modulestxt

0 comments on commit f1b01c6

Please sign in to comment.