Udostępnij za pośrednictwem


.NET .NET Aspire format manifestu dla konstruktorów narzędzi wdrażania

W tym artykule przedstawiono format manifestu .NET.NET Aspire. Ten artykuł służy jako przewodnik referencyjny dla konstruktorów narzędzi wdrażania, ułatwiając tworzenie narzędzi do wdrażania projektów .NET.NET Aspire na określonych platformach hostingu, lokalnych lub w chmurze.

.NET .NET Aspire upraszcza lokalne środowisko programistyczne, pomagając zarządzać współzależnościami między integracjami aplikacji. Aby uprościć wdrażanie aplikacji, .NET Aspire projekty mogą wygenerować manifest wszystkich zasobów zdefiniowanych jako plik JSON sformatowany.

Generowanie manifestu

Do wygenerowania manifestu jest wymagany prawidłowy projekt .NET.NET Aspire. Aby rozpocząć, utwórz projekt .NET.NET Aspire przy użyciu szablonu aspire-starter.NET:

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

Generowanie manifestu jest osiągane przez uruchomienie dotnet build ze specjalnym celem:

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

Napiwek

--output-path obsługuje ścieżki względne. Poprzednie polecenie używa ../aspire-manifest.json do umieszczania pliku manifestu w katalogu głównym katalogu projektu.

Aby uzyskać więcej informacji, zobacz dotnet run. Poprzednie polecenie generuje następujące dane wyjściowe:

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

Wygenerowany plik jest manifestem .NET.NET Aspire i jest używany przez narzędzia do obsługi wdrażania w docelowych środowiskach w chmurze.

Nuta

Manifest można również wygenerować w ramach profilu uruchamiania. Rozważ następujące 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"
    }
  }
}

Podstawowy format manifestu

Opublikowanie manifestu z domyślnego szablonu początkowego dla .NET Aspire generuje następujące dane wyjściowe 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"
        }
      }
    }
  }
}

Format manifestu JSON składa się z pojedynczego obiektu o nazwie resources, który zawiera właściwość dla każdego zasobu określonego w Program.cs (argument name dla każdej nazwy jest używany jako właściwość dla każdego obiektu zasobu podrzędnego w JSON).

Odwołania do parametrów połączenia i powiązań

W poprzednim przykładzie istnieją dwa zasoby projektu i jeden Redis zasób pamięci podręcznej. webfrontend zależy od zasobów apiservice (projektu) i pamięci podręcznej ().

Ta zależność jest znana, ponieważ zmienne środowiskowe webfrontend zawierają symbole zastępcze odwołujące się do dwóch innych zasobów:

"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}"
},

Zasób apiservice jest przywołyny przez webfrontend przy użyciu wywołania WithReference(apiservice) w pliku Program.cs hosta aplikacji i redis jest przywołyny przy użyciu wywołania 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();

Odwołania między typami zasobów projektu powodują odnajdywanie usługi zmiennych wstrzykiwanych do projektu odwołującego się. Odwołania do dobrze znanych typów odwołań, takich jak Redis powodują wstrzyknięcie parametrów połączenia.

Diagram przedstawiający zasoby współtworzenia odpowiednich ciągów zastępczych.

Aby uzyskać więcej informacji na temat sposobu działania zasobów w modelu aplikacji i odwołań między nimi, zobacz .NET.NET Aspire omówienie aranżacji.

Struktura ciągów zastępczych

Ciągi zastępcze odwołują się do struktury manifestu .NET.NET Aspire:

Diagram przedstawiający sposób mapowania struktury manifestu JSON na ciągi zastępcze.

Ostatni segment ciągu zastępczego (url w tym przypadku) jest generowany przez narzędzie przetwarzające manifest. Istnieje kilka sufiksów, których można użyć w ciągu zastępczym:

  • connectionString: w przypadku dobrze znanych typów zasobów, takich jak Redis. Narzędzia wdrażania tłumaczą zasób w najbardziej odpowiedniej infrastrukturze dla docelowego środowiska chmury, a następnie tworzą .NET.NET Aspire zgodne parametry połączenia dla używanej aplikacji. W przypadku container.v0 zasobów pole connectionString może być obecne i określone jawnie. Ma to na celu obsługę scenariuszy, w których typ zasobu kontenera jest przywołyyny przy użyciu rozszerzenia WithReference, ale należy go jawnie hostować jako kontener.
  • url: w przypadku odwołań do usługi, w których wymagany jest dobrze sformułowany adres URL. Narzędzie wdrażania tworzy url na podstawie schematu, protokołu i transportu zdefiniowanego w manifeście oraz podstawowej topologii obliczeniowej/sieciowej, która została wdrożona.
  • host: segment hosta adresu URL.
  • port: segment portu adresu URL.

Typy zasobów

Każdy zasób ma pole type. Gdy narzędzie wdrażania odczytuje manifest, powinien odczytać typ, aby sprawdzić, czy może poprawnie przetworzyć manifest. W okresie .NET.NET Aspire wersji zapoznawczej wszystkie typy zasobów mają sufiks v0 wskazujący, że mogą ulec zmianie. W miarę .NET.NET Aspire zbliżania się wydania sufiksu v1 będzie używany do oznaczania, że struktura manifestu dla tego typu zasobu powinna być uważana za stabilną (kolejne aktualizacje odpowiednio zwiększą numer wersji).

Typowe pola zasobów

Pole type jest jedynym polem, które jest wspólne dla wszystkich typów zasobów, jednak project.v0, container.v0i executable.v0 typów zasobów współużytkuje również pola env i bindings.

Nuta

Typ zasobu executable.v0 nie jest w pełni zaimplementowany w manifeście ze względu na brak narzędzia w scenariuszach wdrażania. Aby uzyskać więcej informacji na temat konteneryzowania plików wykonywalnych, zobacz Dockerfile typy zasobów.

Typ pola env to podstawowe mapowanie klucza/wartości, w którym wartości mogą zawierać ciągi zastępcze.

Powiązania są określane w polu bindings z każdym powiązaniem zawartym we własnym polu w obiekcie bindingsJSON. Pola pominięte przez manifest .NET.NET Aspire w węźle bindings obejmują:

  • scheme: Jedną z następujących wartości tcp, udp, httplub https.
  • protocol: Jedną z następujących wartości tcp lub udp
  • transport: takie same jak scheme, ale używane do uściślania między http a http2.
  • containerPort: opcjonalnie, jeśli pominięto wartości domyślne portu 80.

Pole inputs

Niektóre zasoby generują pole inputs. To pole służy do określania parametrów wejściowych zasobu. Pole inputs jest obiektem JSON, w którym każda właściwość jest parametrem wejściowym używanym w rozpoznawaniu struktury symboli zastępczych. Zasoby, które mają connectionString, mogą na przykład użyć pola inputs, aby określić password parametrów połączenia:

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

Symbol zastępczy parametrów połączenia odwołuje się do parametru wejściowego password z pola inputs:

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

Powyższy fragment kodu JSON przedstawia pole inputs dla zasobu, który ma pole connectionString. Parametr wejściowy password jest typem ciągu i jest oznaczony jako wpis tajny. Pole default służy do określania wartości domyślnej parametru wejściowego. W tym przypadku wartość domyślna jest generowana przy użyciu pola generate z losowym ciągiem o minimalnej długości.

Zasoby wbudowane

Poniższa tabela zawiera listę typów zasobów, które są jawnie generowane przez .NET Aspire i rozszerzenia opracowane przez zespół .NET Aspire:

Niezależne od chmury typy zasobów

Te zasoby są dostępne w 📦Aspire. Hosting pakiet NuGet.

Użycie modelu aplikacji Typ zasobu manifestu Łącze nagłówka
AddContainer container.v0 typ zasobu kontenera
PublishAsDockerFile dockerfile.v0 Dockerfile typów zasobów
AddDatabase value.v0 MongoDB Server typów zasobów
AddMongoDB container.v0 MongoDB typów zasobów
AddDatabase value.v0 MySQL Server typów zasobów
AddMySql container.v0 MySQL typów zasobów
AddDatabase value.v0 Postgres typów zasobów
AddPostgres container.v0 Postgres typów zasobów
AddProject project.v0 typ zasobu projektu
AddRabbitMQ container.v0 RabbitMQ typów zasobów
AddRedis container.v0 Redis typ zasobu
AddDatabase value.v0 SQL Server typów zasobów
AddSqlServer container.v0 SQL Server typów zasobów

Typ zasobu projektu

Przykładowy kod:

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

Przykładowy manifest:

"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"
    }
  }
}

Typ zasobu kontenera

Przykładowy kod:

var builder = DistributedApplication.CreateBuilder(args);

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

Przykładowy manifest:

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

typy zasobów Dockerfile

Przykładowy kod:

var builder = DistributedApplication.CreateBuilder(args);

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

Napiwek

Wywołanie PublishAsDockerFile jest wymagane do wygenerowania typu zasobu Dockerfile w manifeście, a ta metoda rozszerzenia jest dostępna tylko w typie ExecutableResource.

Przykładowy manifest:

{
  "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
        }
      }
    }
  }
}

typy zasobów Postgres

Przykładowy kod:

var builder = DistributedApplication.CreateBuilder(args);

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

Przykładowy manifest:

{
  "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"
    }
  }
}

typy zasobów RabbitMQ

RabbitMQ jest modelowana jako zasób kontenera container.v0. W poniższym przykładzie pokazano, jak są one dodawane do modelu aplikacji.

var builder = DistributedApplication.CreateBuilder(args);

builder.AddRabbitMQ("rabbitmq1");

Poprzedni kod tworzy następujący manifest:

{
  "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
            }
          }
        }
      }
    }
  }
}

typ zasobu Redis

Przykładowy kod:

var builder = DistributedApplication.CreateBuilder(args);

builder.AddRedis("redis1");

Przykładowy manifest:

{
  "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
        }
      }
    }
  }
}

typy zasobów SQL Server

Przykładowy kod:

var builder = DistributedApplication.CreateBuilder(args);

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

Przykładowy manifest:

{
  "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"
    }
  }
}

typy zasobów MongoDB

Przykładowy kod:

var builder = DistributedApplication.CreateBuilder(args);

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

Przykładowy manifest:

{
  "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"
    }
  }
}

typy zasobów MySQL

Przykładowy kod:

var builder = DistributedApplication.CreateBuilder(args);

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

Przykładowy manifest:

{
  "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"
    }
  }
}

Azure- określone typy zasobów

Następujące zasoby są dostępne w 📦Aspire. Gościnność.Azure pakiet NuGet.

Użycie modelu aplikacji Typ zasobu manifestu Łącze nagłówka
AddAzureAppConfiguration azure.bicep.v0 typy zasobów usługi Azure App Configuration
AddAzureKeyVault azure.bicep.v0 Azure Key Vault typ zasobu
AddAzureRedis azure.bicep.v0 Azure Redis typów zasobów
AddAzureServiceBus azure.bicep.v0 Azure Service Bus typ zasobu
AddAzureSqlServer(...) azure.bicep.v0 Azure typów zasobów SQL
AddAzureSqlServer(...).AddDatabase(...) value.v0 Azure typów zasobów SQL
AddAzurePostgresFlexibleServer(...) azure.bicep.v0 Azure Postgres typów zasobów
AddAzurePostgresFlexibleServer(...).AddDatabase(...) value.v0 Azure Postgres typów zasobów
AddAzureStorage azure.storage.v0 typy zasobów usługi Azure Storage
AddBlobs value.v0 typy zasobów usługi Azure Storage
AddQueues value.v0 typy zasobów usługi Azure Storage
AddTables value.v0 typy zasobów usługi Azure Storage

typ zasobu Azure Key Vault

Przykładowy kod:

var builder = DistributedApplication.CreateBuilder(args);

builder.AddAzureKeyVault("keyvault1");

Przykładowy manifest:

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

typ zasobu Azure Service Bus

Przykładowy kod:

var builder = DistributedApplication.CreateBuilder(args);

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

Przykładowy manifest:

{
  "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": []
          }
        ]
      }
    }
  }
}

typy zasobów usługi Azure Storage

Przykładowy kod:

var builder = DistributedApplication.CreateBuilder(args);

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

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

Przykładowy manifest:

{
  "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}"
    }
  }
}

typ zasobu AzureRedis

Przykładowy kod:

var builder = DistributedApplication.CreateBuilder(args);

builder.AddAzureRedis("azredis1");

Przykładowy manifest:

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

typ zasobu Azure App Configuration

Przykładowy kod:

var builder = DistributedApplication.CreateBuilder(args);

builder.AddAzureAppConfiguration("appconfig1");

Przykładowy manifest:

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

Azure typów zasobów SQL

Przykładowy kod:

var builder = DistributedApplication.CreateBuilder(args);

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

Przykładowy manifest:

{
  "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"
    }
  }
}

typy zasobów AzurePostgres

Przykładowy kod:

var builder = DistributedApplication.CreateBuilder(args);

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

Przykładowy manifest:

{
  "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"
    }
  }
}

Typy zasobów obsługiwane w Azure Developer CLI

Azure Developer CLI (azd) to narzędzie, które może służyć do wdrażania projektów .NET Aspire w celu Azure Container Apps. W przypadku typu zasobu azure.bicep.v0 typy kontenerów zasobów niezależne od chmury można mapować na Azure-określone zasoby. W poniższej tabeli wymieniono typy zasobów obsługiwane w Azure Developer CLI:

Nazwa Niezależny od chmury interfejs API interfejs API Azure
Redis AddRedis AddAzureRedis
Postgres AddPostgres AddAzurePostgresFlexibleServer
SQL Server AddSqlServer AddAzureSqlServer

Gdy zasoby skonfigurowane jako zasoby Azure, typ zasobu azure.bicep.v0 jest generowany w manifeście. Aby uzyskać więcej informacji, zobacz Deploy a .NET Aspire project to Azure Container Apps using the Azure Developer CLI (in-depth guide)(Wdrażanie projektu .NET Aspire).

Zobacz też