Skip to content
iQBus HomeDocumentationBlogContact
Updated August 2, 2026
Build & extend/NuGet packages

NuGet packages

Each Application's own catalog of third-party .NET libraries that its pipeline components and custom functions reference, with full visibility into which consumers depend on which version.

ADD TO AN APPLICATION: REFERENCE FROM ANY CONSUMER IN IT nuget.org SOURCE Microsoft.Data.SqlClient Newtonsoft.Json RestSharp Public NuGet feed ADD THIS APPLICATION NuGet catalog Microsoft.Data.SqlClient 5.1.5 Microsoft.Data.SqlClient 6.0.2 Newtonsoft.Json 13.0.3 RestSharp 112.0.0 name + version, registered once USING Pipeline component using Microsoft.Data.SqlClient; CC.Art2link.Components · ExecuteAsync Custom function using Newtonsoft.Json; [CustomFunction] · fnParseJson any component or function in this Application One catalog per Application. Picking a row reveals every consumer in that Application bound to that exact version.

The NuGet catalog belongs to the Application, the same as every other artifact it owns. Every pipeline component and every custom function resolves its using statements against the catalog of the Application it lives in, and against no other. There is no shared workspace catalog: if two Applications need the same library, each registers it. Within an Application there is no rebuild step when a new consumer picks up a package that is already registered.

APPLICATION LEVEL: EVERY REGISTRATION BELONGS TO ONE APPLICATION APPLICATION A NUGET CATALOG Microsoft.Data.SqlClient 5.1.5 Newtonsoft.Json 13.0.3 CONSUMERS COMPONENT: SQLENRICH using SqlClient 5.1.5 FUNCTION: FNPARSEJSON using Newtonsoft.Json APPLICATION B NUGET CATALOG Microsoft.Data.SqlClient 6.0.2 · own registration RestSharp 112.0.0 CONSUMERS COMPONENT: CLAIMENRICH using SqlClient 6.0.2 FUNCTION: FNPOSTHOOK using RestSharp APPLICATION C NUGET CATALOG YamlDotNet 15.1.6 Newtonsoft.Json 13.0.3 · own registration CONSUMERS COMPONENT: CFGLOADER using YamlDotNet FUNCTION: FNTOJSON using Newtonsoft.Json Nothing crosses an Application boundary. Microsoft.Data.SqlClient is registered at 5.1.5 in Application A and at 6.0.2 in Application B, as two independent registrations. Changing one leaves the other untouched.

The catalog view follows the platform's Selected Application behavior, with an Application selected, the list filters to it and the Application column is hidden; with no selection, the list spans every Application you have access to and the column is shown. Adding a package uses the same flow: with an Application selected, the form opens with that Application preemptively chosen; without one, the form exposes an Application picker. Registrations are managed by the Application Owner and the Application Contributor, the same permission that governs every other artifact in the Application, no system-level role is involved.

Per Application, not per workspace. A package is registered for one Application. Two Applications can register the same package at different versions, and routinely do: the registrations are independent, so Application A can sit on 5.1.5 while Application B moves to 6.0.2, and neither move touches the other. Holding more than one version inside a single Application is also supported, by registering both versions explicitly in that Application's catalog (see below).

Packages are added from the NuGet catalog screen in the Art2link ESB UI, into the catalog of one Application. Each entry has a name and a version, both required, both verbatim as published on the feed.

Packages come from public nuget.org and nowhere else. There is no feed setting, and private or authenticated NuGet feeds are not supported. If a library is not published on nuget.org, it cannot be registered in an Application's catalog. Because there is no feed to authenticate against, a registration carries no credential of any kind.

FieldPurpose
Package nameThe package's ID on nuget.org. Case-sensitive, matched exactly, Microsoft.Data.SqlClient is not the same entry as microsoft.data.sqlclient.
VersionAn exact published version of that package (e.g., 5.1.5). Ranges and floating versions are not supported, the catalog holds resolved versions only.

Once saved, the package is available to every pipeline component and custom function in that Application, and to no consumer outside it. There is no compile step at the catalog level; the package becomes usable the moment a consumer saves code that references it.


From a pipeline component or a custom function, reference the package with a standard using statement at the top of the code, then call into its API the way any .NET project would. The platform resolves the using against the catalog of the consumer's own Application when the component or function is saved.

C#
using CC.Art2link.Attributes;
using System.Data;
using Microsoft.Data.SqlClient;   // resolved against the NuGet catalog

namespace Custom.Functions;

public static class DatabaseLookup
{
    [CustomFunction("fnLookupCustomerName")]
    public static string LookupCustomerName(string id, string connStr)
    {
        using var conn = new SqlConnection(connStr);
        conn.Open();
        // …
    }
}

The platform records the association from the consumer (this custom function, by name) back to the catalog entry (Microsoft.Data.SqlClient at the version this Application has registered). The association is what powers the impact-analysis view below.

📝
Add the package first. If a using references a package that is not in the Application's catalog, the component or function will not compile. A registration in a different Application does not count. Add the package to this Application's catalog before saving the code that references it. See Custom functions and Pipeline components for the surrounding compile-on-save flow.

Inside a single Application the same package can be registered at more than one version. Each version is a separate catalog entry, and each consumer is bound to one specific entry. A custom function that needs Microsoft.Data.SqlClient 5.1.5 and a pipeline component in the same Application that needs 6.0.2 can coexist without forcing the other to move.

ONE APPLICATION, SAME PACKAGE, TWO CATALOG ENTRIES CATALOG ENTRY Microsoft.Data.SqlClient 5.1.5 legacy callers CATALOG ENTRY Microsoft.Data.SqlClient 6.0.2 new callers Custom function fnLookupCustomer bound to 5.1.5 production, stable Pipeline component SqlEnrichComponent bound to 6.0.2 new feature, needs the API INDEPENDENCE Bumping 6.0.2 to a newer version touches only the consumers of that entry. 5.1.5 consumers keep resolving against 5.1.5 until someone deliberately moves them. A version change in one entry does not reach the other.
Different Applications can hold different versions. The side-by-side pattern above is the answer within one Application. Across Applications nothing is needed: because each Application registers packages independently, one Application can stay on Microsoft.Data.SqlClient 5.1.5 while another registers 6.0.2, with no coordination and no shared entry between them. An upgrade in one Application is invisible to the rest.

Every time a pipeline component or custom function is saved with a using that resolves to a catalog entry, the platform records the association: this consumer references this package at this version. The catalog list shows package + version on the left; selecting a row opens a detail panel that lists every consumer associated with that exact entry. Every consumer on that list belongs to the same Application as the entry, so the list is also the whole blast radius.

SELECT A PACKAGE: SEE EVERY CONSUMER NUGET CATALOG Orders Integration PACKAGE VERSION Microsoft.Data.SqlClient 5.1.5 Microsoft.Data.SqlClient 6.0.2 Newtonsoft.Json 13.0.3 RestSharp 112.0.0 YamlDotNet 15.1.6 SELECTED → CONSUMERS: MICROSOFT.DATA.SQLCLIENT 6.0.2 all in Orders Integration, the Application that owns the entry 3 REFERENCES Pipeline component, SqlEnrichComponent Application: Orders Integration PIPELINE COMPONENT Custom function, fnLookupVendor Application: Orders Integration CUSTOM FUNCTION Pipeline component, AuditTrailWriter Application: Orders Integration PIPELINE COMPONENT These three consumers would all be affected if this entry is upgraded or removed. Nothing outside.

The list is what makes a version bump or removal a deliberate decision rather than a guess. Before changing or removing a catalog entry, every consumer of that exact version is named, the pipeline components by name, the custom functions by name. Anything that breaks is in this list, and because the entry is owned by one Application, nothing outside that Application is in scope.

Each catalog entry has its own consumer list. Because a package at 5.1.5 and the same package at 6.0.2 are separate entries, their consumer lists are separate too. Selecting the 5.1.5 row shows only the consumers bound to 5.1.5; selecting 6.0.2 shows only the consumers bound to 6.0.2. The same package registered in a different Application is a different entry again, with a consumer list of its own.

The catalog supports the same two safe-to-do moves any package manager does, bumping a version and removing an entry, with the consumer list as the safety net. The recommended order is impact-first: look at who is bound to the entry before you touch it.

UPGRADE PATH: FOUR STEPS 1 Select the entry The package + version row in the catalog e.g. SqlClient 5.1.5 2 Read the impact Every pipeline component and custom function bound to this version CONSUMER LIST 3 Choose the move Upgrade the entry in place (all consumers move) or register the new version alongside the old (side by side) 4 Verify Re-open consumers, save, exercise the path. Same hot-reload model as the consumers' own articles.
MoveEffect
Edit version on an existing entryEvery consumer associated with that entry resolves against the new version on its next compile. The consumer list is the exact set of pipeline components and custom functions that need re-validating, all of them inside the entry's own Application.
Add the new version as a second entryExisting consumers stay on the old version. New consumers, or consumers that are deliberately moved, are bound to the new entry. Useful when the breaking change is large and consumers need to migrate one at a time.
Remove an entryPermitted only when the consumer list is empty. While any pipeline component or custom function in that Application still references it, the entry stays.
⚠️
An in-place version change is a version change for every consumer of that entry. Editing the version on a single catalog entry moves every pipeline component and custom function associated with that entry. The blast radius stops at the Application that owns the entry, other Applications keep their own registrations, but inside that Application it is everything on the consumer list. If the list has more than one row and the upgrade is risky, register the new version side by side and migrate consumers one at a time instead.

AspectDetail
Catalog scopeOne catalog per Application. A registration belongs to the Application it was created in and is invisible to every other Application. There is no shared workspace catalog.
Cross-Application reuseNone. If two Applications need the same library, each registers it. The two registrations are independent and may sit at different versions.
FeedPublic nuget.org only. Private and authenticated feeds are not supported, and there is no feed setting to change. Both names and versions are matched exactly.
VersioningExact resolved versions only, no ranges, no floating versions.
Side-by-side versionsSupported inside one Application. Each version is a separate catalog entry with its own consumer list.
ConsumersPipeline components and custom functions in the same Application. Other parts of the platform (ports, maps, expressions) do not reference NuGet packages.
PermissionsApplication Owner and Application Contributor, the same permission that governs every other artifact in the Application. No system-level role is involved.
RemovalAllowed when the entry has no consumers. The consumer list is the gating check.

One catalog per Application, every reference accounted for

Register the package in the Application that needs it, reference it with a using from any pipeline component or custom function in that Application, and let the catalog tell you who depends on what. Versions live side by side when they need to, and each Application moves on its own schedule. Upgrades begin with the consumer list, not a guess.