ALOps App Compiler¶
Compile AL Extension(s) for Business Central using altool.exe from the NuGet package.
| Property | Value |
|---|---|
| Task name (Azure DevOps) | ALOpsAppCompiler@3 |
| Action name (GitHub) | alops-appcompiler |
| Version | 3.476.10779 |
| Category | Utility |
| OS requirement | Both |
| Preview | yes |
Compile Business Central extension(s) from AL code using altool.exe (microsoft.dynamics.businesscentral.development.tools NuGet package). Supports serial and parallel compilation modes.
Inputs¶
altool¶
| Name | Type | Required | Default | Platform | Description |
|---|---|---|---|---|---|
altool_package_version |
Text | yes | 17.0.30.49729-beta |
Both | Version of the microsoft.dynamics.businesscentral.development.tools NuGet package. Pin to a specific version for reproducible builds. |
compilation¶
| Name | Type | Required | Default | Platform | Description |
|---|---|---|---|---|---|
compilation_mode |
PickList | yes | Serial |
Both | Serial: compiles one app at a time. Parallel: uses workspace compile for concurrency. Options: Serial, Parallel. |
alsourcepath |
Text | no | (empty) | Both | Folder that contains app.json, or a root folder searched recursively for app.json files. Defaults to the working folder. Only locates the AL projects to compile; .NET add-in DLLs, already-present symbol .app files and the default symbol cache are taken from the working folder. |
alcachepath |
Text | no | (empty) | Both | Folder(s) containing symbol .app files. Comma-separated for several folders (not recursive - list each folder). Do not wrap entries in quotes. Defaults to the working folder when empty. Symbols downloaded by auto_resolve_* go to the first folder. |
maxcpucount |
Text | no | (empty) | Both | Maximum concurrent compilations in parallel mode. Defaults to logical processor count. |
alc_continue_build_on_error |
Boolean | no | false |
Both | Pass --continueBuildOnError to alc. Keeps compiling remaining files when a single file errors. |
additional_probing_paths |
Text | no | (empty) | Both | Extra folders searched (recursively) for .NET assemblies referenced from AL, e.g. the BC Service folder. Comma- or newline-separated. Do not wrap entries in quotes. Applies to Serial and Parallel compilation mode. |
generate_report_layouts |
Boolean | no | true |
Both | Generate report layout files during compilation. |
versioning¶
| Name | Type | Required | Default | Platform | Description |
|---|---|---|---|---|---|
appversiontemplate |
Text | no | 1.0.*.0 |
Both | Four-part version template. * = build number, ? = keep original, A = application field. |
updatebuildnumber |
Boolean | no | true |
Both | Update the CI build number with the compiled app version. |
appfilenametemplate |
Text | no | (empty) | Both | Template for the output .app filename. Empty uses %APP_PUBLISHER%_%APP_NAME%_%APP_VERSION%.app. Tokens: %APP_PUBLISHER%, %APP_NAME%, %APP_VERSION%, %BC_VERSION% (the bc_version input) and %BC_COUNTRY% (the bc_localization input). %PUBLISHER%, %APPNAME% and %VERSION% are accepted as aliases. %BC_TYPE% is kept for v2 templates and is always empty. Characters that are invalid in a file name become _. |
analysis¶
| Name | Type | Required | Default | Platform | Description |
|---|---|---|---|---|---|
alcodeanalyzer |
Text | no | (empty) | Both | Comma-separated list of code analyzers. Built-in: CodeCop, UICop, AppSourceCop, PTECop (alias PerTenantExtensionCop). Use NONE to disable. A path to a custom analyzer DLL is also accepted, but only in Serial compilation mode. |
ruleset |
Text | no | (empty) | Both | Path to a .ruleset.json file for code analysis. |
failonwarnings |
Boolean | no | false |
Both | Treat compiler warnings as errors. |
fail_on_any |
Boolean | no | false |
Both | Fail the task on any compiler diagnostic (error, warning, or info-level message). Stricter than failonwarnings. |
ignore_pragma |
Boolean | no | false |
Both | Silently skip diagnostics suppressed via #pragma warning disable in source. |
enable_external_rulesets |
Boolean | no | true |
Both | Allow rulesets to import other rulesets via include/exclude paths. |
symbols¶
| Name | Type | Required | Default | Platform | Description |
|---|---|---|---|---|---|
auto_resolve_ms_symbols |
Boolean | no | true |
Both | Download missing MS symbols from the MSSymbols NuGet feed (BC artifacts for NextMajor/NextMinor). |
force_download_mssymbols |
Boolean | no | false |
Both | Delete all Microsoft_*.app files from the symbol cache before resolving. Use in multi-localisation pipelines where the same cache path is reused across countries. |
bc_localization |
Text | no | W1 |
Both | Business Central country code for MS symbol resolution (e.g. W1, BE, NL). When the MSSymbols feed has no localized package for the country (for example IE has no Microsoft.Application.ie.symbols), the W1 package Microsoft.Application.symbols is used automatically. Individual Microsoft apps are resolved the same way: the localized package Microsoft.<App>.<cc>.symbols.<id> is preferred, and the W1 package Microsoft.<App>.symbols.<id> is used only when no localized version matches bc_version. |
bc_version |
Text | no | (empty) | Both | BC version filter in Major.Minor format (e.g. '25.0'). Special values 'NextMajor' and 'NextMinor' build against the latest Microsoft insider release (requires accepting the insider EULA — set automatically): all Microsoft symbols, test libraries included, are taken from the BC insider artifacts (country artifact first, then platform) and the MSSymbols feed is not used. Auto-detected from app.json when empty. |
ms_symbols_feed |
Text | no | https://dynamicssmb2.pkgs.visualstudio.com/DynamicsBCPublicFeeds/_packaging/MSSymbols/nuget/v3/index.json |
Both | NuGet v3 service index URL for the MSSymbols feed. |
ms_symbols_pat |
Secret | no | (empty) | Both | PAT for authenticated MSSymbols feed access. |
accept_insider_eula |
Boolean | no | false |
Both | Accept the Microsoft BC insider EULA for NextMajor/NextMinor. |
auto_resolve_appsource_symbols |
Boolean | no | true |
Both | Resolve missing ISV symbol dependencies from the AppSourceSymbols feed. |
appsource_symbols_feed |
Text | no | https://dynamicssmb2.pkgs.visualstudio.com/DynamicsBCPublicFeeds/_packaging/AppSourceSymbols/nuget/v3/index.json |
Both | NuGet v3 service index URL for the AppSourceSymbols feed. |
appsource_symbols_pat |
Secret | no | (empty) | Both | PAT for authenticated AppSourceSymbols feed access. |
diagnostics¶
| Name | Type | Required | Default | Platform | Description |
|---|---|---|---|---|---|
printappmanifest |
Boolean | no | true |
Both | Print the app.json contents to the log before compilation. |
outputalclogs |
Boolean | no | false |
Both | Echo the raw compiler output and non-diagnostic status lines, including pragma-suppressed and ignore-listed diagnostics. Error, warning and info diagnostics are always shown regardless of this setting. |
alc_error_log |
Boolean | no | false |
Both | Write per-app <AppName>_ALCErrorLog.txt (alc /errorlog JSON with error, warning and info issues) next to the compiled .app and publish it as artifact 'ALCErrorLog'. In Parallel mode altool has no errorlog option, so ALOps generates the file from the parsed compiler diagnostics. |
publishing¶
| Name | Type | Required | Default | Platform | Description |
|---|---|---|---|---|---|
publishartifact |
Boolean | no | true (alt: true) |
Azure DevOps only | Publish the compiled .app as a build artifact. |
publishxlif |
Boolean | no | false |
Both | Publish generated XLIF translation files (*.g.xlf) as a build artifact named 'ALOpsXLIF'. Enables the 'TranslationFile' compiler feature. |
outputpath |
Text | no | (empty) | Both | Folder where compiled .app files are written. When empty, defaults to the CI platform artifact directory. |
track_source_build_metadata |
Boolean | no | true |
Both | Inject build and source metadata into app.json. Requires runtime >= 12.0. |
manifest¶
| Name | Type | Required | Default | Platform | Description |
|---|---|---|---|---|---|
showmycode |
Text | no | (empty) | Both | Override showMyCode in app.json (true/false/empty=keep). |
internalsvisibleto |
Text | no | (empty) | Both | Comma-separated list of app IDs to add to internalsVisibleTo. |
preprocessorsymbols |
Text | no | (empty) | Both | Comma-separated list of preprocessor symbols for conditional compilation. |
updateruntime |
Text | no | (empty) | Both | Override the runtime field in app.json (e.g. "15.0"). Pass LATEST to auto-resolve via altool GetLatestSupportedRuntimeVersion (requires bc_version to be set). Empty = keep. |
updateplatform |
Text | no | (empty) | Both | Override the 'platform' version in app.json before compilation, e.g. "26.0.0.0". Also updates a governing directory.app.props.json when it defines 'platform'. Empty = keep. |
updateapplication |
Text | no | (empty) | Both | Override the 'application' version in app.json before compilation, e.g. "26.6.0.0". Also updates a governing directory.app.props.json when it defines 'application'. Empty = keep. |
rep_allowdebugging |
Text | no | (empty) | Both | Override resourceExposurePolicy.allowDebugging in app.json. Values: Enable / Disable / empty=keep. Mutually exclusive with showMyCode (REP wins on runtime >= 8). |
rep_allowdownloadingsource |
Text | no | (empty) | Both | Override resourceExposurePolicy.allowDownloadingSource in app.json. Values: Enable / Disable / empty=keep. |
rep_includesourceinsymbol |
Text | no | (empty) | Both | Override resourceExposurePolicy.includeSourceInSymbolFile in app.json. Values: Enable / Disable / empty=keep. |
applicationinsightskey |
Text | no | (empty) | Both | Application Insights Instrumentation Key (GUID) or full Connection String to write to app.json. Pass NONE to remove. Empty = keep. |
suppresswarnings |
Text | no | (empty) | Both | Comma-separated list of warning codes to write to suppressWarnings in app.json (e.g. AL0432,AL0606). Pass NONE or DISABLED to remove. Empty = keep. |
allowed_publisher_names |
Text | no | (empty) | Both | Whitelist of allowed app publishers. The task fails for any project whose publisher is not on this list. A publisher supplied by a governing directory.app.props.json (BC 2025w2+) is honoured. Empty = no enforcement. |
allowed_publisher_separator |
Text | no | , |
Both | Separator used to split allowed_publisher_names. |
Outputs¶
| Name | Description |
|---|---|
artifact_path |
Path to the last compiled .app file. |
artifact_paths |
Comma-separated list of all compiled .app file paths. |
build_version |
The computed app version (when updatebuildnumber is true). |
Usage¶
- task: ALOpsAppCompiler@3
displayName: 'ALOps App Compiler'
inputs:
altool_package_version: 17.0.30.49729-beta # Version of the microsoft.dynamics.businesscentral.development.tools NuGet package. Pin to a specific version for reproducible builds. $(altool_package_version)
compilation_mode: Serial # Serial: compiles one app at a time. Parallel: uses workspace compile for concurrency. $(compilation_mode)
alsourcepath: # Folder that contains app.json, or a root folder searched recursively for app.json files. Defaults to the working folder. Only locates the AL projects to compile; .NET add-in DLLs, already-present symbol .app files and the default symbol cache are taken from the working folder. $(alsourcepath)
alcachepath: # Folder(s) containing symbol .app files. Comma-separated for several folders (not recursive - list each folder). Do not wrap entries in quotes. Defaults to the working folder when empty. Symbols downloaded by auto_resolve_* go to the first folder. $(alcachepath)
maxcpucount: # Maximum concurrent compilations in parallel mode. Defaults to logical processor count. $(maxcpucount)
alc_continue_build_on_error: False # Pass --continueBuildOnError to alc. Keeps compiling remaining files when a single file errors. $(alc_continue_build_on_error)
additional_probing_paths: # Extra folders searched (recursively) for .NET assemblies referenced from AL, e.g. the BC Service folder. Comma- or newline-separated. Do not wrap entries in quotes. Applies to Serial and Parallel compilation mode. $(additional_probing_paths)
generate_report_layouts: True # Generate report layout files during compilation. $(generate_report_layouts)
appversiontemplate: 1.0.*.0 # Four-part version template. * = build number, ? = keep original, A = application field. $(appversiontemplate)
updatebuildnumber: True # Update the CI build number with the compiled app version. $(updatebuildnumber)
appfilenametemplate: # Template for the output .app filename. Empty uses `%APP_PUBLISHER%_%APP_NAME%_%APP_VERSION%.app`. Tokens: `%APP_PUBLISHER%`, `%APP_NAME%`, `%APP_VERSION%`, `%BC_VERSION%` (the `bc_version` input) and `%BC_COUNTRY%` (the `bc_localization` input). `%PUBLISHER%`, `%APPNAME%` and `%VERSION%` are accepted as aliases. `%BC_TYPE%` is kept for v2 templates and is always empty. Characters that are invalid in a file name become `_`. $(appfilenametemplate)
alcodeanalyzer: # Comma-separated list of code analyzers. Built-in: `CodeCop`, `UICop`, `AppSourceCop`, `PTECop` (alias `PerTenantExtensionCop`). Use `NONE` to disable. A path to a custom analyzer DLL is also accepted, but only in `Serial` compilation mode. $(alcodeanalyzer)
ruleset: # Path to a .ruleset.json file for code analysis. $(ruleset)
failonwarnings: False # Treat compiler warnings as errors. $(failonwarnings)
fail_on_any: False # Fail the task on any compiler diagnostic (error, warning, or info-level message). Stricter than failonwarnings. $(fail_on_any)
ignore_pragma: False # Silently skip diagnostics suppressed via `#pragma warning disable` in source. $(ignore_pragma)
enable_external_rulesets: True # Allow rulesets to import other rulesets via include/exclude paths. $(enable_external_rulesets)
auto_resolve_ms_symbols: True # Download missing MS symbols from the MSSymbols NuGet feed (BC artifacts for NextMajor/NextMinor). $(auto_resolve_ms_symbols)
force_download_mssymbols: False # Delete all `Microsoft_*.app` files from the symbol cache before resolving. Use in multi-localisation pipelines where the same cache path is reused across countries. $(force_download_mssymbols)
bc_localization: W1 # Business Central country code for MS symbol resolution (e.g. `W1`, `BE`, `NL`). When the MSSymbols feed has no localized package for the country (for example `IE` has no `Microsoft.Application.ie.symbols`), the W1 package `Microsoft.Application.symbols` is used automatically. Individual Microsoft apps are resolved the same way: the localized package `Microsoft.<App>.<cc>.symbols.<id>` is preferred, and the W1 package `Microsoft.<App>.symbols.<id>` is used only when no localized version matches `bc_version`. $(bc_localization)
bc_version: # BC version filter in Major.Minor format (e.g. '25.0'). Special values 'NextMajor' and 'NextMinor' build against the latest Microsoft insider release (requires accepting the insider EULA — set automatically): all Microsoft symbols, test libraries included, are taken from the BC insider artifacts (country artifact first, then platform) and the MSSymbols feed is not used. Auto-detected from app.json when empty. $(bc_version)
ms_symbols_feed: https://dynamicssmb2.pkgs.visualstudio.com/DynamicsBCPublicFeeds/_packaging/MSSymbols/nuget/v3/index.json # NuGet v3 service index URL for the MSSymbols feed. $(ms_symbols_feed)
ms_symbols_pat: # PAT for authenticated MSSymbols feed access. $(ms_symbols_pat)
accept_insider_eula: False # Accept the Microsoft BC insider EULA for NextMajor/NextMinor. $(accept_insider_eula)
auto_resolve_appsource_symbols: True # Resolve missing ISV symbol dependencies from the AppSourceSymbols feed. $(auto_resolve_appsource_symbols)
appsource_symbols_feed: https://dynamicssmb2.pkgs.visualstudio.com/DynamicsBCPublicFeeds/_packaging/AppSourceSymbols/nuget/v3/index.json # NuGet v3 service index URL for the AppSourceSymbols feed. $(appsource_symbols_feed)
appsource_symbols_pat: # PAT for authenticated AppSourceSymbols feed access. $(appsource_symbols_pat)
printappmanifest: True # Print the app.json contents to the log before compilation. $(printappmanifest)
outputalclogs: False # Echo the raw compiler output and non-diagnostic status lines, including pragma-suppressed and ignore-listed diagnostics. Error, warning and info diagnostics are always shown regardless of this setting. $(outputalclogs)
alc_error_log: False # Write per-app `<AppName>_ALCErrorLog.txt` (alc /errorlog JSON with error, warning and info issues) next to the compiled .app and publish it as artifact 'ALCErrorLog'. In Parallel mode altool has no errorlog option, so ALOps generates the file from the parsed compiler diagnostics. $(alc_error_log)
publishartifact: True # Publish the compiled .app as a build artifact. $(publishartifact)
publishxlif: False # Publish generated XLIF translation files (*.g.xlf) as a build artifact named 'ALOpsXLIF'. Enables the 'TranslationFile' compiler feature. $(publishxlif)
outputpath: # Folder where compiled .app files are written. When empty, defaults to the CI platform artifact directory. $(outputpath)
track_source_build_metadata: True # Inject build and source metadata into app.json. Requires runtime >= 12.0. $(track_source_build_metadata)
showmycode: # Override showMyCode in app.json (true/false/empty=keep). $(showmycode)
internalsvisibleto: # Comma-separated list of app IDs to add to internalsVisibleTo. $(internalsvisibleto)
preprocessorsymbols: # Comma-separated list of preprocessor symbols for conditional compilation. $(preprocessorsymbols)
updateruntime: # Override the runtime field in app.json (e.g. "15.0"). Pass LATEST to auto-resolve via altool GetLatestSupportedRuntimeVersion (requires bc_version to be set). Empty = keep. $(updateruntime)
updateplatform: # Override the 'platform' version in app.json before compilation, e.g. "26.0.0.0". Also updates a governing directory.app.props.json when it defines 'platform'. Empty = keep. $(updateplatform)
updateapplication: # Override the 'application' version in app.json before compilation, e.g. "26.6.0.0". Also updates a governing directory.app.props.json when it defines 'application'. Empty = keep. $(updateapplication)
rep_allowdebugging: # Override resourceExposurePolicy.allowDebugging in app.json. Values: Enable / Disable / empty=keep. Mutually exclusive with showMyCode (REP wins on runtime >= 8). $(rep_allowdebugging)
rep_allowdownloadingsource: # Override resourceExposurePolicy.allowDownloadingSource in app.json. Values: Enable / Disable / empty=keep. $(rep_allowdownloadingsource)
rep_includesourceinsymbol: # Override resourceExposurePolicy.includeSourceInSymbolFile in app.json. Values: Enable / Disable / empty=keep. $(rep_includesourceinsymbol)
applicationinsightskey: # Application Insights Instrumentation Key (GUID) or full Connection String to write to app.json. Pass NONE to remove. Empty = keep. $(applicationinsightskey)
suppresswarnings: # Comma-separated list of warning codes to write to suppressWarnings in app.json (e.g. AL0432,AL0606). Pass NONE or DISABLED to remove. Empty = keep. $(suppresswarnings)
allowed_publisher_names: # Whitelist of allowed app publishers. The task fails for any project whose publisher is not on this list. A publisher supplied by a governing directory.app.props.json (BC 2025w2+) is honoured. Empty = no enforcement. $(allowed_publisher_names)
allowed_publisher_separator: , # Separator used to split `allowed_publisher_names`. $(allowed_publisher_separator)
- name: ALOps App Compiler
uses: HodorNV/ALOps/Actions/alops-appcompiler@master
with:
altool_package_version: '17.0.30.49729-beta'
compilation_mode: 'Serial'
alsourcepath: ''
alcachepath: ''
maxcpucount: ''
alc_continue_build_on_error: 'false'
additional_probing_paths: ''
generate_report_layouts: 'true'
appversiontemplate: '1.0.*.0'
updatebuildnumber: 'true'
appfilenametemplate: ''
alcodeanalyzer: ''
ruleset: ''
failonwarnings: 'false'
fail_on_any: 'false'
ignore_pragma: 'false'
enable_external_rulesets: 'true'
auto_resolve_ms_symbols: 'true'
force_download_mssymbols: 'false'
bc_localization: 'W1'
bc_version: ''
ms_symbols_feed: 'https://dynamicssmb2.pkgs.visualstudio.com/DynamicsBCPublicFeeds/_packaging/MSSymbols/nuget/v3/index.json'
ms_symbols_pat: ''
accept_insider_eula: 'false'
auto_resolve_appsource_symbols: 'true'
appsource_symbols_feed: 'https://dynamicssmb2.pkgs.visualstudio.com/DynamicsBCPublicFeeds/_packaging/AppSourceSymbols/nuget/v3/index.json'
appsource_symbols_pat: ''
printappmanifest: 'true'
outputalclogs: 'false'
alc_error_log: 'false'
publishxlif: 'false'
outputpath: ''
track_source_build_metadata: 'true'
showmycode: ''
internalsvisibleto: ''
preprocessorsymbols: ''
updateruntime: ''
updateplatform: ''
updateapplication: ''
rep_allowdebugging: ''
rep_allowdownloadingsource: ''
rep_includesourceinsymbol: ''
applicationinsightskey: ''
suppresswarnings: ''
allowed_publisher_names: ''
allowed_publisher_separator: ','