fix: go.work replace + test destroy targets

This commit is contained in:
“Naeel”
2026-03-23 09:30:37 +04:00
parent 2e7cd7f4f7
commit cb77a7f68e
3 changed files with 141 additions and 13 deletions
+15 -8
View File
@@ -93,23 +93,30 @@ func generateDockerfile(runtime string, hasRequirements bool, hasPackageJSON boo
// Go: multi-stage build с go.work (v0.1.3+).
// base-образ содержит: /app/server/ (module sless/fn/server, package main).
// kaniko копирует пользовательский код в /app/handler/.
// Генерируем go.mod для handler если его нет (module sless/fn/handler).
// Генерируем go.work: use ./server + use ./handler + replace sless/fn/handler => ./handler.
// replace позволяет server.go импортировать sless/fn/handler независимо от имени модуля пользователя.
// GOFLAGS=-mod=mod: позволяет go build подтягивать зависимости из handler/go.mod через GOPROXY.
// Модуль handler всегда переименовывается в sless/fn/handler — это позволяет server.go
// импортировать его по фиксированному пути без replace-директивы.
// Почему нет replace: Go 1.23 запрещает replace для модуля, который одновременно в workspace
// (use ./handler). Ошибка: "workspace module sless/fn/handler is replaced at all versions".
// Решение: rename module → use workspace → require без replace.
goModStep := ""
if !hasGoMod {
// Пользователь не предоставил go.mod — генерируем минимальный
// Пользователь не предоставил go.mod — генерируем минимальный с правильным именем.
goModStep = "RUN printf 'module sless/fn/handler\\n\\ngo 1.23\\n' > /app/handler/go.mod\n"
} else {
// Пользователь предоставил go.mod с произвольным именем модуля — переименовываем.
goModStep = "RUN sed -i 's/^module .*/module sless\\/fn\\/handler/' /app/handler/go.mod\n"
}
content := fmt.Sprintf(
"FROM %s AS builder\n"+
"WORKDIR /app\n"+
"COPY . /app/handler/\n"+
goModStep+
"RUN printf 'go 1.23\\n\\nuse ./server\\nuse ./handler\\n\\nreplace sless/fn/handler => ./handler\\n' > /app/go.work\n"+ // server/go.mod не содержит require sless/fn/handler — Go требует явного require даже при replace в go.work.
// Патчим server/go.mod в момент kaniko-сборки (не меняет базовый образ).
"RUN printf '\\nrequire sless/fn/handler v0.0.0\\n' >> /app/server/go.mod\n"+"RUN CGO_ENABLED=0 go build -o /server ./server\n"+
// go.work: workspace из двух модулей без replace-директив.
"RUN printf 'go 1.23\\n\\nuse ./server\\nuse ./handler\\n' > /app/go.work\n"+
// Патчим server/go.mod в момент kaniko-сборки — добавляем require на handler.
// Не меняет базовый образ (выполняется на этапе сборки пользовательского образа).
"RUN printf '\\nrequire sless/fn/handler v0.0.0\\n' >> /app/server/go.mod\n"+
"RUN CGO_ENABLED=0 go build -o /server ./server\n"+
"FROM alpine:3.20\n"+
"COPY --from=builder /server /server\n"+
"EXPOSE 8080\n"+