44 lines
1.3 KiB
Go
44 lines
1.3 KiB
Go
package runtime
|
||
|
||
import (
|
||
"archive/zip"
|
||
"bytes"
|
||
)
|
||
|
||
// BuildGoSourceZip упаковывает исходный Go-код в zip для Fission source package.
|
||
//
|
||
// Fission Go-среда работает в два этапа:
|
||
// 1. Package создаётся с source.literal = zip(handler.go + go.mod)
|
||
// 2. go-builder job компилирует его в плагин (.so) — это занимает ~40s первый раз
|
||
//
|
||
// Важно: source package, а НЕ deployment package — Fission сам компилирует.
|
||
// Entrypoint по умолчанию "Handler" (экспортированная функция в handler.go).
|
||
func BuildGoSourceZip(code string) ([]byte, error) {
|
||
var buf bytes.Buffer
|
||
zw := zip.NewWriter(&buf)
|
||
|
||
// handler.go — пользовательский код
|
||
fw, err := zw.Create("handler.go")
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
if _, err := fw.Write([]byte(code)); err != nil {
|
||
return nil, err
|
||
}
|
||
|
||
// go.mod — минимальный модуль для сборки; go-builder добавит нужные зависимости
|
||
goMod := "module github.com/user/fn\n\ngo 1.23\n"
|
||
fw2, err := zw.Create("go.mod")
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
if _, err := fw2.Write([]byte(goMod)); err != nil {
|
||
return nil, err
|
||
}
|
||
|
||
if err := zw.Close(); err != nil {
|
||
return nil, err
|
||
}
|
||
return buf.Bytes(), nil
|
||
}
|