Building & Publishing Extensions
After defining your API services, analyze them, build them into a .pkg package, and publish to a repository for distribution.
Analyze
Click Analyze to validate your service definitions for the selected node (project, application, or service):
- Fetches each service's spec from its Definition URI.
- Validates the spec and generates typed .NET DTOs and operation metadata.
- Reports status per service (Not Analyzed / Analyzed) and writes diagnostic output to the service's Logs tab.
Fix any errors before building. An indeterminate progress bar and, for multiple services, a "completed / total" tag show progress; results appear in an info bar.
Build
Click Build to compile the extension package:
- Generates typed .NET DTOs from the service schemas.
- Compiles the assembly.
- Packages everything into a
.pkgfile at the Export Path (set in the Project Panel). If Export Path is empty, a folder picker is shown first.
When the build succeeds, a "The package has been generated" dialog shows the full .pkg path with a Copy Path button. The built package is not installed automatically — install it separately (see below).
Publishing to a Repository
From Studio
- Click Publish to Repository in the toolbar.
- Confirm in the Publish to Extension Repository dialog.
Publishing requires you to be signed in (from the My Account view). The package is uploaded to the Extension Repository that corresponds to your account's region; no repository URL is entered in Studio.
You will see an error if:
- The project has not been built yet — "Build the project first before publishing."
- You are not signed in — "You must be signed in to publish an extension. Please log in from the My Account view first."
From CLI
# Analyze a spec AND pack it into a .pkg in one step
aeth analyze https://petstore.swagger.io/v2/swagger.json \
--type openapi --app-name "Swagger Petstore" --service-name "Petstore API" \
--namespace "MyCompany.Petstore" --out ./out
# Publish a built package to a local repository folder
aeth publish ./MyExtension.pkg --repo ./local-repo
# Publish a built package to a remote repository
aeth publish ./MyExtension.pkg --repo https://extensions.example.com
# 'package upload' is an alias for publish
aeth package upload ./MyExtension.pkg --repo https://extensions.example.com
aeth analyze (alias analyse) supports --type values: openapi/swagger, soap/wsdl, odata/csdl/edm/edmx, and grpc/proto. Optional flags: -u/--username, -p/--password, -an/--app-name, -sn/--service-name, -ns/--namespace, -o/--out/--output, --version.
aeth publish / aeth package upload accept the package path followed by -r/--repo <url>. A local path copies the file; an http(s) URL uploads it (using an API key from the URL/user-info or settings, or your signed-in bearer token).
Versioning
Extension versions follow the format Major.Minor.Patch[.Revision]:
1.0.0 — initial release
1.1.0 — new operations added
1.1.1 — bug fix
2.0.0 — breaking changes
Set the version in the Project Panel (using Auto Version, or Version when it is off) before building. When publishing an update, the version must be strictly greater than the currently published version — this is enforced by the repository.
Installing the Built Extension
After building, install the .pkg on another machine or share it with a teammate:
# From a local .pkg file
aeth install ./MyExtension.pkg
# From the repository, by package id
aeth install MyCompany.MyExtension --version 1.0.0
# Force re-install / overwrite
aeth install MyCompany.MyExtension --force
aeth install accepts a .pkg file or a package id, with optional --version, -r/--repo, and -f/--force.
Build Troubleshooting
| Problem | Likely Cause | Solution |
|---|---|---|
| Compilation errors | Duplicate type names | Adjust the namespace in service/analysis settings |
| Schema not found | URL unreachable or file missing | Verify the Definition URI |
| Build hangs | Large schema with many types | Build from the CLI with --out |
| Publish rejected | Version not greater than existing | Increment the version number |
| Publish blocked | Not signed in | Sign in from the My Account view first |