{ return "env" }
{ return 0 }
PreBuild collects environment variables prefixed with RFW_ and generates a
temporary rfwenv package exposing them through Get.
{
vars := map[string]string{}
for _, e := range os.Environ() {
if !strings.HasPrefix(e, "RFW_") {
continue
}
parts := strings.SplitN(e, "=", 2)
if len(parts) != 2 {
continue
}
key := strings.TrimPrefix(parts[0], "RFW_")
vars[key] = parts[1]
}
p.dir = "rfwenv"
if err := os.MkdirAll(p.dir, 0o755); err != nil {
return err
}
keys := make([]string, 0, len(vars))
for k := range vars {
keys = append(keys, k)
}
sort.Strings(keys)
var b strings.Builder
b.WriteString("// Code generated by env plugin. DO NOT EDIT.\n")
b.WriteString("package rfwenv\n\n")
b.WriteString("var vars = map[string]string{\n")
for _, k := range keys {
b.WriteString("\t\"" + k + "\": \"" + vars[k] + "\",\n")
}
b.WriteString("}\n\n")
b.WriteString("func Get(key string) string {\n\treturn vars[key]\n}\n")
return os.WriteFile(filepath.Join(p.dir, "rfw_env.go"), []byte(b.String()), 0o644)
}
{ return nil }
PostBuild removes the temporary rfwenv package.
{
if p.dir != "" {
_ = os.RemoveAll(p.dir)
p.dir = ""
}
return nil
}
{ return false }
{ plugins.Register(&plugin{}) }
TestPreAndPostBuild verifies that the env plugin generates a temporary
package exposing RFW_ environment variables and cleans it up afterwards.
{
p := &plugin{}
// Prepare environment variables.
t.Setenv("RFW_FOO", "bar")
t.Setenv("RFW_BAR", "baz")
dir := t.TempDir()
origWD, _ := os.Getwd()
if err := os.Chdir(dir); err != nil {
t.Fatalf("chdir: %v", err)
}
t.Cleanup(func() { _ = os.Chdir(origWD) })
if err := p.PreBuild(nil); err != nil {
t.Fatalf("PreBuild: %v", err)
}
data, err := os.ReadFile(filepath.Join("rfwenv", "rfw_env.go"))
if err != nil {
t.Fatalf("read generated file: %v", err)
}
content := string(data)
if !strings.Contains(content, `"BAR": "baz"`) || !strings.Contains(content, `"FOO": "bar"`) {
t.Fatalf("generated file missing variables: %s", content)
}
if err := p.PostBuild(nil); err != nil {
t.Fatalf("PostBuild: %v", err)
}
if _, err := os.Stat("rfwenv"); !os.IsNotExist(err) {
t.Fatalf("rfwenv directory should be removed")
}
if p.ShouldRebuild("anything") {
t.Fatalf("env plugin should never trigger rebuilds")
}
}
import "encoding/json"
import "os"
import "path/filepath"
import "sort"
import "strings"
import "github.com/rfwlab/rfw/cmd/rfw/plugins"
import "os"
import "path/filepath"
import "strings"
import "testing"