Skip to content

Commit

Permalink
Merge pull request #79 from CommunityToolkit/alirexaa/public-api-anal…
Browse files Browse the repository at this point in the history
…yzer

Add Public Api Analyzers
  • Loading branch information
aaronpowell authored Oct 10, 2024
2 parents d5b6a74 + 83d491c commit d569c50
Show file tree
Hide file tree
Showing 26 changed files with 266 additions and 1 deletion.
1 change: 1 addition & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ indent_size = 2
# C# files
[*.cs]

dotnet_public_api_analyzer.require_api_files = true
#### .NET Coding Conventions ####

# Organize usings
Expand Down
5 changes: 5 additions & 0 deletions Directory.Build.props
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
<Project>
<Import Project="eng\apicompat\PublicApiAnalyzer.props" />
<Import Project="eng\apicompat\PublicApiAnalyzer.targets" />

<!-- See https://aka.ms/dotnet/msbuild/customize for more details on customizing your build -->
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
Expand All @@ -12,5 +15,7 @@
<OpenTelemetryVersion>1.9.0</OpenTelemetryVersion>

<IsPackable>false</IsPackable>
<UsePublicApiAnalyzers>true</UsePublicApiAnalyzers>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
</PropertyGroup>
</Project>
3 changes: 3 additions & 0 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -31,5 +31,8 @@
<PackageVersion Include="xunit.extensibility.execution" Version="2.9.1" />
<!-- External packages -->
<PackageVersion Include="OllamaSharp" Version="3.0.7" />
<!-- Build dependencies -->
<PackageVersion Include="Microsoft.CodeAnalysis.PublicApiAnalyzers" Version="3.3.4" />

</ItemGroup>
</Project>
Binary file added docs/images/public-api-warning-example.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
62 changes: 62 additions & 0 deletions docs/public-api.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
# Public API Management with Microsoft.CodeAnalysis.PublicApiAnalyzers

We use `Microsoft.CodeAnalysis.PublicApiAnalyzers` in this repository. By using this analyzer, we can keep track of changes to the public API.

## Integration Packages

We have several packages called integration. For each of these packages, we add a public API. Each package should have the following files:
- `PublicAPI.Shipped.txt`
- `PublicAPI.Unshipped.txt`

## Creating/Updating Public API Files

### Steps for Contributors


1. **Create these two files**:

- `PublicAPI.Shipped.txt`
- `PublicAPI.Unshipped.txt`

If you're using nullable reference types, then add the following line at the top of each `PublicAPI.*.txt` file:
```
#nullable enable
```

2. **Add New Public API**:

- In `PublicAPI.Shipped.txt`, list all the public APIs you've given out.
- In `PublicAPI.Unshipped.txt`, list any preview or soon-to-change APIs. For example, if an API will soon be removed (marked with `[Obsolete]`), add it here so you remember to take it out later.

- Consider the following representative C# public class:
```csharp
namespace Demo;

public class MyClass
{
public Task DoSomethingAsync(Uri uri, CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
}

```

Warnings issued by the Microsoft.CodeAnalysis.PublicApiAnalyzers package:

![Example warning from analyzer](/images/public-api-warning-example.png)

You can use `. + Ctrl` to open the code actions and see the available options. In this case, the warning is suggesting that we should add the `MyClass` type to the `PublicAPI.*.txt` files.
3. **Update Existing Public API**:
- If you modify existing public API members, update the `PublicAPI.Unshipped.txt` file accordingly.
- Ensure that the changes reflect the new API surface.

4. **Shipping Public API**:
- Once a version is released,We move the entries from `PublicAPI.Unshipped.txt` to `PublicAPI.Shipped.txt`.
- This indicates that the API changes are now part of a shipped version.

By following these steps, we can maintain a consistent and accurate record of our public API changes.

Additional resources:
- [Microsoft.CodeAnalysis.PublicApiAnalyzers documentation.](https://github.com/dotnet/roslyn-analyzers/blob/main/src/PublicApiAnalyzers/PublicApiAnalyzers.Help.md)
- [Microsoft.CodeAnalysis.PublicApiAnalyzers list of analysis rules.](https://github.com/dotnet/roslyn-analyzers/blob/main/src/PublicApiAnalyzers/Microsoft.CodeAnalysis.PublicApiAnalyzers.md)
8 changes: 8 additions & 0 deletions eng/apicompat/PublicApiAnalyzer.props
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<Project>

<PropertyGroup Condition="'$(UsePublicApiAnalyzers)' == 'true'">
<!-- https://github.com/dotnet/roslyn-analyzers/blob/main/src/PublicApiAnalyzers/Microsoft.CodeAnalysis.PublicApiAnalyzers.md -->
<WarningsAsErrors>$(WarningsAsErrors);RS0016;RS0017;RS0022;RS0024;RS0025;RS0026;RS0027;RS0036;RS0037</WarningsAsErrors>
</PropertyGroup>

</Project>
8 changes: 8 additions & 0 deletions eng/apicompat/PublicApiAnalyzer.targets
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<Project>

<ItemGroup Condition="'$(UsePublicApiAnalyzers)' == 'true'">
<PackageReference Include="Microsoft.CodeAnalysis.PublicApiAnalyzers" ExcludeAssets="Compile" PrivateAssets="All" />
<AdditionalFiles Include="PublicAPI.Shipped.txt" />
<AdditionalFiles Include="PublicAPI.Unshipped.txt" />
</ItemGroup>
</Project>
2 changes: 2 additions & 0 deletions eng/apicompat/mark-shipped.cmd
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
@echo off
powershell -noprofile -executionPolicy RemoteSigned -file "%~dp0mark-shipped.ps1"
49 changes: 49 additions & 0 deletions eng/apicompat/mark-shipped.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
[CmdletBinding(PositionalBinding=$false)]
param ()

Set-StrictMode -version 2.0
$ErrorActionPreference = "Stop"

function MarkShipped([string]$dir) {
$shippedFilePath = Join-Path $dir "PublicAPI.Shipped.txt"
$shipped = @()
$shipped += Get-Content $shippedFilePath

$unshippedFilePath = Join-Path $dir "PublicAPI.Unshipped.txt"
$unshipped = Get-Content $unshippedFilePath
$removed = @()
$removedPrefix = "*REMOVED*";
Write-Host "Processing $dir"

foreach ($item in $unshipped) {
if ($item.Length -gt 0) {
if ($item.StartsWith($removedPrefix)) {
$item = $item.Substring($removedPrefix.Length)
$removed += $item
}
else {
$shipped += $item
}
}
}

$shipped | Sort-Object -Unique |Where-Object { -not $removed.Contains($_) } | Out-File $shippedFilePath -Encoding Ascii
"#nullable enable`r`n" | Out-File $unshippedFilePath -Encoding Ascii
}

try {
Push-Location $PSScriptRoot\..\..

foreach ($file in Get-ChildItem -re -in "PublicApi.Shipped.txt") {
$dir = Split-Path -parent $file
MarkShipped $dir
}
}
catch {
Write-Host $_
Write-Host $_.Exception
exit 1
}
finally {
Pop-Location
}
12 changes: 12 additions & 0 deletions eng/apicompat/readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# Mark-Shipped Tool
========

This tool should be run after every supported release that has API changes. It will
merge the collection of PublicApi.Shipped.txt files with the PublicApi.Unshipped.txt
versions. This will take into account `*REMOVED*` elements when updating the files.

Usage:

``` cmd
mark-shipped.cmd
```
8 changes: 8 additions & 0 deletions examples/Directory.Build.props
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<Project>
<Import Project="..\Directory.Build.props" />

<PropertyGroup>
<UsePublicApiAnalyzers>false</UsePublicApiAnalyzers>
</PropertyGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
#nullable enable
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
Aspire.Hosting.ApplicationModel.SwaApiEndpointAnnotation
Aspire.Hosting.ApplicationModel.SwaApiEndpointAnnotation.Endpoint.get -> string!
Aspire.Hosting.ApplicationModel.SwaApiEndpointAnnotation.SwaApiEndpointAnnotation(Aspire.Hosting.ApplicationModel.IResourceBuilder<Aspire.Hosting.ApplicationModel.IResourceWithEndpoints!>! resource) -> void
Aspire.Hosting.ApplicationModel.SwaAppEndpointAnnotation
Aspire.Hosting.ApplicationModel.SwaAppEndpointAnnotation.Endpoint.get -> string!
Aspire.Hosting.ApplicationModel.SwaAppEndpointAnnotation.SwaAppEndpointAnnotation(Aspire.Hosting.ApplicationModel.IResourceBuilder<Aspire.Hosting.ApplicationModel.IResourceWithEndpoints!>! resource) -> void
Aspire.Hosting.ApplicationModel.SwaResource
Aspire.Hosting.ApplicationModel.SwaResource.SwaResource(string! name, string! workingDirectory) -> void
Aspire.Hosting.SwaAppHostingExtension
Aspire.Hosting.SwaResourceOptions
Aspire.Hosting.SwaResourceOptions.DevServerTimeout.get -> int
Aspire.Hosting.SwaResourceOptions.DevServerTimeout.set -> void
Aspire.Hosting.SwaResourceOptions.Port.get -> int
Aspire.Hosting.SwaResourceOptions.Port.set -> void
Aspire.Hosting.SwaResourceOptions.SwaResourceOptions() -> void
static Aspire.Hosting.SwaAppHostingExtension.AddSwaEmulator(this Aspire.Hosting.IDistributedApplicationBuilder! builder, string! name) -> Aspire.Hosting.ApplicationModel.IResourceBuilder<Aspire.Hosting.ApplicationModel.SwaResource!>!
static Aspire.Hosting.SwaAppHostingExtension.AddSwaEmulator(this Aspire.Hosting.IDistributedApplicationBuilder! builder, string! name, Aspire.Hosting.SwaResourceOptions! options) -> Aspire.Hosting.ApplicationModel.IResourceBuilder<Aspire.Hosting.ApplicationModel.SwaResource!>!
static Aspire.Hosting.SwaAppHostingExtension.WithApiResource(this Aspire.Hosting.ApplicationModel.IResourceBuilder<Aspire.Hosting.ApplicationModel.SwaResource!>! builder, Aspire.Hosting.ApplicationModel.IResourceBuilder<Aspire.Hosting.ApplicationModel.IResourceWithEndpoints!>! apiResource) -> Aspire.Hosting.ApplicationModel.IResourceBuilder<Aspire.Hosting.ApplicationModel.SwaResource!>!
static Aspire.Hosting.SwaAppHostingExtension.WithAppResource(this Aspire.Hosting.ApplicationModel.IResourceBuilder<Aspire.Hosting.ApplicationModel.SwaResource!>! builder, Aspire.Hosting.ApplicationModel.IResourceBuilder<Aspire.Hosting.ApplicationModel.IResourceWithEndpoints!>! appResource) -> Aspire.Hosting.ApplicationModel.IResourceBuilder<Aspire.Hosting.ApplicationModel.SwaResource!>!
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
#nullable enable
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
Aspire.Hosting.ApplicationModel.GolangAppExecutableResource
Aspire.Hosting.ApplicationModel.GolangAppExecutableResource.GolangAppExecutableResource(string! name, string! workingDirectory) -> void
Aspire.Hosting.GolangAppHostingExtension
static Aspire.Hosting.GolangAppHostingExtension.AddGolangApp(this Aspire.Hosting.IDistributedApplicationBuilder! builder, string! name, string! workingDirectory, int port = 8080, string![]? args = null) -> Aspire.Hosting.ApplicationModel.IResourceBuilder<Aspire.Hosting.ApplicationModel.GolangAppExecutableResource!>!
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
#nullable enable
35 changes: 35 additions & 0 deletions src/Aspire.CommunityToolkit.Hosting.Java/PublicAPI.Unshipped.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
Aspire.Hosting.ApplicationModel.JavaAppContainerResource
Aspire.Hosting.ApplicationModel.JavaAppContainerResource.JavaAppContainerResource(string! name, string? entrypoint = null) -> void
Aspire.Hosting.ApplicationModel.JavaAppContainerResourceOptions
Aspire.Hosting.ApplicationModel.JavaAppContainerResourceOptions.Args.get -> string![]?
Aspire.Hosting.ApplicationModel.JavaAppContainerResourceOptions.Args.set -> void
Aspire.Hosting.ApplicationModel.JavaAppContainerResourceOptions.ContainerImageName.get -> string?
Aspire.Hosting.ApplicationModel.JavaAppContainerResourceOptions.ContainerImageName.set -> void
Aspire.Hosting.ApplicationModel.JavaAppContainerResourceOptions.ContainerImageTag.get -> string!
Aspire.Hosting.ApplicationModel.JavaAppContainerResourceOptions.ContainerImageTag.set -> void
Aspire.Hosting.ApplicationModel.JavaAppContainerResourceOptions.ContainerRegistry.get -> string?
Aspire.Hosting.ApplicationModel.JavaAppContainerResourceOptions.ContainerRegistry.set -> void
Aspire.Hosting.ApplicationModel.JavaAppContainerResourceOptions.JavaAppContainerResourceOptions() -> void
Aspire.Hosting.ApplicationModel.JavaAppContainerResourceOptions.OtelAgentPath.get -> string?
Aspire.Hosting.ApplicationModel.JavaAppContainerResourceOptions.OtelAgentPath.set -> void
Aspire.Hosting.ApplicationModel.JavaAppContainerResourceOptions.Port.get -> int
Aspire.Hosting.ApplicationModel.JavaAppContainerResourceOptions.Port.set -> void
Aspire.Hosting.ApplicationModel.JavaAppContainerResourceOptions.TargetPort.get -> int
Aspire.Hosting.ApplicationModel.JavaAppContainerResourceOptions.TargetPort.set -> void
Aspire.Hosting.ApplicationModel.JavaAppExecutableResource
Aspire.Hosting.ApplicationModel.JavaAppExecutableResource.JavaAppExecutableResource(string! name, string! command, string! workingDirectory) -> void
Aspire.Hosting.ApplicationModel.JavaAppExecutableResourceOptions
Aspire.Hosting.ApplicationModel.JavaAppExecutableResourceOptions.ApplicationName.get -> string?
Aspire.Hosting.ApplicationModel.JavaAppExecutableResourceOptions.ApplicationName.set -> void
Aspire.Hosting.ApplicationModel.JavaAppExecutableResourceOptions.Args.get -> string![]?
Aspire.Hosting.ApplicationModel.JavaAppExecutableResourceOptions.Args.set -> void
Aspire.Hosting.ApplicationModel.JavaAppExecutableResourceOptions.JavaAppExecutableResourceOptions() -> void
Aspire.Hosting.ApplicationModel.JavaAppExecutableResourceOptions.OtelAgentPath.get -> string?
Aspire.Hosting.ApplicationModel.JavaAppExecutableResourceOptions.OtelAgentPath.set -> void
Aspire.Hosting.ApplicationModel.JavaAppExecutableResourceOptions.Port.get -> int
Aspire.Hosting.ApplicationModel.JavaAppExecutableResourceOptions.Port.set -> void
Aspire.Hosting.JavaAppHostingExtension
static Aspire.Hosting.JavaAppHostingExtension.AddJavaApp(this Aspire.Hosting.IDistributedApplicationBuilder! builder, string! name, Aspire.Hosting.ApplicationModel.JavaAppContainerResourceOptions! options) -> Aspire.Hosting.ApplicationModel.IResourceBuilder<Aspire.Hosting.ApplicationModel.JavaAppContainerResource!>!
static Aspire.Hosting.JavaAppHostingExtension.AddJavaApp(this Aspire.Hosting.IDistributedApplicationBuilder! builder, string! name, string! workingDirectory, Aspire.Hosting.ApplicationModel.JavaAppExecutableResourceOptions! options) -> Aspire.Hosting.ApplicationModel.IResourceBuilder<Aspire.Hosting.ApplicationModel.JavaAppExecutableResource!>!
static Aspire.Hosting.JavaAppHostingExtension.AddSpringApp(this Aspire.Hosting.IDistributedApplicationBuilder! builder, string! name, Aspire.Hosting.ApplicationModel.JavaAppContainerResourceOptions! options) -> Aspire.Hosting.ApplicationModel.IResourceBuilder<Aspire.Hosting.ApplicationModel.JavaAppContainerResource!>!
static Aspire.Hosting.JavaAppHostingExtension.AddSpringApp(this Aspire.Hosting.IDistributedApplicationBuilder! builder, string! name, string! workingDirectory, Aspire.Hosting.ApplicationModel.JavaAppExecutableResourceOptions! options) -> Aspire.Hosting.ApplicationModel.IResourceBuilder<Aspire.Hosting.ApplicationModel.JavaAppExecutableResource!>!
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
#nullable enable
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
Aspire.Hosting.NodeJSHostingExtensions
static Aspire.Hosting.NodeJSHostingExtensions.AddPnpmApp(this Aspire.Hosting.IDistributedApplicationBuilder! builder, string! name, string! workingDirectory, string! scriptName = "start", string![]? args = null) -> Aspire.Hosting.ApplicationModel.IResourceBuilder<Aspire.Hosting.NodeAppResource!>!
static Aspire.Hosting.NodeJSHostingExtensions.AddViteApp(this Aspire.Hosting.IDistributedApplicationBuilder! builder, string! name, string? workingDirectory = null, string! packageManager = "npm") -> Aspire.Hosting.ApplicationModel.IResourceBuilder<Aspire.Hosting.NodeAppResource!>!
static Aspire.Hosting.NodeJSHostingExtensions.AddYarnApp(this Aspire.Hosting.IDistributedApplicationBuilder! builder, string! name, string! workingDirectory, string! scriptName = "start", string![]? args = null) -> Aspire.Hosting.ApplicationModel.IResourceBuilder<Aspire.Hosting.NodeAppResource!>!
static Aspire.Hosting.NodeJSHostingExtensions.WithNpmPackageInstallation(this Aspire.Hosting.ApplicationModel.IResourceBuilder<Aspire.Hosting.NodeAppResource!>! resource) -> Aspire.Hosting.ApplicationModel.IResourceBuilder<Aspire.Hosting.NodeAppResource!>!
static Aspire.Hosting.NodeJSHostingExtensions.WithPnpmPackageInstallation(this Aspire.Hosting.ApplicationModel.IResourceBuilder<Aspire.Hosting.NodeAppResource!>! resource) -> Aspire.Hosting.ApplicationModel.IResourceBuilder<Aspire.Hosting.NodeAppResource!>!
static Aspire.Hosting.NodeJSHostingExtensions.WithYarnPackageInstallation(this Aspire.Hosting.ApplicationModel.IResourceBuilder<Aspire.Hosting.NodeAppResource!>! resource) -> Aspire.Hosting.ApplicationModel.IResourceBuilder<Aspire.Hosting.NodeAppResource!>!
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ public static IResourceBuilder<OllamaResource> AddOllama(this IDistributedApplic
/// <returns>A reference to the <see cref="IResourceBuilder{T}"/>.</returns>
/// <remarks>This is to maintain compatibility with the Raygun.Aspire.Hosting.Ollama package and will be removed in the next major release.</remarks>
[Obsolete("Use AddOllama without a model name, and then the AddModel extension method to add models.")]
[System.Diagnostics.CodeAnalysis.SuppressMessage("ApiDesign", "RS0026:Do not add multiple public overloads with optional parameters", Justification = "<Pending>")]
public static IResourceBuilder<OllamaResource> AddOllama(this IDistributedApplicationBuilder builder,
string name = "Ollama", int? port = null, string modelName = "llama3")
{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
#nullable enable
20 changes: 20 additions & 0 deletions src/Aspire.CommunityToolkit.Hosting.Ollama/PublicAPI.Unshipped.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
Aspire.Hosting.ApplicationModel.OllamaResource
Aspire.Hosting.ApplicationModel.OllamaResource.AddModel(string! modelName) -> void
Aspire.Hosting.ApplicationModel.OllamaResource.ConnectionStringExpression.get -> Aspire.Hosting.ApplicationModel.ReferenceExpression!
Aspire.Hosting.ApplicationModel.OllamaResource.DefaultModel.get -> string?
Aspire.Hosting.ApplicationModel.OllamaResource.Models.get -> System.Collections.Generic.IReadOnlyList<string!>!
Aspire.Hosting.ApplicationModel.OllamaResource.OllamaResource(string! name) -> void
Aspire.Hosting.ApplicationModel.OllamaResource.PrimaryEndpoint.get -> Aspire.Hosting.ApplicationModel.EndpointReference!
Aspire.Hosting.ApplicationModel.OllamaResource.SetDefaultModel(string! modelName) -> void
Aspire.Hosting.ApplicationModel.OpenWebUIResource
Aspire.Hosting.ApplicationModel.OpenWebUIResource.ConnectionStringExpression.get -> Aspire.Hosting.ApplicationModel.ReferenceExpression!
Aspire.Hosting.ApplicationModel.OpenWebUIResource.OpenWebUIResource(string! name) -> void
Aspire.Hosting.ApplicationModel.OpenWebUIResource.PrimaryEndpoint.get -> Aspire.Hosting.ApplicationModel.EndpointReference!
Aspire.Hosting.OllamaResourceBuilderExtensions
static Aspire.Hosting.OllamaResourceBuilderExtensions.AddModel(this Aspire.Hosting.ApplicationModel.IResourceBuilder<Aspire.Hosting.ApplicationModel.OllamaResource!>! builder, string! modelName) -> Aspire.Hosting.ApplicationModel.IResourceBuilder<Aspire.Hosting.ApplicationModel.OllamaResource!>!
static Aspire.Hosting.OllamaResourceBuilderExtensions.AddOllama(this Aspire.Hosting.IDistributedApplicationBuilder! builder, string! name = "Ollama", int? port = null, string! modelName = "llama3") -> Aspire.Hosting.ApplicationModel.IResourceBuilder<Aspire.Hosting.ApplicationModel.OllamaResource!>!
static Aspire.Hosting.OllamaResourceBuilderExtensions.AddOllama(this Aspire.Hosting.IDistributedApplicationBuilder! builder, string! name, int? port = null) -> Aspire.Hosting.ApplicationModel.IResourceBuilder<Aspire.Hosting.ApplicationModel.OllamaResource!>!
static Aspire.Hosting.OllamaResourceBuilderExtensions.WithDataVolume(this Aspire.Hosting.ApplicationModel.IResourceBuilder<Aspire.Hosting.ApplicationModel.OllamaResource!>! builder, string? name = null, bool isReadOnly = false) -> Aspire.Hosting.ApplicationModel.IResourceBuilder<Aspire.Hosting.ApplicationModel.OllamaResource!>!
static Aspire.Hosting.OllamaResourceBuilderExtensions.WithDefaultModel(this Aspire.Hosting.ApplicationModel.IResourceBuilder<Aspire.Hosting.ApplicationModel.OllamaResource!>! builder, string! modelName) -> Aspire.Hosting.ApplicationModel.IResourceBuilder<Aspire.Hosting.ApplicationModel.OllamaResource!>!
static Aspire.Hosting.OllamaResourceBuilderExtensions.WithOpenWebUI<T>(this Aspire.Hosting.ApplicationModel.IResourceBuilder<T!>! builder, System.Action<Aspire.Hosting.ApplicationModel.IResourceBuilder<Aspire.Hosting.ApplicationModel.OpenWebUIResource!>!>? configureContainer = null, string? containerName = null) -> Aspire.Hosting.ApplicationModel.IResourceBuilder<T!>!
static Aspire.Hosting.OllamaResourceBuilderExtensions.WithReference<T>(this Aspire.Hosting.ApplicationModel.IResourceBuilder<T>! builder, Aspire.Hosting.ApplicationModel.IResourceBuilder<Aspire.Hosting.ApplicationModel.OllamaResource!>! ollama) -> Aspire.Hosting.ApplicationModel.IResourceBuilder<T>!
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
#nullable enable
Loading

0 comments on commit d569c50

Please sign in to comment.