6aec0413bb
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
52 lines
2.5 KiB
Markdown
52 lines
2.5 KiB
Markdown
---
|
|
name: resolve_registry_root
|
|
kind: function
|
|
lang: go
|
|
domain: infra
|
|
version: "1.0.0"
|
|
purity: impure
|
|
signature: "func ResolveRegistryRoot() (string, error)"
|
|
description: "Devuelve la ruta absoluta de la raíz del fn_registry (el directorio que contiene registry.db). Resuelve en orden: env var FN_REGISTRY_ROOT, walk-up desde el ejecutable (hasta 6 niveles), y $HOME/fn_registry. Retorna error si ningún método localiza registry.db. Centraliza la resolución dinámica para que ningún binario del ecosistema necesite un path hardcodeado."
|
|
tags: [registry, infra, root, path, env]
|
|
uses_functions: []
|
|
uses_types: []
|
|
params:
|
|
- name: (ninguno)
|
|
desc: "La función no recibe argumentos."
|
|
output: "Ruta absoluta del directorio raíz del fn_registry (contiene registry.db), o error descriptivo si no se encontró."
|
|
returns: []
|
|
returns_optional: false
|
|
error_type: "error_go_core"
|
|
imports: ["fmt", "os", "path/filepath"]
|
|
tested: true
|
|
tests:
|
|
- "env var apunta a tmpdir con registry.db"
|
|
- "HOME apunta a tmpdir con fn_registry/registry.db"
|
|
- "nada existe devuelve error"
|
|
test_file_path: "functions/infra/resolve_registry_root_test.go"
|
|
file_path: "functions/infra/resolve_registry_root.go"
|
|
---
|
|
|
|
## Ejemplo
|
|
|
|
```go
|
|
root, err := infra.ResolveRegistryRoot()
|
|
if err != nil {
|
|
log.Fatalf("no se pudo localizar fn_registry: %v", err)
|
|
}
|
|
// Construir ruta al binario fn
|
|
fnBin := filepath.Join(root, "fn")
|
|
cmd := exec.Command(fnBin, "run", "mi_funcion")
|
|
```
|
|
|
|
## Cuando usarla
|
|
|
|
Cuando un binario Go del ecosistema (dag_engine, deploy_server, registry_mcp, etc.) necesita localizar la raíz del registry para construir rutas a `fn run`, abrir `registry.db`, o encontrar `python/.venv` — y `FN_REGISTRY_ROOT` puede no estar seteado en el entorno del usuario.
|
|
|
|
## Gotchas
|
|
|
|
- **Depende del entorno en tiempo de ejecución** (env vars + filesystem): no es determinista. Dos llamadas sucesivas desde entornos distintos pueden devolver rutas distintas.
|
|
- **El paso 2 (walk-up desde ejecutable) asume que el binario vive dentro del árbol del registry.** Si el binario se copia a `/usr/local/bin` o a un directorio externo, este paso no encontrará nada — los pasos 1 y 3 sirven como fallback.
|
|
- **En `go test` el exe es un binario temporal** generado por el framework de tests, que vive en `/tmp/`. Por eso el paso 2 no encontrará `registry.db` durante los tests unitarios. Los tests de esta función usan `t.Setenv` para cubrir los pasos 1 y 3 sin depender del entorno real.
|
|
- **El paso 3 deriva `$HOME` dinámicamente** con `os.UserHomeDir()` — nunca hay paths de usuario hardcodeados.
|