Skip to content

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: ','