Compartir a través de


.NET .NET Aspire formato de manifiesto para los generadores de herramientas de implementación

En este artículo, obtendrá información sobre el formato de manifiesto de .NET.NET Aspire. Este artículo sirve como guía de referencia para los generadores de herramientas de implementación, lo que ayuda a crear herramientas para implementar proyectos de .NET.NET Aspire en plataformas de hospedaje específicas, ya sea en el entorno local o en la nube.

.NET .NET Aspire simplifica la experiencia de desarrollo local ayudando a administrar las interdependencias entre integraciones de aplicaciones. Para ayudar a simplificar la implementación de aplicaciones, .NET Aspire proyectos pueden generar un manifiesto de todos los recursos definidos como un archivo con formato de JSON.

Generación de un manifiesto

Se requiere un proyecto de .NET.NET Aspire válido para generar un manifiesto. Para empezar, cree un proyecto de .NET.NET Aspire mediante la plantilla de aspire-starter.NET:

dotnet new aspire-starter --use-redis-cache `
    -o AspireApp && `
    cd AspireApp

La generación de manifiestos se logra mediante la ejecución de dotnet build con un destino especial:

dotnet run --project AspireApp.AppHost\AspireApp.AppHost.csproj `
    --publisher manifest `
    --output-path ../aspire-manifest.json

Propina

El --output-path admite rutas de acceso relativas. El comando anterior usa ../aspire-manifest.json para colocar el archivo de manifiesto en la raíz del directorio del proyecto.

Para obtener más información, consulte dotnet run. El comando anterior genera la siguiente salida:

Building...
info: Aspire.Hosting.Publishing.ManifestPublisher[0]
      Published manifest to: .\AspireApp.AppHost\aspire-manifest.json

El archivo generado es el manifiesto de .NET.NET Aspire y lo usan las herramientas para admitir la implementación en entornos de nube de destino.

Nota

También puede generar un manifiesto como parte del perfil de inicio. Tenga en cuenta los siguientes launchSettings.json:

{
  "$schema": "http://json.schemastore.org/launchsettings.json",
  "profiles": {
    "generate-manifest": {
      "commandName": "Project",
      "launchBrowser": false,
      "dotnetRunMessages": true,
      "commandLineArgs": "--publisher manifest --output-path aspire-manifest.json"
    }
  }
}

Formato de manifiesto básico

La publicación del manifiesto desde la plantilla de inicio predeterminada para .NET Aspire genera la siguiente salida JSON:

{
  "resources": {
    "cache": {
      "type": "container.v0",
      "connectionString": "{cache.bindings.tcp.host}:{cache.bindings.tcp.port}",
      "image": "redis:7.2.4",
      "bindings": {
        "tcp": {
          "scheme": "tcp",
          "protocol": "tcp",
          "transport": "tcp",
          "containerPort": 6379
        }
      }
    },
    "apiservice": {
      "type": "project.v0",
      "path": "../AspireApp.ApiService/AspireApp.ApiService.csproj",
      "env": {
        "OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EXCEPTION_LOG_ATTRIBUTES": "true",
        "OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EVENT_LOG_ATTRIBUTES": "true"
      },
      "bindings": {
        "http": {
          "scheme": "http",
          "protocol": "tcp",
          "transport": "http"
        },
        "https": {
          "scheme": "https",
          "protocol": "tcp",
          "transport": "http"
        }
      }
    },
    "webfrontend": {
      "type": "project.v0",
      "path": "../AspireApp.Web/AspireApp.Web.csproj",
      "env": {
        "OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EXCEPTION_LOG_ATTRIBUTES": "true",
        "OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EVENT_LOG_ATTRIBUTES": "true",
        "ConnectionStrings__cache": "{cache.connectionString}",
        "services__apiservice__0": "{apiservice.bindings.http.url}",
        "services__apiservice__1": "{apiservice.bindings.https.url}"
      },
      "bindings": {
        "http": {
          "scheme": "http",
          "protocol": "tcp",
          "transport": "http"
        },
        "https": {
          "scheme": "https",
          "protocol": "tcp",
          "transport": "http"
        }
      }
    }
  }
}

El formato de manifiesto JSON consta de un único objeto denominado resources, que contiene una propiedad para cada recurso especificado en Program.cs (el argumento name para cada nombre se usa como propiedad para cada uno de los objetos de recursos secundarios en JSON).

Referencias de enlace y cadena de conexión

En el ejemplo anterior, hay dos recursos de proyecto y uno Redis recurso de caché. El webfrontend de depende de los recursos de apiservice (project) y caché ().

Esta dependencia se conoce porque las variables de entorno del webfrontend contienen marcadores de posición que hacen referencia a los otros dos recursos:

"env": {
  // ... other environment variables omitted for clarity
  "ConnectionStrings__cache": "{cache.connectionString}",
  "services__apiservice__0": "{apiservice.bindings.http.url}",
  "services__apiservice__1": "{apiservice.bindings.https.url}"
},

Se hace referencia al recurso apiservice mediante webfrontend mediante el WithReference(apiservice) de llamada en el archivo Program.cs del host de la aplicación y se hace referencia a redis mediante la llamada WithReference(cache):

var builder = DistributedApplication.CreateBuilder(args);

var cache = builder.AddRedis("cache");

var apiService = builder.AddProject<Projects.AspireApp_ApiService>("apiservice");

builder.AddProject<Projects.AspireApp_Web>("webfrontend")
    .WithReference(cache)
    .WithReference(apiService);

builder.Build().Run();

Las referencias entre los tipos de recursos del proyecto dan lugar a detección de servicios variables que se insertan en el proyecto de referencia. Las referencias a tipos de referencia conocidos, como Redis dan lugar a la inserción de cadenas de conexión.

Diagrama que muestra qué recursos contribuyen a las cadenas de marcador de posición correspondientes.

Para obtener más información sobre cómo funcionan los recursos del modelo de aplicación y las referencias entre ellos, consulte .NET.NET Aspire información general de orquestación.

Estructura de cadena de marcador de posición

Las cadenas de marcador de posición hacen referencia a la estructura del manifiesto de .NET.NET Aspire:

Diagrama que muestra cómo el manifiesto JSON estructura se asigna a las cadenas de marcador de posición.

El segmento final de la cadena de marcador de posición (url en este caso) lo genera la herramienta que procesa el manifiesto. Hay varios sufijos que se pueden usar en la cadena de marcador de posición:

  • connectionString: para los tipos de recursos conocidos, como Redis. Las herramientas de implementación traducen el recurso en la infraestructura más adecuada para el entorno en la nube de destino y, a continuación, generan una cadena de conexión compatible .NET.NET Aspire para que la aplicación de consumo la use. En container.v0 recursos, el campo connectionString puede estar presente y especificarse explícitamente. Esto es para admitir escenarios en los que se hace referencia a un tipo de recurso de contenedor mediante la extensión WithReference, pero se desea hospedar explícitamente como contenedor.
  • url: para las referencias de servicio a servicio en las que se requiere una dirección URL con formato correcto. La herramienta de implementación genera el url en función del esquema, el protocolo y el transporte definidos en el manifiesto y la topología de proceso o red subyacente que se implementó.
  • host: segmento host de la dirección URL.
  • port: segmento de puerto de la dirección URL.

Tipos de recursos

Cada recurso tiene un campo type. Cuando una herramienta de implementación lee el manifiesto, debe leer el tipo para comprobar si puede procesar correctamente el manifiesto. Durante el período de .NET.NET Aspire versión preliminar, todos los tipos de recursos tienen un sufijo v0 para indicar que están sujetos a cambios. A medida que .NET.NET Aspire enfoques liberan un sufijo v1 se usará para indicar que la estructura del manifiesto para ese tipo de recurso debe considerarse estable (las actualizaciones posteriores incrementan el número de versión en consecuencia).

Campos de recursos comunes

El campo type es el único campo que es común en todos los tipos de recursos; sin embargo, los tipos de recursos project.v0, container.v0y executable.v0 también comparten los campos env y bindings.

Nota

El tipo de recurso executable.v0 no se implementa completamente en el manifiesto debido a su falta de utilidad en escenarios de implementación. Para obtener más información sobre cómo incluir archivos ejecutables en contenedores, consulte Dockerfile tipos de recursos.

El tipo de campo env es una asignación básica de clave y valor donde los valores pueden contener cadenas de marcador de posición .

Los enlaces se especifican en el campo bindings con cada enlace incluido en su propio campo bajo el objeto bindingsJSON. Los campos omitidos por el manifiesto de .NET.NET Aspire en el nodo bindings incluyen:

  • scheme: uno de los siguientes valores tcp, udp, httpo https.
  • protocol: uno de los siguientes valores tcp o udp
  • transport: igual que scheme, pero se usa para desambiguar entre http y http2.
  • containerPort: opcional, si se omiten los valores predeterminados del puerto 80.

Campo inputs

Algunos recursos generan un campo inputs. Este campo se usa para especificar parámetros de entrada para el recurso. El campo inputs es un objeto JSON donde cada propiedad es un parámetro de entrada que se usa en la resolución de la estructura del marcador de posición. Los recursos que tienen un connectionString, por ejemplo, pueden usar el campo inputs para especificar un password para la cadena de conexión:

"connectionString": "Host={<resourceName>.bindings.tcp.host};Port={<resourceName>.bindings.tcp.port};Username=admin;Password={<resourceName>.inputs.password};"

El marcador de posición de la cadena de conexión hace referencia al parámetro de entrada password del campo inputs:

"inputs": {
  "password": {
    "type": "string",
    "secret": true,
    "default": {
      "generate": {
        "minLength": 10
      }
    }
  }
}

El fragmento de código de JSON anterior muestra el campo inputs de un recurso que tiene un campo connectionString. El parámetro de entrada password es un tipo de cadena y se marca como secreto. El campo default se usa para especificar un valor predeterminado para el parámetro de entrada. En este caso, el valor predeterminado se genera mediante el campo generate, con una cadena aleatoria de una longitud mínima.

Recursos integrados

En la tabla siguiente se muestra una lista de tipos de recursos generados explícitamente por .NET Aspire y extensiones desarrolladas por el equipo de .NET Aspire:

Tipos de recursos independientes de la nube

Estos recursos están disponibles en el 📦Aspire. Hospedaje paquete NuGet.

Uso del modelo de aplicación Tipo de recurso de manifiesto Vínculo de encabezado
AddContainer container.v0 tipo de recurso contenedor de
PublishAsDockerFile dockerfile.v0 Dockerfile tipos de recursos
AddDatabase value.v0 MongoDB Server tipos de recursos
AddMongoDB container.v0 MongoDB tipos de recursos
AddDatabase value.v0 MySQL Server tipos de recursos
AddMySql container.v0 MySQL tipos de recursos
AddDatabase value.v0 Postgres tipos de recursos
AddPostgres container.v0 Postgres tipos de recursos
AddProject project.v0 tipo de recurso Project
AddRabbitMQ container.v0 RabbitMQ tipos de recursos
AddRedis container.v0 de tipo de recurso
AddDatabase value.v0 SQL Server tipos de recursos
AddSqlServer container.v0 SQL Server tipos de recursos

Tipo de recurso de proyecto

Código de ejemplo:

var builder = DistributedApplication.CreateBuilder(args);
var apiservice = builder.AddProject<Projects.AspireApp_ApiService>("apiservice");

Manifiesto de ejemplo:

"apiservice": {
  "type": "project.v0",
  "path": "../AspireApp.ApiService/AspireApp.ApiService.csproj",
  "env": {
    "OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EXCEPTION_LOG_ATTRIBUTES": "true",
    "OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EVENT_LOG_ATTRIBUTES": "true"
  },
  "bindings": {
    "http": {
      "scheme": "http",
      "protocol": "tcp",
      "transport": "http"
    },
    "https": {
      "scheme": "https",
      "protocol": "tcp",
      "transport": "http"
    }
  }
}

Tipo de recurso de contenedor

Código de ejemplo:

var builder = DistributedApplication.CreateBuilder(args);

builder.AddContainer("mycontainer", "myimage")
       .WithEnvironment("LOG_LEVEL", "WARN")
       .WithHttpEndpoint(3000);

Manifiesto de ejemplo:

{
  "resources": {
    "mycontainer": {
      "type": "container.v0",
      "image": "myimage:latest",
      "env": {
        "LOG_LEVEL": "WARN"
      },
      "bindings": {
        "http": {
          "scheme": "http",
          "protocol": "tcp",
          "transport": "http",
          "containerPort": 3000
        }
      }
    }
  }
}

tipos de recursos de Dockerfile

Código de ejemplo:

var builder = DistributedApplication.CreateBuilder(args);

builder.AddNodeApp("nodeapp", "../nodeapp/app.js")
       .WithHttpEndpoint(hostPort: 5031, env: "PORT")
       .PublishAsDockerFile();

Propina

La llamada PublishAsDockerFile es necesaria para generar el tipo de recurso Dockerfile en el manifiesto y este método de extensión solo está disponible en el tipo ExecutableResource.

Manifiesto de ejemplo:

{
  "resources": {
    "nodeapp": {
      "type": "dockerfile.v0",
      "path": "../nodeapp/Dockerfile",
      "context": "../nodeapp",
      "env": {
        "NODE_ENV": "development",
        "PORT": "{nodeapp.bindings.http.port}"
      },
      "bindings": {
        "http": {
          "scheme": "http",
          "protocol": "tcp",
          "transport": "http",
          "containerPort": 5031
        }
      }
    }
  }
}

tipos de recursos de Postgres

Código de ejemplo:

var builder = DistributedApplication.CreateBuilder(args);

builder.AddPostgres("postgres1")
       .AddDatabase("shipping");

Manifiesto de ejemplo:

{
  "resources": {
    "postgres1": {
      "type": "container.v0",
      "connectionString": "Host={postgres1.bindings.tcp.host};Port={postgres1.bindings.tcp.port};Username=postgres;Password={postgres1.inputs.password}",
      "image": "postgres:16.2",
      "env": {
        "POSTGRES_HOST_AUTH_METHOD": "scram-sha-256",
        "POSTGRES_INITDB_ARGS": "--auth-host=scram-sha-256 --auth-local=scram-sha-256",
        "POSTGRES_PASSWORD": "{postgres1.inputs.password}"
      },
      "bindings": {
        "tcp": {
          "scheme": "tcp",
          "protocol": "tcp",
          "transport": "tcp",
          "containerPort": 5432
        }
      },
      "inputs": {
        "password": {
          "type": "string",
          "secret": true,
          "default": {
            "generate": {
              "minLength": 10
            }
          }
        }
      }
    },
    "shipping": {
      "type": "value.v0",
      "connectionString": "{postgres1.connectionString};Database=shipping"
    }
  }
}

tipos de recursos de RabbitMQ

RabbitMQ se modela como un recurso de contenedor container.v0. En el ejemplo siguiente se muestra cómo se agregan al modelo de aplicación.

var builder = DistributedApplication.CreateBuilder(args);

builder.AddRabbitMQ("rabbitmq1");

El código anterior genera el siguiente manifiesto:

{
  "resources": {
    "rabbitmq1": {
      "type": "container.v0",
      "connectionString": "amqp://guest:{rabbitmq1.inputs.password}@{rabbitmq1.bindings.tcp.host}:{rabbitmq1.bindings.tcp.port}",
      "image": "rabbitmq:3",
      "env": {
        "RABBITMQ_DEFAULT_USER": "guest",
        "RABBITMQ_DEFAULT_PASS": "{rabbitmq1.inputs.password}"
      },
      "bindings": {
        "tcp": {
          "scheme": "tcp",
          "protocol": "tcp",
          "transport": "tcp",
          "containerPort": 5672
        }
      },
      "inputs": {
        "password": {
          "type": "string",
          "secret": true,
          "default": {
            "generate": {
              "minLength": 10
            }
          }
        }
      }
    }
  }
}

tipo de recurso Redis

Código de ejemplo:

var builder = DistributedApplication.CreateBuilder(args);

builder.AddRedis("redis1");

Manifiesto de ejemplo:

{
  "resources": {
    "redis1": {
      "type": "container.v0",
      "connectionString": "{redis1.bindings.tcp.host}:{redis1.bindings.tcp.port}",
      "image": "redis:7.2.4",
      "bindings": {
        "tcp": {
          "scheme": "tcp",
          "protocol": "tcp",
          "transport": "tcp",
          "containerPort": 6379
        }
      }
    }
  }
}

tipos de recursos de SQL Server

Código de ejemplo:

var builder = DistributedApplication.CreateBuilder(args);

builder.AddSqlServer("sql1")
       .AddDatabase("shipping");

Manifiesto de ejemplo:

{
  "resources": {
    "sql1": {
      "type": "container.v0",
      "connectionString": "Server={sql1.bindings.tcp.host},{sql1.bindings.tcp.port};User ID=sa;Password={sql1.inputs.password};TrustServerCertificate=true",
      "image": "mcr.microsoft.com/mssql/server:2022-latest",
      "env": {
        "ACCEPT_EULA": "Y",
        "MSSQL_SA_PASSWORD": "{sql1.inputs.password}"
      },
      "bindings": {
        "tcp": {
          "scheme": "tcp",
          "protocol": "tcp",
          "transport": "tcp",
          "containerPort": 1433
        }
      },
      "inputs": {
        "password": {
          "type": "string",
          "secret": true,
          "default": {
            "generate": {
              "minLength": 10
            }
          }
        }
      }
    },
    "shipping": {
      "type": "value.v0",
      "connectionString": "{sql1.connectionString};Database=shipping"
    }
  }
}

tipos de recursos de MongoDB

Código de ejemplo:

var builder = DistributedApplication.CreateBuilder(args);

builder.AddMongoDB("mongodb1")
       .AddDatabase("shipping");

Manifiesto de ejemplo:

{
  "resources": {
    "mongodb1": {
      "type": "container.v0",
      "connectionString": "mongodb://{mongodb1.bindings.tcp.host}:{mongodb1.bindings.tcp.port}",
      "image": "mongo:7.0.5",
      "bindings": {
        "tcp": {
          "scheme": "tcp",
          "protocol": "tcp",
          "transport": "tcp",
          "containerPort": 27017
        }
      }
    },
    "shipping": {
      "type": "value.v0",
      "connectionString": "{mongodb1.connectionString}/shipping"
    }
  }
}

tipos de recursos de MySQL

Código de ejemplo:

var builder = DistributedApplication.CreateBuilder(args);

builder.AddMySql("mysql1")
       .AddDatabase("shipping");

Manifiesto de ejemplo:

{
  "resources": {
    "mysql1": {
      "type": "container.v0",
      "connectionString": "Server={mysql1.bindings.tcp.host};Port={mysql1.bindings.tcp.port};User ID=root;Password={mysql1.inputs.password}",
      "image": "mysql:8.3.0",
      "env": {
        "MYSQL_ROOT_PASSWORD": "{mysql1.inputs.password}"
      },
      "bindings": {
        "tcp": {
          "scheme": "tcp",
          "protocol": "tcp",
          "transport": "tcp",
          "containerPort": 3306
        }
      },
      "inputs": {
        "password": {
          "type": "string",
          "secret": true,
          "default": {
            "generate": {
              "minLength": 10
            }
          }
        }
      }
    },
    "shipping": {
      "type": "value.v0",
      "connectionString": "{mysql1.connectionString};Database=shipping"
    }
  }
}

Azuretipos de recursos específicos

Los siguientes recursos están disponibles en el 📦Aspire. Hospitalidad.Azure paquete NuGet.

Uso del modelo de aplicación Tipo de recurso de manifiesto Vínculo de encabezado
AddAzureAppConfiguration azure.bicep.v0 Azure tipos de recursos de App Configuration
AddAzureKeyVault azure.bicep.v0 de tipo de recurso
AddAzureRedis azure.bicep.v0 Azure Redis tipos de recursos
AddAzureServiceBus azure.bicep.v0 de tipo de recurso
AddAzureSqlServer(...) azure.bicep.v0 tipos de recursos de SQL de
AddAzureSqlServer(...).AddDatabase(...) value.v0 tipos de recursos de SQL de
AddAzurePostgresFlexibleServer(...) azure.bicep.v0 Azure Postgres tipos de recursos
AddAzurePostgresFlexibleServer(...).AddDatabase(...) value.v0 Azure Postgres tipos de recursos
AddAzureStorage azure.storage.v0 Azure tipos de recursos de Storage
AddBlobs value.v0 Azure tipos de recursos de Storage
AddQueues value.v0 Azure tipos de recursos de Storage
AddTables value.v0 Azure tipos de recursos de Storage

tipo de recurso Azure Key Vault

Código de ejemplo:

var builder = DistributedApplication.CreateBuilder(args);

builder.AddAzureKeyVault("keyvault1");

Manifiesto de ejemplo:

{
  "resources": {
    "keyvault1": {
      "type": "azure.bicep.v0",
      "connectionString": "{keyvault1.outputs.vaultUri}",
      "path": "aspire.hosting.azure.bicep.keyvault.bicep",
      "params": {
        "principalId": "",
        "principalType": "",
        "vaultName": "keyvault1"
      }
    }
  }
}

tipo de recurso Azure Service Bus

Código de ejemplo:

var builder = DistributedApplication.CreateBuilder(args);

builder.AddAzureServiceBus("sb1")
       .AddTopic("topic1", [])
       .AddTopic("topic2", [])
       .AddQueue("queue1")
       .AddQueue("queue2");

Manifiesto de ejemplo:

{
  "resources": {
    "sb1": {
      "type": "azure.bicep.v0",
      "connectionString": "{sb1.outputs.serviceBusEndpoint}",
      "path": "aspire.hosting.azure.bicep.servicebus.bicep",
      "params": {
        "serviceBusNamespaceName": "sb1",
        "principalId": "",
        "principalType": "",
        "queues": [
          "queue1",
          "queue2"
        ],
        "topics": [
          {
            "name": "topic1",
            "subscriptions": []
          },
          {
            "name": "topic2",
            "subscriptions": []
          }
        ]
      }
    }
  }
}

tipos de recursos de almacenamiento de Azure

Código de ejemplo:

var builder = DistributedApplication.CreateBuilder(args);

var storage = builder.AddAzureStorage("images");

storage.AddBlobs("blobs");
storage.AddQueues("queues");
storage.AddTables("tables");

Manifiesto de ejemplo:

{
  "resources": {
    "images": {
      "type": "azure.bicep.v0",
      "path": "aspire.hosting.azure.bicep.storage.bicep",
      "params": {
        "principalId": "",
        "principalType": "",
        "storageName": "images"
      }
    },
    "blobs": {
      "type": "value.v0",
      "connectionString": "{images.outputs.blobEndpoint}"
    },
    "queues": {
      "type": "value.v0",
      "connectionString": "{images.outputs.queueEndpoint}"
    },
    "tables": {
      "type": "value.v0",
      "connectionString": "{images.outputs.tableEndpoint}"
    }
  }
}

tipo de recurso AzureRedis

Código de ejemplo:

var builder = DistributedApplication.CreateBuilder(args);

builder.AddAzureRedis("azredis1");

Manifiesto de ejemplo:

{
  "resources": {
    "azredis": {
      "type": "azure.bicep.v0",
      "connectionString": "{azredis.outputs.connectionString}",
      "path": "azredis.module.bicep",
      "params": {
        "principalId": "",
        "principalName": ""
      }
    }
  }
}

Tipo de recurso Azure App Configuration

Código de ejemplo:

var builder = DistributedApplication.CreateBuilder(args);

builder.AddAzureAppConfiguration("appconfig1");

Manifiesto de ejemplo:

{
  "resources": {
    "appconfig1": {
      "type": "azure.bicep.v0",
      "connectionString": "{appconfig1.outputs.appConfigEndpoint}",
      "path": "aspire.hosting.azure.bicep.appconfig.bicep",
      "params": {
        "configName": "appconfig1",
        "principalId": "",
        "principalType": ""
      }
    }
  }
}

tipos de recursos de Azure SQL

Código de ejemplo:

var builder = DistributedApplication.CreateBuilder(args);

builder.AddAzureSqlServer("sql")
       .AddDatabase("inventory");

Manifiesto de ejemplo:

{
  "resources": {
    "sql": {
      "type": "azure.bicep.v0",
      "connectionString": "Server=tcp:{sql.outputs.sqlServerFqdn},1433;Encrypt=True;Authentication=\u0022Active Directory Default\u0022",
      "path": "sql.module.bicep",
      "params": {
        "principalId": "",
        "principalName": ""
      }
    },
    "inventory": {
      "type": "value.v0",
      "connectionString": "{sql.connectionString};Database=inventory"
    }
  }
}

tipos de recursos de AzurePostgres

Código de ejemplo:

var builder = DistributedApplication.CreateBuilder(args);

builder.AddAzurePostgresFlexibleServer("postgres")
       .AddDatabase("db");

Manifiesto de ejemplo:

{
  "resources": {
    "postgres": {
      "type": "azure.bicep.v0",
      "connectionString": "{postgres.outputs.connectionString}",
      "path": "postgres.module.bicep",
      "params": {
        "principalId": "",
        "principalType": "",
        "principalName": ""
      }
    },
    "db": {
      "type": "value.v0",
      "connectionString": "{postgres.connectionString};Database=db"
    }
  }
}

Tipos de recursos admitidos en el Azure Developer CLI

El Azure Developer CLI (azd) es una herramienta que se puede usar para implementar proyectos de .NET Aspire en Azure Container Apps. Con el tipo de recurso azure.bicep.v0, los tipos de contenedor de recursos independientes de la nube se pueden asignar a Azurerecursos específicos. En la tabla siguiente se enumeran los tipos de recursos que se admiten en el Azure Developer CLI:

Nombre API independiente de la nube API de Azure
Redis AddRedis AddAzureRedis
Postgres AddPostgres AddAzurePostgresFlexibleServer
SQL Server AddSqlServer AddAzureSqlServer

Cuando los recursos se configuran como Azure recursos, el tipo de recurso azure.bicep.v0 se genera en el manifiesto. Para obtener más información, consulte Implementación de un proyecto de .NET Aspire en Azure Container Apps mediante la Azure Developer CLI (guía detallada).

Consulte también