Files
BAT/exchangeResources/README.md
2026-09-15 13:06:45 -05:00

6.5 KiB

Ignition Exchange resources

Getting an Ignition project ready to publish on the Ignition Exchange means following Inductive Automation's naming and structure conventions — mainly so that when someone imports your resource into a project they already have, nothing of theirs gets overwritten.

These files help you do that.

File What it's for
exchange_lint.py Check your project against the conventions. Start here.
PUBLISHING.md Package and upload it, once it passes.
Exchange+Resources+Style+Guide.md The official guide, v1.1.0. Every rule traces back to it.

The path: check your project → fix what it reports → follow PUBLISHING.md.


Checking your project

python3 exchange_lint.py /path/to/YourProject

Nothing to install — Python 3.8+ and the standard library.

Point it at any of these:

  • your project folder
  • a folder containing several projects (a gateway's projects/ directory, an unpacked gateway backup, your repo)
  • a project export .zip
  • nothing, to scan the current directory

There's no config file. It works out your resource name from the namespace your project already uses, and picks up tag exports and .sql dumps sitting alongside.


Reading the report

Ignition Exchange Style Guide v1.1.0 — conformance report

project: my-dashboard    resource: MyDashboard

  Resource Structure
    FAIL E-NS-ROOT     script-python/myutils: project library package
                       'myutils' is not under exchange/<resource>/; importing
                       would land scripts in the host project's namespace

  Perspective
    warn E-COMP-NAME   views/Exchange/MyDashboard/Home: component 'headerRow'
                       should be PascalCase

  summary: 1 failure(s), 12 warning(s); 21 of 38 rules exercised

Each finding gives you the file, the problem, and why it matters.

FAIL — fix these before publishing

Either the guide says must, or the rule protects your resource from damaging someone else's project on import: resource namespacing, session properties, Vision client tags, and the project-name character set.

warn — your call

These are naming conventions. The guide is explicit that they're "encouraged, however these conventions are not required", and that consistency matters more than which convention you choose. Read them, decide, move on. Add --strict if you'd rather treat them as failures.

"21 of 38 rules exercised"

How many rules actually applied to your project. If you have no database, no tags and no named queries, those rules never ran — so a pass on a small project isn't mistaken for a pass on everything.

Exit codes: 0 clean · 1 findings · 2 bad invocation.


What gets checked

38 rules. Run python3 exchange_lint.py --list-rules for the full list with descriptions.

Area What it looks at
Resource structure Everything namespaced under Exchange/<Resource>/ or exchange/<resource>/ — the guide's one hard must, and what keeps your import from overwriting the host project
Projects URL-friendly project name, human-friendly title, no version suffix
Perspective Naming of views, components, properties, pages and style classes; where style classes live; message-handler namespacing
Variable storage No session custom properties, no Vision client tags — both break a clean import
Code Tab indentation, camelCase functions and variables, PascalCase classes, docstrings, comment style, project-library layout
Loggers exchange.resourceName.LoggerName hierarchy
Database ex_ table prefix, snake_case, id primary key, <table>_id foreign keys
Tags · Vision · Named queries · WebDev · Translations Naming conventions for each
Upload readiness Description filled in, installation documentation present

What it can't check for you

A clean report doesn't mean ready to publish. Still on you:

  • What's written on screen. It reads names and structure, never label text. A visible string like "Acme Internal — do not distribute" passes silently. Search your user-visible strings before you publish.
  • That references still resolve. It doesn't confirm an embedded view path, style class or script call points at something real. If you've just renamed things to fit the conventions, verify the project still works.
  • That it runs. Nothing is executed or rendered. Load it on a gateway and open the screens.
  • Your export. The documentation rule checks your working folder, not the zip you upload. See PUBLISHING.md.

Options

Flag Effect
--resource NAME Set your resource name, if the inferred one is wrong
--strict Treat every warning as a failure
--ignore E-PY-VAR,E-COMP-NAME Suppress specific rules
-v Show every occurrence instead of collapsing per rule
--max-per-rule N Change the collapse limit (default 8)
--json Machine-readable output, for CI
--tags / --sql Point at tag exports or SQL dumps explicitly
--list-rules Print the full rule table and exit

Findings that need context

Three rules produce messages that can be confusing on first read.

E-NS-ROOT — why capital Exchange/ sometimes and lowercase exchange/ other times? That's the guide's convention, not a typo. Views, windows, templates, named queries, reports, SFCs, transaction groups, alarm pipelines and tags go under Exchange/. Style classes, the project library, WebDev sources and images go under exchange/. Using the wrong root is a FAIL; using the right root with the wrong capitalisation is just a warning (E-NS-CASE).

E-STYLE-HIER may flag a class you're sharing deliberately. It decides where a style class belongs by finding which views reference it — but it only sees class names written as plain text. If you build one in a binding, like 'exchange/my-resource/priority/' + level.lower(), it can't see that usage and may report a shared class as used by only one view. If that's your situation, the warning is safe to ignore.

E-PAGE-ROOT isn't in the guide. It's an added caution: mapping a page to / means your resource takes over the root URL of whatever project it's imported into. Worth knowing before you decide — the trade-off is that a resource with no / page can't be launched from the gateway's Perspective project list, only from its full page URL.