# Invocar binarios del host


En algunos casos, tu extensión puede necesitar invocar algún comando desde el host. Por ejemplo, podrías querer invocar la CLI de tu proveedor de nube para crear un nuevo recurso, o la CLI de una herramienta que proporciona tu extensión, o incluso un script de shell que quieras ejecutar en el host.

Podrías hacerlo ejecutando la CLI desde un contenedor con el SDK de extensiones. Pero esta CLI necesita acceder al sistema de archivos del host, lo cual no es sencillo ni rápido si se ejecuta en un contenedor.

Esta página describe cómo ejecutar ejecutables en el host (binarios, scripts de shell) que se distribuyen como parte de tu extensión y se despliegan en el host. Como las extensiones pueden ejecutarse en múltiples plataformas, esto significa que necesitas incluir los ejecutables para todas las plataformas que quieras soportar.

Obtén más información sobre la [arquitectura](/extensions/extensions-sdk/architecture/) de las extensiones.

> [!NOTE]
>
> Ten en cuenta que las extensiones se ejecutan con los derechos de acceso del usuario, esta API no está restringida a los binarios enumerados en la [sección del host](/extensions/extensions-sdk/architecture/metadata/#host-section) de los metadatos de la extensión (algunas extensiones pueden instalar software durante la interacción del usuario e invocar binarios recién instalados incluso si no están enumerados en los metadatos de la extensión).

En este ejemplo, la CLI es un script simple `Hello world` que se debe invocar con un parámetro y devuelve una cadena.

## Añadir los ejecutables a la extensión

**Mac y Linux**



Crea un script `bash` para macOS y Linux, en el archivo `binaries/unix/hello.sh` con el siguiente contenido:

```bash
#!/bin/sh
echo "Hello, $1!"
```

**Windows**



Crea un script por lotes (`batch script`) para Windows en otro archivo `binaries/windows/hello.cmd` con el siguiente contenido:

```bash
@echo off
echo "Hello, %1!"
```



Luego, actualiza el `Dockerfile` para copiar la carpeta `binaries` en el sistema de archivos del contenedor de la extensión y hacer que los archivos sean ejecutables.

```dockerfile
# Copia los binarios en la carpeta correcta
COPY --chmod=0755 binaries/windows/hello.cmd /windows/hello.cmd
COPY --chmod=0755 binaries/unix/hello.sh /linux/hello.sh
COPY --chmod=0755 binaries/unix/hello.sh /darwin/hello.sh
```

## Invocar el ejecutable desde la interfaz de usuario

En tu extensión, usa el objeto cliente de Docker Desktop para [invocar el binario en el host](/extensions/extensions-sdk/dev/api/backend/#invoke-an-extension-binary-on-the-host) provisto por la extensión con la función `ddClient.extension.host.cli.exec()`.
En este ejemplo, el binario devuelve una cadena como resultado, obtenida mediante `result?.stdout`, tan pronto como se renderiza la vista de la extensión.

**React**



```typescript
export function App() {
  const ddClient = createDockerDesktopClient();
  const [hello, setHello] = useState("");

  useEffect(() => {
    const run = async () => {
      let binary = "hello.sh";
      if (ddClient.host.platform === 'win32') {
        binary = "hello.cmd";
      }

      const result = await ddClient.extension.host?.cli.exec(binary, ["world"]);
      setHello(result?.stdout);

    };
    run();
  }, [ddClient]);

  return (
    <div>
      {hello}
    </div>
  );
}
```

**Vue**



> [!IMPORTANT]
>
> Aún no hay un ejemplo disponible para Vue. [Rellena el formulario](https://docs.google.com/forms/d/e/1FAIpQLSdxJDGFJl5oJ06rG7uqtw1rsSBZpUhv_s9HHtw80cytkh2X-Q/viewform?usp=pp_url&entry.1333218187=Vue) e infórmanos si te gustaría ver un ejemplo con Vue.

**Angular**



> [!IMPORTANT]
>
> Aún no hay un ejemplo disponible para Angular. [Rellena el formulario](https://docs.google.com/forms/d/e/1FAIpQLSdxJDGFJl5oJ06rG7uqtw1rsSBZpUhv_s9HHtw80cytkh2X-Q/viewform?usp=pp_url&entry.1333218187=Angular) e infórmanos si te gustaría ver un ejemplo con Angular.

**Svelte**



> [!IMPORTANT]
>
> Aún no hay un ejemplo disponible para Svelte. [Rellena el formulario](https://docs.google.com/forms/d/e/1FAIpQLSdxJDGFJl5oJ06rG7uqtw1rsSBZpUhv_s9HHtw80cytkh2X-Q/viewform?usp=pp_url&entry.1333218187=Svelte) e infórmanos si te gustaría ver un ejemplo con Svelte.



## Configurar el archivo de metadatos

Los binarios del host se deben especificar en el archivo `metadata.json` para que Docker Desktop los copie en el host al instalar la extensión. Una vez que se desinstala la extensión, los binarios copiados también se eliminan.

```json
{
  "vm": {
    ...
  },
  "ui": {
    ...
  },
  "host": {
    "binaries": [
      {
        "darwin": [
          {
            "path": "/darwin/hello.sh"
          }
        ],
        "linux": [
          {
            "path": "/linux/hello.sh"
          }
        ],
        "windows": [
          {
            "path": "/windows/hello.cmd"
          }
        ]
      }
    ]
  }
}
```

El campo `path` debe hacer referencia a la ruta del binario dentro del contenedor.

