fix: go.work replace + test destroy targets
This commit is contained in:
@@ -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"+
|
||||
|
||||
Reference in New Issue
Block a user