All pages
Powered by GitBook
1 of 41

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

What's New in 5.4.1

Release Notes

Bug

COMMANDBOX-1374 Some installs unnecessarily write to the box.json

COMMANDBOX-1370 ConfigService::settingExists() fails in race conditions due to non-varscoped variables in JSONService

Improvement

COMMANDBOX-1372 Support excludePaths in watcher DSL and watch command

COMMANDBOX-1369 Ensure Adobe wars have a seeds.properties file

COMMANDBOX-1368 Add tab complete for "env clear" command

COMMANDBOX-1367 Ignore empty startScript on server start

What's New in 5.4.2

  • There is a fix for a regression introduced in 5.4.0 where updating the version of a CF engine doesn't work without forgetting the server first.

  • There is also an important security improvement to CommandBox servers. Thanks to Abram Adams for reporting this to Ortus so we could address it.

Release notes

Note, the details of the security improvement have been tracked privately.

Bug

Java path shows up twice in "server info --verbose"

Updating server in-place keeps old web.xml path

recipe with multiple "install" instructions fails

Improvement

Add additional interceptData to server interceptors

Update to WireBox 6.5.2

Immediately activate modules after installation

Improve multiselect DSL

Story

Add JSON and Properties output for info command

COMMANDBOX-1382
COMMANDBOX-1381
COMMANDBOX-1375
COMMANDBOX-1380
COMMANDBOX-1379
COMMANDBOX-1376
COMMANDBOX-1349
COMMANDBOX-1120

5.x Versions

In this section you will find the release notes for the 5.x version of CommandBox.

  • Version 5.4.2 - October 2021

  • Version 5.4.1 - September 2021

  • Version 5.4.0 - August 2021

  • Version 5.3.0 - May 2021

  • Version 5.2.1 - Dec 2020

  • Version 5.2.0 - Nov 2020

  • Version 5.1.1 - June 2020

  • Version 5.1.0 - May 2020

  • Version 5.0.0 - Mar 2020

What's New in 5.1.1

This release was primarily to address a regression in 5.1.0 affecting Mac OS users who tried to start Lucee servers. If you see an error similar to this on a Lucee server and you're running a Mac and CommandBox 5.1.0, then this release will fix it for you.

If you are upgrading from CommandBox 5.1.0, there are only a handful of tickets which are listed below. If you are updating from an earlier version of CommandBox, please check out our and release blogs.

Release notes

Bug

  • [] - Overzealous gitignore matching of parent directories when zipping up for ForgeBox storage

  • [] - Enabling SSL results in some CFHTTP requests to fail.

  • [] - writedump failing in Lucee

  • [] - File globbing matching partial file names

Improvement

  • [] - Allow for verbose startup without debug logging of requests

lucee.runtime.exp.NativeException: mac os x is not a supported OS platform.
5.0.0
5.1.0
COMMANDBOX-1107
COMMANDBOX-1173
COMMANDBOX-1178
COMMANDBOX-1179
COMMANDBOX-1181

3.x Versions

In this section you will find the release notes for the 3.x version of CommandBox.

  • Version 3.9.0 - Nov 2017

  • Version 3.8.0 - Aug 2017

  • Version 3.7.0 - Jul 2017

  • Version 3.6.0 - Mar 2017

  • Version 3.5.0 - Jan 2017

  • Version 3.4.0 - Nov 2016

  • Version 3.3.0 - Oct 2016

  • Version 3.2.0 - Jul 2016

  • Version 3.1.1 - Jul 2016

  • Version 3.0.1 - Feb 2016

  • Version 3.0.0 - Feb 2016

4.x Versions

In this section you will find the release notes for the 4.x version of CommandBox.

  • Version 4.8.0 - Sept 2019

  • Version 4.7.0 - June 2019

  • Version 4.6.0 - Mar 2019

  • Version 4.5.0 - Dec 2018

  • Version 4.4.0 - Nov 2018

  • Version 4.3.0 - Oct 2018

  • Version 4.2.0 - Aug 2018

  • Version 4.1.0 - Jun 2018

  • Version 4.0.0 - Jun 2018

What's New in 3.0.1

Properties weren't being read correctly from the server.json file. If you have been using server.json, please double check the format of the file here in our docs:

http://commandbox.ortusbooks.com/content/embedded_server/serverjson.html

This fix will make this functionality work as expected:

server set web.http.port=8000
server start

Upgrading

If you already have 3.0.0 then this fix only affects the CFML bits and is very easy for you to install. Simply run this command:

upgrade

If you're still on CommandBox 2.x, check out our 3.0.0 release announcement to see the cool new stuff.

Release History

In this section you will find the release notes for each version we release under this major version. If you are looking for the release notes of previous major versions use the version switcher at the top left of this documentation book. Here is a breakdown of our major version releases.

  • - Mar 2020 - May 2021

  • - Jun 2018 - Sept 2019

  • - Feb 2016 - Nov 2017

  • - June 2015 - Nov 2015

  • - Feb 2015

Versions 5.x
Versions 4.x
Versions 3.x
Versions 2.x
Versions 1.x

What's New in 4.1.0

Release Highlights

  • Fixed the annoying "server spanner" error that *nix users saw when starting servers.

  • Updated CLI engine (and default server) version to Lucee 5.2.7.63 which includes an important security fix.

  • Added a new "noninteractive" setting to improve the output on build servers like Jenkins or Travis-CI

  • Task runner metadata changes picked up without needing to reload the CLI

  • Ability to load ad-hoc modules on the fly from Task Runners

Release Notes

Here's the full list of tickets we addressed in the 4.1.0 release. Thanks to those who send me pull requests for some of these fixes and features!

Bug

  • [COMMANDBOX-791] - server start on linux: "/bin/bash not found" message displays

  • [COMMANDBOX-799] - Improve port binding logic

  • [COMMANDBOX-802] - Task component metadata is not refreshed before each run

  • [COMMANDBOX-806] - Error when invalid UTF-8 characters are in servers.json

New Feature

  • [COMMANDBOX-669] - Localized CommandBox Modules

  • [COMMANDBOX-793] - Add new slugify function to the formatter utility

  • [COMMANDBOX-794] - When creating coldbox skeleton apps, clear out the basic name, slug, version, location and scripts so the user can configure them

  • [COMMANDBOX-797] - Added new bundles,labels,verbose,directory arguments to the testbox watch command to allow for granular executions

  • [COMMANDBOX-798] - Added verbose options to passthrough to the testbox runner so it true it can return the debug buffer

Improvement

  • [COMMANDBOX-792] - Remove legacy installColdbox, installColdboxBE, installTestbox arguments from create commands

  • [COMMANDBOX-796] - Added ability to visualize the exception stacktraces with a configurable depth.

  • [COMMANDBOX-800] - Add setting to force "non interactive" shell that disables fancypants progress output

  • [COMMANDBOX-803] - Change user agent on downloader to get around proxies like cloudflare

  • [COMMANDBOX-804] - Store less "result" text in CommandBox's servers.json

  • [COMMANDBOX-807] - Upgrade core Lucee engine to 5.2.7.63

What's New in 2.2.0

Release Notes

Bug

  • [COMMANDBOX-104] - Execute command doesn't work in interactive shell

  • [COMMANDBOX-112] - Testbox create commands break if testname includes package

  • [COMMANDBOX-270] - installpaths not added when not creating package directory

  • [COMMANDBOX-271] - Git endpoint psses java.io.File instead of string

  • [COMMANDBOX-273] - HTTP Endpoint package name guessing doesn't account for periods in file name

  • [COMMANDBOX-274] - When you do an 'update' command, it updates the modules but does not update the box.json with the latest version

  • [COMMANDBOX-275] - SQL Server JDBC driver doesn't work

  • [COMMANDBOX-282] - Sign Debian packages

New Feature

  • [COMMANDBOX-258] - Update the status command to output the results in json

  • [COMMANDBOX-268] - Update coldbox model generator to allow the creation of accessors

  • [COMMANDBOX-269] - Add ability to generate properties on coldbox model generations

  • [COMMANDBOX-272] - Update all BDD tests to fail by default to promote refactoring and process

  • [COMMANDBOX-277] - CFLib endpoint

  • [COMMANDBOX-278] - RIAForge Endpoint

Improvement

  • [COMMANDBOX-204] - Add a directory argument for the REPL

  • [COMMANDBOX-265] - REPL's handling of functions that output content

  • [COMMANDBOX-267] - Optimize JVM Memory Arguments to Prevent PermGen and Java.lang.outOfMemory errors

  • [COMMANDBOX-276] - Improve error message when ForgeBox REST API is down

  • [COMMANDBOX-280] - Update to latest Lucee stable build

  • [COMMANDBOX-281] - Update to latest ColdBox application templates

What's New in 3.8.0

Bug

  • [COMMANDBOX-665] - Relative SSL certFile or keyFile path in server.json isn't expanded

  • [COMMANDBOX-674] - propertyfile set errors if file doesn't exist

New Feature

  • [COMMANDBOX-675] - Allow relative property file paths in task runners

Improvement

  • [COMMANDBOX-666] - Allow custom tray contributions to have relative image path

  • [COMMANDBOX-667] - Improve coldbox create app --wizard

  • [COMMANDBOX-671] - Always run onServerInstall

  • [COMMANDBOX-672] - add getInstance() to base interceptor class

  • [COMMANDBOX-673] - Improve handling of loading a bad modules

  • [COMMANDBOX-678] - Command to normalize line endings for a batch of files

  • [COMMANDBOX-679] - Improve package parsing regex for private packages

2.x Versions

In this section you will find the release notes for the 2.x version of CommandBox.

  • Version 2.2.0 - Nov 2015

  • Version 2.1.1 - Aug 2015

  • Version 2.1.0 - Aug 2015

  • Version 2.0.0 - June 2015

What's New in 4.7.0

Here's the full list of what we've packed into the 4.7.0 release. Click any ticket link for more details.

Bug

  • [] - CommandBox not recognizing implicit folder endpoint

  • [] - Update semver for fix in prerelease comparison

  • [] - Tokenizer breaks "run" command with odd syntax

  • [] - init-wizard command is incorrectly aliasing as init

  • [] - File watcher that modifies the file system triggers the watcher again

  • [] - bump command doesn't work on a submodule

  • [] - Text on standard input causes banner and prompt to be blank

  • [] - Inconsistent behavior of "run" command.

  • [] - Tab completion incorrect for some partial command names

  • [] - Interactive jobs are not thread safe

Improvement

  • [] - Leading zeros in semver prevent them from being matched

  • [] - Allow --verbose flag on uninstall command

  • [] - Add --roundup flag to indents command

  • [] - JSON Schema for box.json

  • [] - Update JGit to 5.3.0.201903130848-r

  • [] - Update Jline to 3.10.0

  • [] - Remove Riaforge endpoint Rince riaforge is dead

  • [] - Modify default box.json from "init" command

  • [] - Add box: namespace for compat with Coldbox injection DSL

  • [] - Improve debugging and error messages for custom ForgeBox endpoints

  • [] - If the test runner produces a 500 exception during watcher no output is shown

  • [] - support for Environment variables in "Key" names

  • [] - Make env vars in CommandBox visible to native OS binaries

  • [] - Launching VSCode from ConEMU screws up the integrated terminal

  • [] - Keep relative installPaths in box.json

What's New in 3.4.0

Bug Fixes

This release fixes an issue where Adobe CF servers will not start if you're machine is offline and also fixes a bug where the previous version of CommandBox didn't correctly remove old versions of jar files on upgrade.

Enhancements

Git tags when bumping a package command can have a custom prefix now. Tab completion options are also alphabetized. Ctrl-C is also handled better on Unix and actually works in Windows! Also, the timestamp on your sever.json file won't be updated unless the contents of the file actually changed.

Release Notes

Here is the full list of everything that changed in the CommandBox 3.4.0 release.

Bug

  • [] - Adobe Servers won't start offline

  • [] - start serverConfigFile=myServer.json doesn't load json settings

  • [] - Adobe web.xml Flex config path is wrong after first engine start

  • [] - Error checking whether server is running

  • [] - cflib-coldbox endpoint creates invalid CFML for Adobe

  • [] - write history before command finishes

  • [] - Coldbox create interceptor doesn't create test with proper CFC mapping

  • [] - war path not stored in server.json as relative path

  • [] - CFML upgrades don't delete removed files

  • [] - Forgetting a named server deletes the 'default' server.json too

New Feature

  • [] - allow bump Git tag to have custom prefix

Improvement

  • [] - testbox create bdd include describe and it block

  • [] - Allow server list to filter partial server names

  • [] - Sort tab completion options

  • [] - Also negate boolean options with "no" in front

  • [] - Stop model scaffolding with empty names

  • [] - Handle Control-C better in the shell

  • [] - Improve check for previously-installed package

  • [] - Don't update modified date of server.json unless actually modified.

  • [] - Starting named server inherits same server.json settings

COMMANDBOX-962
COMMANDBOX-967
COMMANDBOX-970
COMMANDBOX-972
COMMANDBOX-978
COMMANDBOX-985
COMMANDBOX-986
COMMANDBOX-988
COMMANDBOX-989
COMMANDBOX-990
COMMANDBOX-956
COMMANDBOX-957
COMMANDBOX-958
COMMANDBOX-959
COMMANDBOX-968
COMMANDBOX-969
COMMANDBOX-971
COMMANDBOX-973
COMMANDBOX-974
COMMANDBOX-976
COMMANDBOX-979
COMMANDBOX-982
COMMANDBOX-983
COMMANDBOX-984
COMMANDBOX-987
COMMANDBOX-471
COMMANDBOX-472
COMMANDBOX-475
COMMANDBOX-480
COMMANDBOX-484
COMMANDBOX-485
COMMANDBOX-491
COMMANDBOX-492
COMMANDBOX-494
COMMANDBOX-496
COMMANDBOX-476
COMMANDBOX-477
COMMANDBOX-481
COMMANDBOX-486
COMMANDBOX-487
COMMANDBOX-488
COMMANDBOX-489
COMMANDBOX-493
COMMANDBOX-495
COMMANDBOX-497

1.x Versions

In this section you will find the release notes for the 1.x version of CommandBox.

  • Version 1.0.0 - Feb 2015

What's New in 4.4.0

Iterate over JSON with foreach command

The foreach command which was introduced recently and allows you to iterate over any list of input and run a command using each item in the list has been enhanced to also allow you to iterate from the CLI over any JSON string that you pipe in.

Directory Watchers have more data

Now when you create a directory watcher in a task runner or custom command, you can not only get notified when something in that directory changes, but you also now receive a list of files added, removed, and modified.

New "coldbox watch-reinit" command

Thanks to Scott Steinbeck, we have a new command called coldbox watch-reinit. This will watch for changes to certain files in your project and will automatically issue a framework reinit when you edit things like configs or services.

Color all the JSONs

Thanks to John Berquist, CommandBox now has sweet color coding any time it outputs JSON to the screen. Try it out by running something like "server show".

Users can also customize the colors they see for JSON with the following config settings:

  • json.ansiColors.constant

  • json.ansiColors.key

  • json.ansiColors.number

  • json.ansiColors.string

Setting values can be any color name from the system-colors command.

New Gist endpoint

Thanks to Jason Steinshouer we have a new Gist endpoint for installing code from a public Gist.

4.4.0 Release Notes

Bug

  • [] - testbox watcher shows error when test fail

  • [] - Tab complete doesn't work on param values with spaces

  • [] - Long lines wrap in interactive jobs

  • [] - Exact versions don't update from ForgeBox when manually changed.

  • [] - Passing positional args to task errors with required param

New Feature

  • [] - Allow watcher access to files that were added, removed, updated

  • [] - coldbox watch-reinit command

  • [] - Color code JSON on console output by default

Improvement

  • [] - Refresh any salt values when deploying a new CF engine.

  • [] - Add Gist endpoint

  • [] - Change update behavior of GIT and URL endpoints to use semver in path if present

  • [] - Enhance foreach command to accept JSON

  • [] - ACF 11 should start without Secure Profile

  • [] - Enhance "forgebox search" command to break up versions like "forgebox show"

  • [] - Support versions like 0.5.2 in forgebox show/search output

  • [] - Speed up embedded server start

What's New in 4.6.0

Release Notes

Bug

  • [] - Server commands can have huge delay on Windows

  • [] - List artifacts alphabetically.

  • [] - /usr/bin/open on Linux

  • [] - Errors in command CFCs can cause box to exit completely during tab complete

  • [] - Running native binary that returns lots of text can perform poorly

  • [] - Interceptor service blows up if you register a module with an interceptor not matching any current states

  • [] - Allow modules to register an interceptor with no currently valid states

  • [] - Catch errors from desktop.isDesktopSupported()

New Feature

  • [] - Allow system setting (env var) expansions in REPL

  • [] - Improve task DSL to allow access to exit code

  • [] - Add config setting to debug raw native command being used in the "run" command

Improvement

  • [] - Enforce correct casing conventions on scaffolding commands

  • [] - Update propertyFile core module

  • [] - Improve default ignores in box.json from init command.

  • [] - Disable ping to time server host by default

  • [] - Allow exit code to be returned via "return" keyword

  • [] - Improve syntax highlighting in REPL

  • [] - Checking interrupted status from inside a thread doesn't end the task/command

  • [] - Remove hint from default CFC in Lucee for CommandBox CFCs with no hint of their own

  • [] - Endpoint URL shows incorrectly for forgebox endpoints

  • [] - Enhance tab complete for private slugs

What's New in 2.1.1

This fixes a bug in the "update" and "outdated" commands that caused them to error after you had installed packages from an endpoint other than ForgeBox. Note, packages installed from HTTP(S) and Git endpoints will always show as outdated and will always update since those endpoints don't provide a way to know what version they're hosting without downloading the entire package anyway.

We also included a small enhancement to the Git endpoint to allow for authentication via public/private SSH keys. As long as you have a public key configured on your Git server and the private key is stored in ~/.ssh/ using a standard name, SSH-based clones should automatically authenticate. Please see for more info.

As always, the is located here:

Release Notes

Bug

  • [] - update command erroring

New Feature

  • [] - Git SSH endpoint private key support

Improvement

  • [] - Standardize parameter names for install command

COMMANDBOX-934
COMMANDBOX-937
COMMANDBOX-939
COMMANDBOX-942
COMMANDBOX-949
COMMANDBOX-950
COMMANDBOX-951
COMMANDBOX-953
COMMANDBOX-930
COMMANDBOX-932
COMMANDBOX-944
COMMANDBOX-249
COMMANDBOX-927
COMMANDBOX-928
COMMANDBOX-929
COMMANDBOX-931
COMMANDBOX-935
COMMANDBOX-938
COMMANDBOX-943
COMMANDBOX-945
COMMANDBOX-948
the docs
CommandBox Getting Started Guide
http://commandbox.ortusbooks.com/content/getting_started_guide.html
COMMANDBOX-259
COMMANDBOX-263
COMMANDBOX-260

What's New in 4.5.0

The main features of CommandBox 4.5.0 are:

  • Ability to install OpenJDK automatically for your servers to use (read more)

  • Environment Variables in the shell (read more)

  • Support for Forgebox Enterprise (TBA soon)

  • JRE Bundled CommandBox installs now use OpenJDK instead of Oracle JDK

  • TestBox Code Coverage integration (read more)

I already wrote a fairly comprehensive overview of the new features and big fixes here. Go read it:

https://www.ortussolutions.com/blog/commandbox-450-rc-release-candidate-ready-for-testing

Note, there are two backwards incompatible changes. The first is we turned OFF directory browsing by default on servers. You can easily get the old behavior back with

config set server.defaults.web.directoryBrowsing=true

The second is that unhandled errors in the shell no longer show the stack trace (you probably wouldn't have noticed if I didn't tell you!) Get the old behavior back with:

config set verboseErrors=true

Release Notes

Here's the full list of everything that went into this release.

Bug

  • [COMMANDBOX-784] - editing in the shell prompt is buggy while using Gitbash in VSCode

  • [COMMANDBOX-895] - Passing positional args to task errors with required param

  • [COMMANDBOX-897] - Passing command string as single arg to box fails

  • [COMMANDBOX-899] - Exitting recipe with exit code errors

  • [COMMANDBOX-901] - external module mappings broken in CommandBox 4

  • [COMMANDBOX-903] - Incorrect behavior when parsing unmatched quotes

  • [COMMANDBOX-915] - Cruft left in temp folder

  • [COMMANDBOX-917] - Silence annoying ESAPI warnings

  • [COMMANDBOX-919] - Warnings on java 11 about illegal reflective access

New Feature

  • [COMMANDBOX-516] - Add concept of env vars for commands to use

  • [COMMANDBOX-906] - Add preCommandParamProcess interception point

  • [COMMANDBOX-907] - outdated commands now verify packages in parallel

  • [COMMANDBOX-908] - Automatically download JRE for server if specified by version range

  • [COMMANDBOX-910] - Support multiple ForgeBox endpoints

  • [COMMANDBOX-911] - New Java endpoint that ties into the AdpotOpenJDK builds

  • [COMMANDBOX-914] - Make exit code of native binary from run command available in the exception that is thrown

  • [COMMANDBOX-916] - Pull Code Coverage data on "testbox run"

  • [COMMANDBOX-921] - Allow recipe args to be used as environment variables for that command

Improvement

  • [COMMANDBOX-896] - Add ETA to progress bar when downloading

  • [COMMANDBOX-898] - Improve default handling of JVM heap size

  • [COMMANDBOX-900] - Default directoryBrowsing to false

  • [COMMANDBOX-902] - Allow box to be called with a single string containing a command chain

  • [COMMANDBOX-904] - Prevent folder endpoint from picking up folders in CWD on install

  • [COMMANDBOX-909] - Hide stack trace by default when CLI errors

  • [COMMANDBOX-922] - Allow recipe command to accept arbitrary commands directly

  • [COMMANDBOX-923] - Include mapping-tag in rewrite exclusion list

  • [COMMANDBOX-924] - Update JRE builds to use OpenJDK instead of Oracle JDK

  • [COMMANDBOX-925] - Provide all other args to command completor UDFs

  • [COMMANDBOX-926] - Announce postInstall interceptions even if package was found to be already installed

What's New in 2.1.0

Specifying a max heap size for your embedded server

CommandBox> start heapSize=768

And finally, the ability to install packages from a Git repo is here!

install git://github.com/username/repoName.git

And this nice shortcut for installing from GitHub:

install username/repoName

If you've not used CommandBox yet, check out our getting started guide here:

http://commandbox.ortusbooks.com/content/getting_started_guide.html

You can download CommandBox 2.1.0 here on our product page:

http://www.ortussolutions.com/products/commandbox#download

Release Notes

Bug

  • [COMMANDBOX-170] - Piping content to box repl

  • [COMMANDBOX-220] - Lucee default error template is broken in CLI

  • [COMMANDBOX-221] - OWASP jars corrupt

  • [COMMANDBOX-229] - REPLParser doesn't allow // in strings (like in URLs)

  • [COMMANDBOX-246] - commandbox.properties isn't picked up when box.exe is in a folder with spaces

Improvement

  • [COMMANDBOX-165] - Improve parameter escaping when running commands from native OS

  • [COMMANDBOX-210] - Make ColdBox skeleton hints dynamic by reading folder instead of hard-coded values

  • [COMMANDBOX-244] - Increase the size/resolution of the icon

New Feature

  • [COMMANDBOX-65] - Additional install endpoints

  • [COMMANDBOX-240] - Git endpoint

  • [COMMANDBOX-242] - Update all tray icons to CommandBox latest icons

  • [COMMANDBOX-243] - new server argument: heapSize to allow for sizing the embedded server heap size

  • [COMMANDBOX-256] - Integrate the Loader java bits into the CommandBox source

  • [COMMANDBOX-257] - Migrate APIDocs generation to DocBox

What's New in 3.2.0

Offline Server Starts

One of the biggest pieces of feedback we got from the CommandBox 3.1 release was that it requires an Internet connection to start a server. Since you can specify the version of the server you want to start, including semver ranges like 5.x, this required a trip to ForgeBox to check and see what the best version match was since it might have changed since the last time you started the server.

CommandBox> start [email protected]

Now, if you provide an exact CF engine version number (meaning you give us a major, minor, AND patch version) CommandBox will skip phoning home to ForgeBox and will just continue with that version.

CommandBox> start [email protected]

Remember that the version "5" de-sugars to "5.x.x" so you need to have all three numbers even if they're "0"

Failsafe Server Starts

We even went a step further. Sometimes ForgeBox may be down for maintenance or due to an outage and it was preventing people from being able to start their servers. If ForgeBox can't be reached for some reason while starting the server, we'll try again by comparing the version range you provided with the CF Engines already cached in your local artifacts cache. If we can find a version that satisfies what you asked for, we'll use it to start the server. That means you might not be getting the latest version of the engine from ForgeBox, but at least your server will start with that is has downloaded already.

Unpublish Packages

Unpublishing a package should be something you rarely need to do since once a package is published, someone else may be depending it for their app to run. However, we now have an unpublish command you can run from the CLI to remove a specific version of a package, or the entire package itself from ForgeBox.

CommandBox> unpublish
CommandBox> unpublish 1.2.3

New Server Updates

We've also included the latest versions of Adobe ColdFusion 10, 11, and 2016 on ForgeBox. This is something we can update separately from our CommandBox releases, but they came at the same time so I bundled the announcements together :) Here are the latest Adobe versions available:

  • Adobe CF 10.0.20+299202

  • Adobe CF 11.0.09+299201

  • Adobe CF 2016.0.02+299200

Bug Fixes

We also fixed a few bugs too. For example, targeting a Git tag stopped working in version 3.1 due to a library update, plus CommandBox's proxy settings weren't being used for all HTTP requests.

Release Notes

Here's the full list of everything in version 3.2.0 of CommandBox. Click on the ticket numbers for more details in JIRA.

Bugs

  • [COMMANDBOX-400] - Box install throws exception on git endpoint with commit-ish syntax

  • [COMMANDBOX-406] - Starting server from diff directory by name uses wrong web root

  • [COMMANDBOX-407] - semver isExactVersion returns true for 3 and 3.4

  • [COMMANDBOX-408] - Proxy server not used in ForgeBox calls

New Features

  • [COMMANDBOX-397] - Unpublish command

  • [COMMANDBOX-402] - Show package URL location after publish, some consoles allow you to click and visit

  • [COMMANDBOX-403] - Show number of packages in forgebox types

  • [COMMANDBOX-404] - Add ForgeBox URL to show command as some consoles allow you to visit

  • [COMMANDBOX-405] - Add ForgeBox URL to search command so consoles can click and open

Tasks

  • [COMMANDBOX-409] - Add new patches for Adobe CF 10, 11, and 2016 to forgebox

Improvements

  • [COMMANDBOX-391] - Add Offline Ability for cfengine Server Start

  • [COMMANDBOX-401] - Add box.json data to pre/post publishing interceptors

What's New in 2.0.0

We Love Lucee

The biggest feature is the switch-over from Railo to Lucee as the underlying CLI engine that powers the REPL and commands. The embedded server now also runs Lucee 4.5 as well. If you require a Railo embedded server, you will need to stay on CommandBox 1.1.1 for now.

Endpoint Support

Another major new feature is support for different endpoints when installing packages in addition to ForgeBox. Now packages can be installed from the following locations:

  • Local zip file

  • Local folder

  • HTTP/HTTPS URL that points to a package zip

  • ForgeBox (default)

The ForgeBox endpoint now also has rudimentary support for targeting a specific version. If you request a specific version of a package to be installed, and it is in your artifacts cache, no network calls will be made. This allows completely offline installations! Here are some examples:

install coldbox
install [email protected]
install C:/myZippedPackages/foobar.zip
install C:/myUnzippedPackages/foobar/
install http://site.com/foobar.zip
install https://site.com/foobar.zip

We also have a nice collection of bug fixes. Below are the full release notes for CommandBox 2.0.0.

Release Notes - CommandBox - Version 2.0.0

Bug

  • [COMMANDBOX-211] - CommandBox caches .cfm files between executions

  • [COMMANDBOX-214] - Lucee version leaves tons of old jars on upgrade

  • [COMMANDBOX-218] - Script repl confused on paranthesis or quotes

  • [COMMANDBOX-223] - coldbox create model command doesn't escape "open" parameters

  • [COMMANDBOX-224] - Coldbox create model creates incorrect testcase w/ no methods

  • [COMMANDBOX-225] - Calling `forgebox slugcheck` with empty slugname throws error

  • [COMMANDBOX-232] - osx brew installation broken for commandbox 2.0

  • [COMMANDBOX-237] - Application times out and wirebox references die

  • [COMMANDBOX-238] - Dev installation w/out package directory overwrites box.json

New Feature

  • [COMMANDBOX-159] - Switch CommandBox core to Lucee

  • [COMMANDBOX-215] - Multi Endpoint support

package show dependencies | foreach
watch()
    .onChange( function( paths ) {
        print
            .line( '#paths.added.len()# paths were added!' )
            .line( '#paths.removed.len()# paths were removed!' )
            .line( '#paths.changed.len()# paths were changed!' )            ;
    } )
    .start();
package set reinitWatchPaths= "config/**.cfc,models/**.cfc,ModuleConfig.cfc"
coldbox watch-reinit
install gist:b6cfe92a08c742bab78dd15fc2c1b2bb
https://commandbox.ortusbooks.com/usage/foreach-command#iterating-over-json
https://commandbox.ortusbooks.com/package-management/code-endpoints/gist
COMMANDBOX-876
COMMANDBOX-881
COMMANDBOX-882
COMMANDBOX-887
COMMANDBOX-895
COMMANDBOX-877
COMMANDBOX-878
COMMANDBOX-879
COMMANDBOX-698
COMMANDBOX-732
COMMANDBOX-880
COMMANDBOX-883
COMMANDBOX-884
COMMANDBOX-890
COMMANDBOX-891
COMMANDBOX-892

What's New in 4.3.0

Task Target Dependencies

For a task that has more than one target (method) you can specify dependencies that will run, in the order specified, prior to your final target. Specify task target dependencies as a comma-delimited list in a depends annotation on the target function itself. There is no limit to how many target dependencies you can have, nor how deep they can nest.

Given the above Task Runner, typing

would run the runMeFirst() and run() method in that order.

Docs:

GZip Compression

The web server in CommandBox is capable of enabling GZIp compression to reduce the size of HTTP responses. To enable GZip compress on your CommandBox server, add a web.gzipEnable setting in your server.json file.

Docs:

Add --simple flag to ls/dir command

When you get a directory listing in CommandBox, you can add the --simple flag which will only output the file and folder name without any other information. This feature was added to compliment the feature below.

forEach Command

The foreach command will execute another command against every item in an incoming list. The list can be passed directly or piped into this command. The default delimiter is a new line so this works great piping the output of file listings directly in, which have a file name per line.

This example will find all JSON files in a directory and run the cat command against them.

Docs:

Java 9/10/11 support

This is still a little experimental since it hasn't gone through full testing, but we upgraded to Lucee 5.2.9.31 in the core CLI which has support for the newer versions of Java. We've removed the checks that previously preventing CommandBox from even trying to run on versions of Java later than 8 and at first glance it seems to be working though there's been some flakiness on Java 11. Please help test these later Java versions and remember that if you spin up a server, you'll want to still dial in Java 8 for Adobe CF 2016 and prior and Lucee 5.2.8.50 and prior even if you have the CLI running on Java 9+.

Docs for setting custom Java version in your server:

Release notes

Here's the full release notes for CommandBox 4.3.0.

Bug

  • [] - Command Box failed to initialize using java 9

  • [] - CFFileServlet doesn't work with default rewrites in ACF 2016

  • [] - We need to review exit codes in Tasks

  • [] - WireBox/LogBox upgrade broke system logging

  • [] - Engine name not detected correctly when using HTTP URL for cfengine

  • [] - Fix annoying web-inf folder for Flex logs on Adobe engines

  • [] - Missing line break when following log file

  • [] - Spelling error in info message for accessLogEnable

  • [] - coldbox create app cuts last char from package name

  • [] - Starting Adobe server errors when no CFIDE mapping is defined

  • [] - CommandDSL parsing doesn't handle quoted text in command

New Feature

  • [] - Task method dependencies

  • [] - Add setting for GZip compression

  • [] - Add --simple flag to ls/dir command to only output filename

  • [] - Add "forEach" command to execute command once per incoming line

Improvement

  • [] - TestBox Run command could use a way to add custom url parameters. Also the options parameter does nothing

  • [] - Improve progress bar cleanup and exit codes on Ctrl-C

  • [] - Allow Java jars to be installed from S3

  • [] - JSON Schema for server.json

  • [] - Upgrade CLI to Lucee 5.2.9.31

  • [] - Support sorting JSON objects by key when formatting

  • [] - Task DSL assume CWD of task file

  • [] - coldbox scaffold install testbox by default

  • [] - Allow command DSL params() to be called more than once

  • [] - Make resolvePath() in Base command/task

  • [] - Reload shell doesn't always fire when non-CommandBox modules get updated in core

  • [] - Allow print helper to accept complex objects and serialize them for output.

What's new in 4.8.0

Cached HTTP Downloads

You can now cache downloads using the HTTP(S) endpoints using the following syntaxes:

This will speed up builds.

Change to Previous Directory

Thanks to a pull request from John Berquist, we've borrowed a Bash and Powershell feature of being able to change back to your previous working directory by typing this:

Better Tab Completion

Thanks to more pull requests from John Berquist, you can use file and folder based tab completion when typing native binaries from CommandBox

And tab completion also works better now when typing a quoted string such as a file path that contains a space. This is a huge timesaver!

Access to Intercept data in package scripts

Package scripts that are fired from internal interception points, can access any intercept data via environment variables. This example writes a file into a server home directory when the server starts, using an environment variable to dynamically find the correct path.

Release Notes

Here are the full release notes for CommandBox 4.8.0:

Bug

  • [] - Can't always install modules - git error: Directory already exists

  • [] - regex metachars not escaped properly in first token of run command

  • [] - testbox watch command doesn't obey verbose flag in box.json

  • [] - Sometimes line breaks leak to console when using expansions

  • [] - Pass ad-hoc parameters to package scripts

  • [] - Servers bound to 0.0.0.0 don't open useful browser URL

  • [] - unicode chars not read from readme files when publishing

  • [] - Native OS execution doesn't handle exit on fail for *nix

  • [] - Install path not respected when createPackageDirectory set to false

New Feature

  • [] - Add cached version of HTTP(S) endpoints

  • [] - Output binary objects in REPL

  • [] - Add support for "cd -"

Improvement

  • [] - Announce onServerStop when stopping a --console server

  • [] - Support path completion with "run" or "!" command

  • [] - Expand log output of failed job steps

  • [] - Pass interceptData to package scripts

  • [] - Allow tab completion on quoted parameters

  • [] - Editor on Linux

  • [] - Return actual exit code of server process from server start

  • [] - Java install endpoint allows invalid slugs

  • [] - Pass CommandBox shell env vars to server starts

  • [] - Better detection of CF Engine when using HTTP provider

component {
  
  function run() depends="runMeFirst" {
  }

  function runMeFirst() {
  }

}
task run
server set web.gzipEnable=true
ls --simple
ls *.json --simple | forEach cat
https://commandbox.ortusbooks.com/task-runners/task-target-dependencies
https://commandbox.ortusbooks.com/embedded-server/configuring-your-server/gzip-compression
https://commandbox.ortusbooks.com/usage/foreach-command
https://commandbox.ortusbooks.com/embedded-server/configuring-your-server/custom-java-version
COMMANDBOX-692
COMMANDBOX-845
COMMANDBOX-849
COMMANDBOX-856
COMMANDBOX-857
COMMANDBOX-860
COMMANDBOX-861
COMMANDBOX-865
COMMANDBOX-867
COMMANDBOX-869
COMMANDBOX-871
COMMANDBOX-848
COMMANDBOX-852
COMMANDBOX-858
COMMANDBOX-859
COMMANDBOX-824
COMMANDBOX-846
COMMANDBOX-851
COMMANDBOX-854
COMMANDBOX-863
COMMANDBOX-864
COMMANDBOX-866
COMMANDBOX-868
COMMANDBOX-870
COMMANDBOX-872
COMMANDBOX-873
COMMANDBOX-874
install https+cached://downloads.ortussolutions.com/ortussolutions/coldbox-modules/cbi18n/1.4.0/cbi18n-1.4.0.zip

start cfengine=http+cached://update.lucee.org/rest/update/provider/forgebox/5.3.3.60-RC
cd -
!foo bar "C:/Program Files/baz/myFile.cf_
cd "C:/program Fi_
package set scripts.onServerStart="touch \$ {interceptData.SERVERINFO.serverHomeDirectory}/hi.txt"
COMMANDBOX-991
COMMANDBOX-994
COMMANDBOX-998
COMMANDBOX-999
COMMANDBOX-1000
COMMANDBOX-1003
COMMANDBOX-1030
COMMANDBOX-1040
COMMANDBOX-1041
COMMANDBOX-1002
COMMANDBOX-1031
COMMANDBOX-1039
COMMANDBOX-993
COMMANDBOX-996
COMMANDBOX-997
COMMANDBOX-1001
COMMANDBOX-1004
COMMANDBOX-1033
COMMANDBOX-1042
COMMANDBOX-1045
COMMANDBOX-1046
COMMANDBOX-1047

What's New in 3.6.0

Improve OS binary execution

You've been able to run OS binaries from the CommandBox interactive shell for a while now which is great for adding native CLI calls to your recipes.

CommandBox> !git push

The biggest problem with this though was that no output shows on the screen until the OS command is completely finished and if your OS command blocks for interactivity or just never ends, the CommandBox shell will just "hang" with no output. All that is a thing of the past now. The standard input and output of the OS process is now bound to the standard input and output of your CommandBox shell. That means that you see output as soon as the binary outputs it and if it stops to ask you for input, you can provide it. This opens up a world of possibilities.

  • You can ping an address and watch the output stream as the packets return.

  • You can do a Git commit and interact with the VI window that appears to capture your commit message.

  • You can actually open a bash/DOS shell right inside of CommandBox and then "exit" back to box when you're done.

  • Run native commands that collect input from you to continue like a sudo password.

CommandBox> !ping -c 4 google.com
CommandBox> !git commit
CommandBox> !bash
CommandBox> !sudo command

This has been tested and works pretty well on Mac and Windows. Note, we've seen some issues on Linux where output is streamed, but input is not captured.

New interceptor points

  • preServerForget - Always fires before attempting to forget a server whether or not the forgetting is actually successful

  • postServerForget - Fires after a successful server forget. If the forget fails, this will not fire.

Allow spaces in user home directory

This was supported in CommandBox 3.4.0, but we had a regression in 3.5.0 that caused issues for users who have a space in their path to CommandBox's home dir. This has been fixed along with some related issues with the FusionReactor module. Make sure you have the latest Fusion Reactor module once you upgrade to CommandBox 3.6.0.

CommandBox> install commandbox-fusionreactor

New Lucee version

The core version of Lucee that the CLI runs on has been updated to 4.5.5.006. Please note this means the default version of Lucee that starts up for your server when you don't specify otherwise will change. If you have settings like datasources and such that you want to keep, make sure you lock in your exact version of Lucee or check into our new CFConfig project for exporting/importing your server settings.

Incorrect exit code from "testbox run"

The testbox run command would return an exit code of 0 when your tests had in fact failed. This has been fixed so you can trust a proper exit code from the process when running your tests inside a Jenkins or Travis CI build.

$> box testbox run runner=http://localhost:8080/tests/runner.cfm

Global default for HTTP port in config settings

Previously, you couldn't set a global default HTTP port for all your servers. This was on purpose since it didn't really make sense since one one server can use a port at a time. Now, with the introduction of Chris Schmitz's host updater module, you can more easily run each server on a dedicated host name which is added to your host file for you and bound to a unique port. This allows you to run all your local servers on port 80 which is great for cleaning up your local dev. As such, we've added the ability to set the global HTTP port now in your config setting's server defaults.

CommandBox> config set server.defaults.web.http.port=80

Release Notes

Here's the full release notes for the 3.6.0 release.

Bug

  • [COMMANDBOX-553] - Windows CommandBox upgrades fail silently if servers are left running

  • [COMMANDBOX-554] - Box start error

  • [COMMANDBOX-555] - All semicolons removed in REPL which breaks some code

  • [COMMANDBOX-558] - Can't start server when space is in user home dir

  • [COMMANDBOX-559] - server list --verbose produces an error

  • [COMMANDBOX-567] - package list sometimes shows incorrect version of 1.0.0

  • [COMMANDBOX-572] - Running server info on non-server folder creates empty server details

  • [COMMANDBOX-575] - CommandBox fails to start if a 3rd party module fails to load

  • [COMMANDBOX-582] - NPE on some URLs occasionally

  • [COMMANDBOX-587] - testbox run doesn't always return correct exit code on failure

Improvement

  • [COMMANDBOX-502] - improve execution of OS binaries in "run"

  • [COMMANDBOX-556] - Add xxxServerForget interceptors to the Server lifecycle

  • [COMMANDBOX-570] - Improve port binding detection

  • [COMMANDBOX-571] - Allow port to be defaulted in config settings

  • [COMMANDBOX-576] - Improve CommandBox module installations

  • [COMMANDBOX-578] - Bump Lucee version to 4.5.5.006

What's New in 5.2.1

There is now a new "forgebox logout" command you can use for testing or just to remove your API token from the local CLI.

# Logout one user
forgebox logout username

# logout all users
forgebox logout

You can change CommandBox's default tab completion to be an inline list that follows your cursor. This setting requires you to close and re-open the shell to take affect.

config set tabCompleteInline=true

Read more here:

https://commandbox.ortusbooks.com/config-settings/misc-settings#tabcompleteinline

We've added better debugging information for Server Profiles. If you add the --verbose flag to your server start, you'll be able to see what profile was detected for your server, and what baked-in rules have been turned on as a result.

|------------------------------
   | √ | Setting Server Profile to [development]
   |   |------------------------------------------------------
   |   | Profile set from "environment" env var
   |   | Block CF Admin disabled
   |   | Block Sensitive Paths enabled
   |   | Block Flash Remoting enabled
   |   | Directory Browsing enabled
   |   |------------------------------------------------------

We've added a new Single Server Mode you can enable in the CLI to make using CommandBox in Docker images easier.

Read more here:

https://commandbox.ortusbooks.com/embedded-server/single-server-mode

Release Notes

Here are the release notes for the 5.2.1 release.

Bug

  • [COMMANDBOX-1231] - Installing via lex endpoint uses incorrect file extension

  • [COMMANDBOX-1232] - Location of predicate file is in a folder that the Docker finalization script deletes

  • [COMMANDBOX-1238] - Command alas for run command doesn't expand properly

New Feature

  • [COMMANDBOX-1237] - Add config setting to activate JLine's AUTO_MENU_LIST

  • [COMMANDBOX-1240] - forgebox logout command

Improvement

  • [COMMANDBOX-1227] - verbose server start output for profile and security settings

  • [COMMANDBOX-1228] - Extend ${} scopes to apply to any getSetting() call or "env show" command

  • [COMMANDBOX-1229] - Modules aren't unloaded on reload or shutdown

  • [COMMANDBOX-1233] - Add debug output that shows location of commandbox.properties file on start

  • [COMMANDBOX-1234] - Add single server mode for CommandBox in a Docker container

  • [COMMANDBOX-1236] - Add Testbox runner to sensitive paths in production profile

  • [COMMANDBOX-1241] - Use UTF-8 when reading files with "cat" command

What's New in 5.1.0

Java 14 support

Java 14 is now supported in CommandBox 5.1.0. In order to support Java 14, we had to stop using Pack200 which means the binary sizes have grown a little. The good news is CommandBox will start up a little faster on its first run since there's less to unpack now.

Start pure HTML Server

You can start up a lightweight server that only serves static files now with CommandBox.

New CommandBox Light and CommandBox Thin Binaries

In pursuit of the smallest possible Docker images, we have CommandBox light which is built on Lucee Light. We also have a box "thin" binary you can swap out with the full self-extracting binary when using CommandBox in custom docker images. Check out Pete Freitag's to see both of these in use in a super tiny 78 Meg docker image. More docs here:

Force working directory when starting

If you're using box in an integration where you want it to start up in a specific working directory, there is a new bootstrap CLI arg for that.

Server tray menu item custom commands

You've always been able to specify custom menu items in your server.json or global config settings, but we've kicked it up a notch. Not only can you contribute to existing sub menus now, you can execute arbitrary native commands synchronously or async.

Release Notes

Here's the full list of tickets closed down in the 5.1.0 release.

Bug

  • [] - Runwar deadlocks when using Lucee server warmup flag

  • [] - Server start console output isn't always formatted correctly

  • [] - Boolean env var causes error on server start

  • [] - Output of foreach can't be piped

  • [] - Lucee Extension install doesn't recognize Lucee Light

  • [] - Package unlink command misspelled parameter moduleDirectory as moduleDrectory

  • [] - Package link command misspelled parameter moduleDirectory as moduleDrectory

  • [] - Tab complete doesn't work on Windows paths with backslashes

  • [] - CommandBox Watcher shows error on Ctrl-C

  • [] - Extension management doesn't "recognize" a Lucee server started with --dryRun

  • [] - Downgrading a package with install doesn't work without --force

  • [] - The run command doesn't always seem to kill interactive binaries

  • [] - Relative paths incorrect in drive root on *nix

  • [] - Using a warPath of ./ gets normalized to "" and then ignored in subsequent starts

  • [] - native commands with * can fail due to missing regex escape

  • [] - Incorrect serverInfo for a server that hasn't started

New Feature

  • [] - Allow arbitrary actions for menu items

  • [] - Allow to start a pure HTML server

  • [] - Update ColdBox Templates to new standards

  • [] - Allow default working dir of box to be overridden

  • [] - Create box-thin binaries that don't bundle any libs

  • [] - Create CommandBox Light built that uses Lucee Light jar

  • [] - Add two new methods to commands for working with async futures: getCurrentThread() getThreadName()

  • [] - TestBox run commands now support the outputFormats argument to allow you to output post-test reports in many formats

  • [] - TestBox revamped UI for the CLI reporter

  • [] - Add Java info debug to box binary

Task

  • [] - Add Java version as info log

Improvement

  • [] - Provide way to disable server instance icon in MacOS dock

  • [] - Add --full flag to dir command to output full path

  • [] - Rework the server list command so it is more performant

  • [] - Bump to Lucee 5.3.6.61

  • [] - Tab complete for sort options in dir command

  • [] - Have the ProgressableDownloader send an Accept header

  • [] - Don't overwrite lucee-server.xml file when updating libs

  • [] - Auto-detect *unix distros with non-bash shells

  • [] - Copy lco files so Lucee server can start on CommandBox Light

  • [] - Reset console window title after `run` executes a process

server start cfengine=none
box -cliworkingDir=C:/my/path/here/
{
    "trayOptions" : [
        {
            "label" : "Does the Internet work?",
            "action" : "run",
            "command" : "ping google.com"
        },
        {
            "label" : "Math is math!",
            "action" : "runAsync",
            "command" : "calc.exe"
        },
        {
            "label" : "Update dependencies",
            "action" : "runTerminal",
            "command" : "box update"
        }
    ]
}
https://commandbox.ortusbooks.com/v/5.1.0/embedded-server/start-html-server
Minibox image
https://commandbox.ortusbooks.com/v/5.1.0/setup/light-and-thin-binaries
https://commandbox.ortusbooks.com/v/5.1.0/usage/execution#custom-working-directory
COMMANDBOX-1121
COMMANDBOX-1122
COMMANDBOX-1125
COMMANDBOX-1127
COMMANDBOX-1133
COMMANDBOX-1135
COMMANDBOX-1137
COMMANDBOX-1140
COMMANDBOX-1144
COMMANDBOX-1148
COMMANDBOX-1151
COMMANDBOX-1152
COMMANDBOX-1154
COMMANDBOX-1166
COMMANDBOX-1176
COMMANDBOX-1177
COMMANDBOX-1015
COMMANDBOX-1019
COMMANDBOX-1130
COMMANDBOX-1145
COMMANDBOX-1146
COMMANDBOX-1147
COMMANDBOX-1153
COMMANDBOX-1170
COMMANDBOX-1171
COMMANDBOX-1172
COMMANDBOX-1102
COMMANDBOX-1080
COMMANDBOX-1126
COMMANDBOX-1129
COMMANDBOX-1132
COMMANDBOX-1134
COMMANDBOX-1143
COMMANDBOX-1150
COMMANDBOX-1155
COMMANDBOX-1156
COMMANDBOX-1168

What's in 1.0.0

After almost a year in development, we are so excited to finally announce the release of CommandBox 1.0.0 Final. This has been definitely one of the most challenging and fun projects we have overtaken here at Ortus. We had a vision of how we could accelerate not only development, tools and ultimately the ColdFusion (CFML) landscape by building a tool that could put us up to par with many other technologies. I am glad to say we have now a great foundation to move forward. CommandBox brings CFML to any Operating System and even embedded systems like the Raspberry and Banana Pi. It also gives ColdFusion (CFML) developers a much better workflow to work with their projects and a sense of community we lovingly call ForgeBox.

With anything we do here at Ortus, it is fully documented using our new book formats. So head on over to commandbox.ortusbooks.com to download or read the entire CommandBox documentation. In the next coming weeks we will begin our CommandBox 5-week roadshow that will include weekly blogging tutorials and video presentations, so stay tuned as each week progresses. So without further ado, I present to you project Gideon: CommandBox CLI!

CommandBox

CommandBox is a standalone, native tool for Windows, Mac, and Linux. It provides a Command Line Interface (CLI) for developer productivity, tool interaction, package management, embedded CFML server, application scaffolding, and some sweet ASCII art. It includes a plethora of commands to interact with your Operating System, TestBox, ForgeBox, ContentBox, CacheBox, etc. Built-in help is completely integrated for every command. You can pop open a CommandBox shell in your terminal window and manually type commands, or even automate things externally via the CommandBox binary with your OS's native shell.

  • Download & Install CommandBox

  • Download-Read CommandBox Manual

  • ForgeBox

  • Vimeo Video Channel

Package Management

So one of the biggest things we think the CFML community was missing, was a true package management platform. With this in mind, CommandBox + ForgeBox now includes full package management control for ANY ColdFusion (CFML) application. We have created a spec for a box.json file which will go in the root of CFML packages to describe metadata about the package, how it should be installed, and dependencies that the package requires to run. CommandBox is getting a tight integration with the ForgeBox REST API to search, view, and install packages/modules directly into your app from the command line.

REPL: Read-Evaluate-Print-Loop

The CommandBox CLI also leverages a REPL console for executing a-la-carte CFML commands. You can use it in script or even tag mode with full command history as well. Each REPL instance also has included memory, which means you can declare functions, datasources, etc and leverage them within the same command executions. We even support multi-line statements.

Application Scaffolding

CommandBox has tons of commands for quickly building out applications. Create a new ColdBox app with coldbox create app, add a handler with coldbox create handler. You can even get actions added to it, views created, and BDD integration tests stubbed out at the same time. This can bring new productivity for people who like to live on the command line and especially for those who want to be able to automate stuff they do a lot of.

Extensible

CommandBox has a thin Java layer and a rich CFML command suite built using WireBox dependency injection. This allows for any CFML developer to contribute and write out their own commands. You can even register your commands in ForgeBox and have them available to any CommandBox installation. This means that any application or framework author can contribute their own suite of commands for their community.

Automation

CommandBox also leverages the concept of CommandBox Recipes which allows you to create reusable command files with a box extension. You can execute this recipes and even do argument-binding for further reusability. You can even shared them in ForgeBox as well. It also natively integrates into your operating system you can even use CommandBox for Unix shell scripting or just plain template executions: box myfile.cfm or even use argument-binding box execute file=mayflies.cfm var1=hello name=luis and we will bind those variables into the variables scope for you.

Embedded Server

One of the cool things CommandBox brings to the table is the ability to spin up an ad hoc, lightweight, CFML server in any directory from the command line. Simply change your working directory to the root of your app, type server start and a super fast CFML server spins up on a new port running your code. When you're done type server stop from that directory or use the little icon that's showed up in your system tray.In our final release we even included SSL and full URL rewrite support as well.

Auto Updates

We have spent considerable time in our auto-update capabilities so users can transition to patches and updates with ease. We have even created two channels for updates:

  • Stable : Stable releases

  • Bleeding Edge : Bleeding edge releases

So from you console you can type: box upgrade --latest for bleeding edge releases or box upgrade for stable releases.

Future RoadMap

In the next coming months, ForgeBox 2.0 will be released with many more features to help developers manage their contributions, multiple version control, CommandBox integration, private repositories and much more. We will also be using the URL forgebox.io instead of embedding it in the ColdBox site; time for separation. We also have tons of features planned for CommandBox, here are a few teasers:

  • Adobe CF embedded server

  • Task Runner

  • NodeJS bridges

  • Lucee Support

  • Multiple installation providers

  • ForgeBox Enterprise (For private enterprise installations)

  • ForgeBox Cloud Private Entries

  • RCE (Let's see if you can figure out the acronym)

  • Multiple version and fuzzy version package management

  • WAR packager

  • Package signing

  • Much More

So as you can see, so much work to be done. I leave you with one final note, we highly encourage you to support us in any way you can as ultimately we offer these tools as professional open source and they need your support in order to continue with their development. Enjoy and go code something!

What's New in 5.3.1

Updated bundled Java libraries

  • JLine - 3.19.0

  • jGit - 5.11.0.202103091610-r

  • Launch4j - 3.14

  • JANSI - 2.3.2

Recursive jar scanning libDirs

When you configure libDirs for a server, CommandBox used to only load jar files found in the root. Now it will include sub directories which gives you more flexibility around how to install your jars.

New printTable Command

In the previous release, we introduced a new helper for printing ASCII Art tables in your custom commands and task runners. We've taken this a step further and wrapped the table printer utiilty in a new command so you can use it from the CLI directly. We've also expanded its functionality to accept ANY data in as JSON and it will marshall it into a query for you. This means it can be a query, an array of structs, an array or arrays, and more. You can now get quick and easy visualization of any data right from the CLI or in builds.

New sql command for on-the-fly manipulation of data

As if the previous command isn't cool enough, we've also added a new "sql" command which will also accept any sort of data as JSON, marshall it into a query object and allow you to alias, filter, order, and limit the rows on the fly using CFML's query of queries!

The sql command works very nicely with the new tablePrinter command, and truly makes JSON a first class citizen of the CommandBox CLI.

Small change to print.table() helper

We've made a small adjustment to the print.table() helper that was introduced in CommandBox 5.3.1 as follows. The old method signature is

And the new method signature is:

The parameters to the new printTable command matches the NEW method signature of the print.table() helper as well.

Format XML in REPL

When working with XML in the REPL, formatting is now applied when the XML is printed out to the console, making it easier to read (same as JSON)

Release Notes

Bug

Server stop doesn't message user when it fails

Stop loading cfusion/lib in system class loader

5.3.0 errors with commandbox-dotenv 1.x versions due to WireBox change

When building Lucee war from local jars, seeded web.xml file is ignored

Table printer error with no rows

update '{slug}' fails as it is trying to print the package version and its dependencies.

Relative Web Alias Behavior (regression)

jq doesn't resolve file paths to current working directory

CFEngine adobe - Could not initialize class coldfusion.vfs.VFile when using s3 protocol

Improvement

Improve performance of piping large strings to "cfml" command

Format XML in REPL

Change default CLI JSON representation of query to array of structs

Allow upgrade command to pull stable versions when CLI is a prerelease version

Update bundled java libraries

app.libDirs does not load jars/classes recursively from sub folders

Allow for relative URLs when defining trayoption elements

Add Libraries To Runwar Necessary For URLRewrite Proxy

New Feature

New "printTable" command to add CLI usage of table printer

New "sql" command to filter tabular data with SQL

Add --verbose to 'server stop' to see raw output

Add printTable command that proxies to print.table() helper

# Jar installs to lib/jline-3.0.0.M1/jline-3.0.0.M1.jar
install "jar:https://search.maven.org/remotecontent?filepath=jline/jline/3.0.0.M1/jline-3.0.0.M1.jar"

# Load up the jar when the server starts
server set app.libDirs=lib
# array of structs
printTable [{a:1,b:2},{a:3,b:4},{a:5,b:6}]

╔═══╤═══╗
║ a │ b ║
╠═══╪═══╣
║ 1 │ 2 ║
╟───┼───╢
║ 3 │ 4 ║
╟───┼───╢
║ 5 │ 6 ║
╚═══╧═══╝

# array of arrays
printTable data=[[1,2],[3,4],[5,6]] headerNames=foo,bar

╔═════╤═════╗
║ foo │ bar ║
╠═════╪═════╣
║ 1   │ 2   ║
╟─────┼─────╢
║ 3   │ 4   ║
╟─────┼─────╢
║ 5   │ 6   ║
╚═════╧═════╝

# Query object
#extensionlist | printTable name,version

╔═════════════════════════════════════════╤═══════════════════╗
║ name                                    │ version           ║
╠═════════════════════════════════════════╪═══════════════════╣
║ MySQL                                   │ 8.0.19            ║
╟─────────────────────────────────────────┼───────────────────╢
║ Microsoft SQL Server (Vendor Microsoft) │ 6.5.4             ║
╟─────────────────────────────────────────┼───────────────────╢
║ PostgreSQL                              │ 9.4.1212          ║
╟─────────────────────────────────────────┼───────────────────╢
║ Ajax Extension                          │ 1.0.0.3           ║
╚═════════════════════════════════════════╧═══════════════════╝

# JSON list of all servers
server list --json | printTable name,host,port,status

╔══════════════════════════════╤═════════════════════════════╤═══════╤═════════╗
║ name                         │ host                        │ port  │ status  ║
╠══════════════════════════════╪═════════════════════════════╪═══════╪═════════╣
║ servicetest                  │ 127.0.0.1                   │ 54427 │ stopped ║
╟──────────────────────────────┼─────────────────────────────┼───────┼─────────╢
║ servicetest2                 │ 127.0.0.1                   │ 52919 │ stopped ║
╟──────────────────────────────┼─────────────────────────────┼───────┼─────────╢
║ FRDemos                      │ 127.0.0.1                   │ 50458 │ stopped ║
╚══════════════════════════════╧═════════════════════════════╧═══════╧═════════╝
# filter, sort, limit, and select extensions installed into the CLI (output as table)
#extensionlist  | sql select=id,name where="name like '%sql%'" orderby=name limit=3 | printTable

# order and select JSON data from a file (output as JSON)
cat myfile.json | sql select=col1,col2 orderby=col2

# limit JSON (output as table)
sql data=[{a:1,b:2},{a:3,b:4},{a:5,b:6}] where="a > 1" | printTable
public string function print(
	required any headers,
	array data=[],
	string includeHeaders        
) {
public string function print(
	required any data=[],
	any includedHeaders="",
	any headerNames="",
	boolean debug=false
) {
❯ repl "XMLParse( '<root><brad>wood</brad></root>' )"

<?xml version="1.0" encoding="utf-8"?><root>
  <brad>wood</brad>
</root>
COMMANDBOX-1320
COMMANDBOX-1319
COMMANDBOX-1318
COMMANDBOX-1314
COMMANDBOX-1311
COMMANDBOX-1310
COMMANDBOX-1308
COMMANDBOX-1307
COMMANDBOX-1303
COMMANDBOX-1328
COMMANDBOX-1317
COMMANDBOX-1316
COMMANDBOX-1306
COMMANDBOX-1305
COMMANDBOX-1302
COMMANDBOX-1210
COMMANDBOX-1194
COMMANDBOX-1324
COMMANDBOX-1323
COMMANDBOX-1321
COMMANDBOX-1309

What's New in 3.7.0

What's New

  • Task Runners - Run ad-hoc builds from the CLI written in CFML (Read more)

  • Manage System Packages - update, list, and uninstall system modules (Read more)

  • File Globbing - Use place holders like **.cfc for file operations to affect more than one file at a time. (Read more)

  • Command Aliases - Alias your favorite commands for easy access in the future (Read more)

  • Global Command Parameter Defaults - Set common parameters to have a given value at a global level (Read more)

  • System Settings - Utilize environment variables to make your package and servers more dynamic (Read more)

  • Testbox Run - Improved, minimalist output to the "testbox run" command (Read more)

  • TestBox Watchers - Watch a directory for file changes and run your unit tests (Read more)

  • Customize REST Servlets - Customize or disable the REST servlet paths on Lucee and Adobe servers (Read more)

  • Custom Java Versions - Start your CF servers with any version of Java you want (Read more)

  • Property files - New commands and helper libs for dealing with property files (Read more)

  • Basic Authentication - Enable basic security on your servers with unlimited users (Read more)

  • Custom URL to Open - Customize the browser URL that opens when you start a server (Read more)

  • Disable Tray Icon - Turn off the system tray icon for your servers entirely (Read more)

  • Show Proxy IP - Servers pass through the original user IP through proxies

  • Jar Endpoint - Install 3rd party jars into your projects (Read more)

Release Notes

Bug

  • [COMMANDBOX-176] - Server start tries to open HTTP URL even if it's disabled

  • [COMMANDBOX-474] - testbox run with runner urls that have a query string fail

  • [COMMANDBOX-525] - cf_scripts folder not working on Adobe 2016

  • [COMMANDBOX-600] - Catastrophic runner errors in testbox run don't fail tests

  • [COMMANDBOX-611] - errors if you start second CLI while first one is using the temp dir

  • [COMMANDBOX-616] - TestBox scaffolds are missing super calls for beforeAll/afterAll

  • [COMMANDBOX-621] - Prevent two servers from getting the same name

  • [COMMANDBOX-625] - Basic auth doesn't set cgi.remote_user

  • [COMMANDBOX-651] - unregister method in interceptor service doesn't work

New Feature

  • [COMMANDBOX-15] - Allow file globbing patterns in file/folder operations

  • [COMMANDBOX-50] - Create BaseTask

  • [COMMANDBOX-51] - Add "task" command to run tasks

  • [COMMANDBOX-54] - Create watchers

  • [COMMANDBOX-459] - Create the --system argument to all package commands for system wide packages

  • [COMMANDBOX-513] - Allow REST servlet to be configured

  • [COMMANDBOX-548] - Allow custom JRE version for server starts

  • [COMMANDBOX-560] - Support Basic Auth

  • [COMMANDBOX-564] - Allow placeholders in for env vars and system props

  • [COMMANDBOX-585] - Provide convenient command to do simple token replacements from the CLI

  • [COMMANDBOX-589] - Checksum Command

  • [COMMANDBOX-590] - Property files commands support

  • [COMMANDBOX-599] - Add MinHeapSize setting

  • [COMMANDBOX-608] - Support for viewing/installing private packages

  • [COMMANDBOX-610] - Finalize box.json testbox runner options

  • [COMMANDBOX-613] - Allow Command DSL to set working directory

  • [COMMANDBOX-614] - Implement "testbox watch" command

  • [COMMANDBOX-638] - Simple Jar endpoint

  • [COMMANDBOX-642] - Ability to disable tray icons

  • [COMMANDBOX-644] - Allow ad-hoc aliases to be created for commands

  • [COMMANDBOX-645] - Allow global defaults to be set for command parameters

  • [COMMANDBOX-647] - Automatic collection from parameter names containing a colon

  • [COMMANDBOX-648] - Implement the equiv of Tomcat's remoteIPValve

  • [COMMANDBOX-649] - Support missing Tuckey config settings

  • [COMMANDBOX-655] - Command to remove trailing whitespace from files

  • [COMMANDBOX-656] - Command to add final EOL to files

Task

  • [COMMANDBOX-568] - Better error message for invalid JSON in a server.json file

Improvement

  • [COMMANDBOX-429] - Update debian build signing to be higher than SHA-256

  • [COMMANDBOX-586] - If publishing but not logged into forgebox, prompt for login instead of just erroring

  • [COMMANDBOX-597] - Clean up SSL cert and key file parameters for server start

  • [COMMANDBOX-601] - Improve HTML to ANSI conversion on larger strings

  • [COMMANDBOX-602] - Refactor JSON formatter to separate lib for reuse

  • [COMMANDBOX-606] - Add trace flag for starting server

  • [COMMANDBOX-612] - Improve output of "testbox run" command

  • [COMMANDBOX-617] - Remove deprecated and unused properties from box.json with init

  • [COMMANDBOX-618] - Don't try to output binary data in REPL

  • [COMMANDBOX-622] - Show "last started" datetime for servers

  • [COMMANDBOX-623] - Customize URL that opens when starting server

  • [COMMANDBOX-626] - Allow commandbox-modules to register endpoints

  • [COMMANDBOX-646] - Enhance parser to allow quoted spaces in parameter names

  • [COMMANDBOX-650] - WireBox injection DSL allow to drill down into Config Settings

  • [COMMANDBOX-652] - Command to remove trailing spaces from code files

  • [COMMANDBOX-657] - Allow console flag to be stored in server.json like every other setting

  • [COMMANDBOX-658] - Allow publishing of private packages

What's New in 5.4.0

web.xml Overrides

When you start an Adobe or Lucee CF Engine, the WAR CommandBox uses has a stock web.xml baked into it. Sometimes you may want to add custom servlets, servlet mappings, etc into your server. You can override the stock web.xml in part or in total with a file of your own which you specify in the server.json like so:

{
  "app" : {
    "webXMLOverride" : "path/to/web-override.xml"
  }
}

More info here:

https://commandbox.ortusbooks.com/embedded-server/configuring-your-server/web.xml-overrides

Funky Parameters

In addition to quoting parameter values, parameter names can also be quoted. This is useful when setting keys into settings or JSON files that have spaces, hyphens or special characters. Each of these examples are now supported:

# quoted string
package set foo."bar.baz"=bum

# bracketed string
package set foo[bar.baz]=bum

# quoted, bracketed string
package set foo["bar.baz"]=bum

More info here:

https://commandbox.ortusbooks.com/usage/parameters

Library updates

Lucee Server has been updated to 5.3.8.201 and JBoss Undertow has been updated to 2.2.10.Final. The Lucee update, as usual, applies to the CLI as well as the default server you get when you run server start.

Smarter Jar Endpoint

When you install a Jar via HTTP URL and the version number is baked into the URL, the jar endpoint now makes more assumptions about what the version of the package is that allows it to optimize the update checks and eliminate unnecessary downloads.

More info here:

https://commandbox.ortusbooks.com/package-management/code-endpoints/jar-via-http#semantic-versioning

ask and confirm commands

Here are some fun commands for user interactivity in the shell. You can use these as part of a recipe or a nice "one-liner".

ask

The ask command is similar to the ask() method in Task Runners. It requires an interactive terminal and will ask the user a question and return their answer. It is meant to be changed with other commands.

set color=`ask "favorite Color? "`
echo "you said ${Setting: color not found}"

or with default values

ask question="Who is cool? " defaultResponse="Balbino!"

or with masked input

ask question="What is your password? " mask=*

Or fun stuff like this

ask "Secret phrase: " | assertEqual "mockingbird" || echo "access denied!" && exit 1

confirm

The confirm command will ask the user a yes/no question and return a passing or failing exit code from the command based on the answer.

confirm "do you want to update your packages? " && update

Remember the && operator will only execute the second command if the first command returns an exit code of 0.

More info here:

https://commandbox.ortusbooks.com/helpful-commands/ask-and-confirm

server prune command

You can easily forget all servers which have not been started for a certain period of time with the server prune command. It accepts the number of days that need to have passed since a server was last started in order to prune it.

server prune days=30

# Skip the confirmation check
server prune --force

More info here:

https://commandbox.ortusbooks.com/embedded-server/manage-servers#prune-old-servers

Release Notes

Here are the full release notes for CommandBox 5.4.0

Bug

COMMANDBOX-1364 Cancelling a prompt with active job doesn't clear job logs

COMMANDBOX-1361 Param tab completion is off-by-one when piping

COMMANDBOX-1360 Can't list files in directory with brackets ( [ or ] ) in the name

COMMANDBOX-1356 forgebox timeout is too small when publishing packages

COMMANDBOX-1354 dir command returns no results in drive root

COMMANDBOX-1353 Summary over 200 chars in box.json causes error when publishing

COMMANDBOX-1352 Addition of Apache logging classes breaks 3rd party libs using it

COMMANDBOX-1350 Installing a system module as one-off command doesn't clear wirebox metadata cache

COMMANDBOX-1348 Commenting server rules doesn't work correctly in text files

COMMANDBOX-1346 CommandDSL doesn't handle struct args

COMMANDBOX-1344 create a server prune command

COMMANDBOX-1339 Server start can hang when CF engine blows up

COMMANDBOX-1338 Tab complete doesn't work after a pipe

COMMANDBOX-1337 Working dir of server custom menu items doesn't default properly

COMMANDBOX-1336 Error when setting failing exist code in Task Runner

COMMANDBOX-1334 updating commandbox to 5.3.1 via Homebrew breaks with a java error

COMMANDBOX-1333 Rewrite rule with query string doubles up question mark

COMMANDBOX-1332 printTable column validation breaks with spaces in list

COMMANDBOX-1330 Directory listing not showing folders properly when names are numeric

COMMANDBOX-1230 Certain Java installs fail version check

Improvement

COMMANDBOX-1366 ask and confirm command to capture user input from shell

COMMANDBOX-1365 Improve version handling in JAR endpoint

COMMANDBOX-1351 Update to Lucee 5.3.8

COMMANDBOX-1347 Support dots in struct keys with set/show/clear commands

COMMANDBOX-1342 printTable custom header names for non-array input

COMMANDBOX-1331 Add printTable check for data with no columns

COMMANDBOX-1329 Sort column names in printTable --debug

New Feature

COMMANDBOX-1362 Set env vars directly in server.json for local one-off overrides

COMMANDBOX-1011 Support web.xml Overrides

Task

COMMANDBOX-1363 Update to Undertow 2.2.10.Final

What's New in 3.1.1

Multi-Server

Now CommandBox will not only start up Lucee 4 servers with a single command, but you can start up Adobe ColdFusion, Railo, and even Luce 5 servers all at the same time. Now it's easier than ever to test your code across multiple platforms. CommandBox's embedded server makes for a fast and easy development machine too regardless of what CF engine you need.

# Start the latest stable Railo engine
CommandBox> start cfengine=railo

# Start a specific engine and version
CommandBox> start [email protected]

# Start any Java WAR
CommandBox> start WARPath=/var/www/myApp.war

ForgeBox 2.0 API

We'v released a brand new ForgeBox.io site with a new UI, fresh features, and a shiny new API. CommandBox 3.1.1 is now powered by the new ForgeBox site and API which includes features like having more than one version for a package.

Semantic Versioning support

When you install packages from ForgeBox, you can use fancy semver ranges to specify the versions of a package you're willing to install. CommandBox will automatically grab the latest version that satisfies your version range. This also applies to the "update" command which makes keeping your projects' dependencies up-to-date even easier.

# A specific version
CommandBox> install [email protected]

# Any version with a major number of 4 (4.1, 4.2, 4.9, etc)
CommandBox> install [email protected]

# Any version greater than 1.5.0
CommandBox> install foo@>1.5.0

# Any version greater than 5.2 but less than or equal to 6.3.4
CommandBox> install "foo@>5.2 <=6.3.4"

Create user from CLI

Another feature of the new ForgeBox site is the ability to create a new ForgeBox user right from the CLI. After creation, you'll be logged in with your ForgeBox API Key which let's you update your packages.

CommandBox> forgebox register

Publish packages from the CLI

You no longer need to visit the ForgeBox web site to publish new or updated packages to ForgeBox. This is all available from the CLI once you've logged in. This means you can even automate the process of publishing to cut down on the number of manual steps it takes you to update your projects and share those changes with the community.

CommandBox> forgebox publish

Interceptor-based CLI scripts

You can now run commands of your choosing automatically when certain events in the CLI happen (like publishing a package, or starting a server). You can also create ad-hoc collections of commands to run whenever you want to help automate things like building your projects or publishing to ForgeBox.

{
  "name" : "My Package",
  "slug" : "my-package",
  "version" : "1.0.0",
  "scripts" : {
   "postVersion" : "package set location='gitUser/gitRepo#`package version`'"
   "postPublish" : "!git push"
  }
}

Have Fun

We hope you enjoy playing with the new features. As always, jump on our mailing list, or the CFML slack team with any questions or feedback. And remember, we provide tools like CommandBox CLI free of charge to the community as professionally-supported open source. If you have specific needs in the form of features or training for your team, Ortus is here to help you. Contact us with any questions.

Release Notes

Bug

  • [COMMANDBOX-347] - CFML Function commands do not work on recipes

  • [COMMANDBOX-348] - box update pulling down dev dependencies

  • [COMMANDBOX-350] - Exception in packageservice determining testbox slug runner

  • [COMMANDBOX-351] - Git clone doesn't obey commit hash

  • [COMMANDBOX-357] - tail command doesn't handle CR and LF correclty

  • [COMMANDBOX-360] - Linux: CommandBox 3.1.0-1: Fails to start

  • [COMMANDBOX-361] - Linux distros: /usr/bin/box created with wrong permissions

  • [COMMANDBOX-367] - Progress bar errors if console is too small

  • [COMMANDBOX-368] - Slug auto-complete doesn't work with ForgeBox 2.0

  • [COMMANDBOX-369] - "forgebox search" doesn't work with ForgeBox 2.0

  • [COMMANDBOX-384] - bump command creates invalid version if it starts blank.

  • [COMMANDBOX-392] - CF servers create WEB-INFcfform directory in server root

New Feature

  • [COMMANDBOX-77] - Start server on any engine

  • [COMMANDBOX-216] - ForgeBox 2 API Integration

  • [COMMANDBOX-335] - forgebox register command

  • [COMMANDBOX-336] - forgebox login command

  • [COMMANDBOX-337] - forgebox publish command

  • [COMMANDBOX-353] - Creation of API Docs for internal CommandBox Core

  • [COMMANDBOX-354] - Update S3 Sync for CommandBox to publish core API Docs

  • [COMMANDBOX-355] - Update the coldbox create command to make the skeleton be a 'name,git+url,http' endpoint

  • [COMMANDBOX-358] - Add command to output system log file

  • [COMMANDBOX-364] - Allow forgebox downloadURL to be any endpoint ID

  • [COMMANDBOX-371] - Allow a package to have listener scripts run by convention

  • [COMMANDBOX-372] - Add pre/postVersion, pre/postPublish interception points

  • [COMMANDBOX-373] - Allow interactive shell (scripts/recipes) to have more than one command per line

  • [COMMANDBOX-374] - bump command tags and commits Git repo if present

  • [COMMANDBOX-376] - Global default for server settings

  • [COMMANDBOX-379] - New Icons for Multi-Engine taskbars

  • [COMMANDBOX-382] - Ability to run ad-hoc scripts

  • [COMMANDBOX-385] - Track installs in ForgeBox 2.0 API

  • [COMMANDBOX-393] - Add onServerInstall interception point for addition engine config

  • [COMMANDBOX-394] - Allow server set/show/clear to target a custom JSON file

Task

  • [COMMANDBOX-352] - Missing 'models' namespace on model test creation

  • [COMMANDBOX-383] - Update Adobe CFEngine wars to have latest updates

Improvement

  • [COMMANDBOX-293] - Return with exit code 1 when things fail

  • [COMMANDBOX-338] - Add ability to use environment variables to supply java args for BOX itself

  • [COMMANDBOX-341] - install my-module installs unneeded devDependencies

  • [COMMANDBOX-345] - Add ability to specify a server.json by path

  • [COMMANDBOX-346] - Modify build to include sdk format of Unix binary

  • [COMMANDBOX-349] - Improve error message when using "box" from interactive shell

  • [COMMANDBOX-359] - Convert all existing ForgeBox calls to new API format.

  • [COMMANDBOX-362] - Improve messaging and logging when errors connecting to Forgebox

  • [COMMANDBOX-366] - Enhance semver logic for satisfying versions

  • [COMMANDBOX-370] - Allow param completion UDF to see typed text

  • [COMMANDBOX-375] - Capture full java exception stack from Jgit errors

  • [COMMANDBOX-377] - Convert CF Engine downloads to S3/ForgeBox

  • [COMMANDBOX-378] - Fix right click options on server tray icon to be non-Lucee

  • [COMMANDBOX-380] - Allow masking of user input

  • [COMMANDBOX-381] - Auto-correct rewritesEnabled to be rewritesEnable in the start command

  • [COMMANDBOX-387] - Update module scaffolding to create in modules_app folder.

  • [COMMANDBOX-388] - Make help for commands more intuitive

  • [COMMANDBOX-389] - Don't create init methods for models if included in the method list

[COMMANDBOX-390] - Switch create controller command to create handler command

What's New in 3.9.0

UNC Network path support

This has been pretty big for Windows users who access files on their servers over a UNC network path like \\server-name\foo\bar. You can now cd into paths starting with \\, perform file operations like cat against those paths, etc. Note backslashes need escaped in the CommandBox shell.

CommandBox> cd \\\\server-name/share
CommandBox> cd \\\\192.168.123.105/share

This was pretty straightforward since Java already supports this, but I had to change a lot of core path handling to make sure the correct slashes were preserved. This needs a fair amount of testing to make sure we nailed it down for good. If your network share requires permissions, you'll need to have saved those in Windows Explorer already or execute a "net use" OS command from the shell.

Task Runner Improvements

When running a task from the CLI, the user will be automatically prompted if they don't supply all the required args. This is just like commands work now.

CommandBox> task run myTask
Please enter required field "Foo": _

We also fixed several bugs with passing positional parameters and flag to task runners.

# positional
CommandBox> task run taskFileName targetName value1 value2 true
# named
CommandBox> task run taskFile=taskFileName target=targetName :param1=value1 :param2=value2 :param3=true
# Use a Flag
CommandBox> task run taskFileName targetName value1 value2 --:param3
CommandBox> task run taskFile=taskFileName target=targetName :param1=value1 :param2=value2 --:param3

"package link" and "package unlink" for module development

This has been a long time coming, but if you want to work on a CommandBox module now, you don't have to keep copying files over to your CommandBox installation just to test. Instead, just run this from the root of your module's repo:

CommandBox> package link

This will symlink (works on Windows and *nix) your module into the core CLI's modules folder and reload the shell so you can immediately start testing. When you're done, just run package unlink. If you'd like to use this same feature, but to link a ColdBox module's repo over to a test application so you can test it without making a copy, you can pass in the path to the remote modules folder you'd like to link to.

CommandBox> package link /path/to/test/app/modules

This is a little easier than using your OS's native symlink commands and can be used in recipes that will work across operating systems!

Everything Else (mostly)

The rest of the changes don't really need a dedicated section but they're worth mentioning, so I've put them in this tidy list :) If you'd like the ticket numbers, you can get them out of this full list of tickets in JIRA: https://ortussolutions.atlassian.net/secure/ReleaseNote.jspa?projectId=11000&version=20400

  • box install returns failing exit code if a package install fails. This helps builds fail correctly if things go wrong

  • When prompted to type in something like a missing parameter, your answer is no longer added to the command history

  • The --debug flag works correctly when starting a server from your OS shell like $> box server start --debug

  • box.json dependencies are stored with forward slashes so Mac and Windows devs stop fighting over which file to commit

  • config set no longer prints out the value to avoid leaking secrets in build script output.

  • Updating a package now uninstalls the previous version first to ensure a fresh start since the new version may have removed files.

  • If you're setting CommandBox behind an AJP proxy, we exposed the flag and ports for that as first class citizens of server.json.

  • Visual markers for private packages in the forgebox search command.

  • The package init command creates a valid slug for private packages in the @user/slug format.

  • Command parameters defaults work on all the aliases for a command now.

  • New --local flag to server list to show all servers that have been started in the current working directory

  • If for some reason you want to supply some ad-hoc JVM args to the actual CLI process, you can create a new environment var called BOX_JAVA_PROPS="foo=bar;brad=wood"

  • You can now touch files in a non-existent directory and it will create the directory instead of erroring.

  • Viewing a ForgeBox package via package show with a markdown based description, now has basic formatting in the CLI

  • The default URL rewrite file doesn't try to rewrite requests to /favicon.ico even when it doesn't exist.

  • Our CF11 servers no longer have secure profile enabled. That was causing issues due to some of the settings like returning 200 on error. If you were making use of that default, please use CFConfig to set what you need.

  • At John Farrar's request, several URLs in output messages have had space put before and after them so capable shells will auto-link them correctly.

  • Improved the Java networking error messages on server start if the host name wasn't correct in your host file and you were letting CommandBox pick a random port for you.

  • Prevented unnecessary saves to box.json when installing to keep file updated dates from being touched.

  • Added friendly check for Java 9 since it's not supported yet and the error that displayed made zero sense.

  • Commands like forgebox show and forgebox list now can provide their data in JSON format. ex: forgebox show coldbox --json

Bug

  • [COMMANDBOX-579] - --debug flag is eaten when running CommandBox from native OS

  • [COMMANDBOX-640] - Ensure clean install/update of packages

  • [COMMANDBOX-681] - Touching file in nonexistent directory errors instead of creating directory

  • [COMMANDBOX-682] - CommandDSL that errors out doesn't reset CWD

  • [COMMANDBOX-684] - positional task args don't work

  • [COMMANDBOX-686] - cp command doesn't work for folders

  • [COMMANDBOX-689] - CommandBox Modules customInterceptionPoints can't accept an array

  • [COMMANDBOX-690] - CommandBox has no `processState` method on the InterceptorService

  • [COMMANDBOX-691] - Flags aren't passed correctly to task runners

  • [COMMANDBOX-701] - CFML functions don't handle incoming JSON with pound signs

New Feature

  • [COMMANDBOX-653] - Expose Runwar AJP listener settings

  • [COMMANDBOX-663] - Update server list and server info to be able to show all the servers on a particular directory

  • [COMMANDBOX-668] - New package link and package unlink commands

  • [COMMANDBOX-680] - Add ad-hoc JVM props via an environment variable

Improvement

  • [COMMANDBOX-178] - Don't store text entered to "ask()" command in history

  • [COMMANDBOX-565] - Handle minor version updating a bit better

  • [COMMANDBOX-607] - Always store dependency install paths with forward slashes

  • [COMMANDBOX-609] - Have a setting to not show secrets when printing out the config

  • [COMMANDBOX-624] - Support UNC file paths on Windows

  • [COMMANDBOX-639] - JSON format for forgebox endpoints

  • [COMMANDBOX-659] - Ask user for required params to task runners

  • [COMMANDBOX-660] - Visually show if a package is private when listing or showing

  • [COMMANDBOX-661] - make package init create correct slug for private package

  • [COMMANDBOX-662] - Make default command parms work on aliases

  • [COMMANDBOX-670] - Box install failures to produce non-zero exit codes so build fails instead of continuing installation.

  • [COMMANDBOX-683] - Provide ANSI formatting for markdown package descriptions

  • [COMMANDBOX-685] - box.json template isn't proper JSON

  • [COMMANDBOX-687] - Remove background color from CommandBox ASCII art

  • [COMMANDBOX-688] - Default rewrite rules to ignore favicon.ico

  • [COMMANDBOX-694] - Disable Secure Profile on CFEngine WARs

  • [COMMANDBOX-696] - Leave space around URLs so some consoles will be clickable

  • [COMMANDBOX-697] - Improve performance of package install ignores

  • [COMMANDBOX-700] - Improve error message in ServerService.getRandomPort()

  • [COMMANDBOX-707] - Prevent unnecessary writes to box.json file when installing dependencies

  • [COMMANDBOX-708] - Improve formatting when asking for required param that has no hint

  • [COMMANDBOX-712] - Add Java 9 check to CommandBox until its supported

What's New in 5.0.0

Upgrade Compatibility

Even though this is a new major version, it should be very backwards compatible. CommandBox proper has no known backwards compatibility issues we're aware of, but note we've bumped libraries like Lucee Server, Undertow, and Java support, so you may notice differences due to these 3rd party lib updates. For example, one breaking change in Lucee 5.3 (which now powers your default server) is how page output buffer is handled.

You should be able to simply replace your box.exe binary and run it to get the same in-place upgrade you're used to. If you run into issue, you can try removing the "engine" folder in your ~/.CommandBox folder and try again. If you need to downgrade for any reason, replace the box binary with the old version, remove the "engine", "cfml", and "lib" folders in your CommandBox home and they will get re-created on the next run.

You may also notice the box binary is larger now. From 44 Megs up to 77 Megs. This is a regrettable byproduct of us turning off the Pack200 process we used to run against the Lucee jar. Lucee seems to have some bugs that causes it to re-download a bunch of OSGI bundles when we compress them and we can't figure it out, or get support on the matter, so for now we're just not compressing as much stuff. This was a huge blocker for anyone needing to run CommandBox on a PC with no external internet access as Lucee provides no mechanism to turn off it's auto-download behavior.

And finally, if you have installed any custom OSGI bundles into your CLI, they will be wiped by the upgrade process now. We didn't want to have to to do this, but Lucee has bugs that cause errors when doing in-place upgrades with the old OSGI bundles left in place and we couldn't get it fixed, so this was the only way to ensure in-place upgrades would "just work" without errors. We are leaving the Lucee engine folder, so any settings you may have put into your CLI should remain in place.

What's New?

There's a lot of new stuff in CommandBox 5.0.0. Here's an overview. One of the biggest new "features" is you can finally use CommandBox on Java 11+. This was not possible in CommandBox 4.x due to the version of Lucee not fully supporting newer versions of Java. Now that Lucee has been bumped to 5.3 (see below) you are free to leave java 8 behind for the CLI. Note if you're using CommandBox to start up older versions of Adobe CF or Lucee/Railo, you may still need to use java 8 specifically for your servers.

New Libraries

Let's start with the library updates. For the most part, all the jars we bundle are a "black box" but in reality, every update is usually for new features, fixes, or security patches. Here's an overview of the new libs:

  • WireBox 5.6.2

  • JLine 3.13.0

  • Runwar 4.0.3 (major bump from 3.x)

  • JBoss Undertow 2.0.27.Final (major bump from 1.x)

  • JGit 5.5.1.201910021850-r

  • Lucee 5.3.4.77("major" bump from 5.2)

  • AdoptOpenJDK jdk-11.0.6+10 (In the JRE-included download) (major bump from 8.x)

New Features/Enhancements

You can now use user/pass or personal access token authentication when cloning Git repos over HTTPS. This has been tested with Github and Gitlab and is an alternative to SSH keys. Please check the docs, as Github and Gitlab both expect slightly different inputs.

install git+https://username:[email protected]/user/repo.git
or
install git+https://[email protected]/user/repo.git

There is a new Lex installation endpoint to help you acquire Lucee Extensions your app needs via the "install" command or a dependency in your box.json file. If the current directory has a Lucee server in it, CommandBox will install the extension file directly into your server's "deploy" folder (server context)

install lex:https://downloads.ortussolutions.com/ortussolutions/lucee-extensions/ortus-redis-cache/1.4.0/ortus-redis-cache-1.4.0.lex

The auto-install feature into your server will work on any Lex package, even one coming from ForgeBox:

// ForgeBox slug for Ortus Redis Extension
install 5C558CC6-1E67-4776-96A60F9726D580F1

Tuning your server is easier now. You can configure your Undertow worker-threads setting with first-class server.json property

server set web.maxRequests=200

Which gives you this in your server.json

{
  "web" : {
    "maxRequests" : 200
  }
}

We've also unlocked a method for you to set ANY valid Undertow option or XNIO option. So if Undertow supports it, you can configure it!

server set runwar.undertowOptions.ALLOW_UNESCAPED_CHARACTERS_IN_URL=true

server set runwar.XNIOOptions.WORKER_NAME=myWorker

We've added a new experimental feature that lets you create a batch file, powershell script, or bash shell script that directly starts a server with the exact settings that you get from "server start". This is for you to create super-optimzed startups in Docker or Service that bypass the CLI steps and "lock in" the settings. No server.json or CFConfig, or dotenv code will be processed, but you will have a fast streamlined start that is the same every time. Couple this with our new "dryRun" flag on server start that will unpack the CF engine, but not actually start the server, and you can create your customs start script like so:

server start --console --dryRun startScript=bash startScriptFile=startmebaby.sh

// Later directly from bash...

./startmebaby.sh

The Globber helper can now take more than one globbing pattern. This also means every built-in command in CommandBox that takes a globbing pattern, can now take a comma delimited list of patterns. We've also added an exclude list of globbing patterns to the dir command as well.

dir **.cfc,*.cfm
dir paths=modules excludePath=**.md --recurse
dir paths=samples sort="directory asc, name desc"

We've got a couple new handy commands to help you from the command line, "unique" (modeled after the Bash "uniq" command)

cat names.txt | unique
cat names.txt | unique --count

And "sort" (modeled after the Bash "sort" command)

cat names.txt | sort
cat names.txt | sort type=text
cat names.txt | sort type=numeric
cat names.txt | sort direction=desc

The "grep" command has received a "count" parameter if you just want the count of lines that match the regex (or no regex will count all lines)

dir **.cfc | grep --count

dir | grep .*\.md --count

The tray icon for your servers now has a new option under the "Open" menu that will open up the file system folder where the server home lives. This is nice for finding your CF Engine's log files.

Release Notes

There are a lot of bug fixes and even more enhancements I didn't cover above. You can read the full release notes here:

Sub-task

  • [COMMANDBOX-1069] - Remove extra stashes on url paths when servlet init params starts with WEB-INF

Bug

  • [COMMANDBOX-643] - Tray Icon not displaying on Debian8

  • [COMMANDBOX-711] - X Window Errors

  • [COMMANDBOX-812] - "Coldbox create resource" uses wrong paths on Windows

  • [COMMANDBOX-941] - urlrewrite.xml has file size of 0 on docker restart but not regular start

  • [COMMANDBOX-946] - CommandBox instances crashing because of TrayIcon rendering

  • [COMMANDBOX-975] - CommandBox always reads STDIN even when in non-interactive mode

  • [COMMANDBOX-980] - Using zsh exits out of CommandBox when running a binary command

  • [COMMANDBOX-992] - Shebang scripts no longer work without .cfm extension

  • [COMMANDBOX-1005] - If custom rewrite file is already in correct destination, runwar overwrites it as 0 bytes

  • [COMMANDBOX-1008] - worker-threads setting no longer has any affect

  • [COMMANDBOX-1009] - Tray icon not showing in Ubuntu 18.04

  • [COMMANDBOX-1013] - Undertow error output when starting server

  • [COMMANDBOX-1014] - [RUNWAR] Tray menu placeholders such as ${Setting: runwar.port not found} are not replaced in sub menus

  • [COMMANDBOX-1022] - regex string index out of bounds exception

  • [COMMANDBOX-1035] - URL Rewrites fire incorrect on URL containing a space

  • [COMMANDBOX-1036] - Browser doesn't open when server start

  • [COMMANDBOX-1037] - Host updater does not work

  • [COMMANDBOX-1038] - Server doesn't stop on Windows

  • [COMMANDBOX-1043] - ConcurrentModificationException with undertow?

  • [COMMANDBOX-1048] - Restrict /dumprunwarrequest to be used only on Unit Testing

  • [COMMANDBOX-1050] - Remove trailing slash from Adobe updates path

  • [COMMANDBOX-1054] - Default command parameters don't work on commands in namespaces

  • [COMMANDBOX-1061] - Command DSL has unexpected behavior with equals sign in positional tokens

  • [COMMANDBOX-1062] - Tab complete for negated flags isn't complete

  • [COMMANDBOX-1063] - box fails to open in vSphere Web Client console due to outdated JLine jar

  • [COMMANDBOX-1068] - Server start doesn't correctly expand relative Java Home directory

  • [COMMANDBOX-1070] - slashes into the servlet init param paths

  • [COMMANDBOX-1071] - Tray icon doesn't disappear on Windows when server stops from CLI

  • [COMMANDBOX-1076] - Install dependency from box.json with env var placeholder gets overwritten with actual value

  • [COMMANDBOX-1077] - coldbox create resource command ignores specsDirectory argument

  • [COMMANDBOX-1079] - foreach cannot be interrupted with Ctrl-C

  • [COMMANDBOX-1081] - validate non-numeric exit codes from the "exit" command

  • [COMMANDBOX-1089] - Task Runner's loadModule() fails on path with period

  • [COMMANDBOX-1090] - Tasks don't treat return 1 and setExitCode( 1 ) the same

  • [COMMANDBOX-1091] - When a task sets a failing exit code, no output is sent to console

  • [COMMANDBOX-1092] - Commands that set a failing exit code don't raise proper exception

  • [COMMANDBOX-1098] - foreach, grep, and sed only break on chr(10)

New Feature

  • [COMMANDBOX-148] - Ability to install/uninstall box server services

  • [COMMANDBOX-715] - Server command to explode server war but not start it

  • [COMMANDBOX-1007] - Set any valid XNIO option

  • [COMMANDBOX-1018] - Add generic feature to set any valid Undertow option

  • [COMMANDBOX-1028] - Allow no rest mappings to be supplied

  • [COMMANDBOX-1032] - Tab completion for task targets

  • [COMMANDBOX-1052] - New TestBox commands: generate visualizer and generate browser

  • [COMMANDBOX-1053] - Update ColdBox module templates for 5.0 standards

  • [COMMANDBOX-1067] - Expose Undertow worker-threads setting with first-class server.json property

  • [COMMANDBOX-1075] - Support HTTPS username/password auth

  • [COMMANDBOX-1083] - Option for server start to write file with full start args for direct Runwar call

  • [COMMANDBOX-1088] - Add lex endpoint for installing Lucee extensions

  • [COMMANDBOX-1096] - Add unique command to filter out duplicates rows of input

  • [COMMANDBOX-1097] - Add sort command to sort rows of input

Task

  • [COMMANDBOX-964] - Make sure the build works

  • [COMMANDBOX-965] - Document Setup in the Repo

  • [COMMANDBOX-995] - Vet all changes on Runwar since April 25, 2018.

Improvement

  • [COMMANDBOX-885] - Enhance Globber to take more than one pattern

  • [COMMANDBOX-886] - Enhance Globber to have exclude patterns

  • [COMMANDBOX-963] - Update CLI to Lucee 5.3 and test Java 11

  • [COMMANDBOX-1029] - Change CommandBox build to pull Ortus build of Runwar

  • [COMMANDBOX-1049] - Output Runwar version and jar path in "info" command output

  • [COMMANDBOX-1055] - Need Config for Max Thread Request at runwar

  • [COMMANDBOX-1057] - Enhance dir command with new Globber features

  • [COMMANDBOX-1058] - Optimize installation of packages with createPackageDirectory set to false

  • [COMMANDBOX-1059] - Improve performance of print buffer by using String Builder internally

  • [COMMANDBOX-1060] - Add --count flag to grep command

  • [COMMANDBOX-1065] - Update CommandBox to Runwar 4.0.0

  • [COMMANDBOX-1066] - Upgrade to JGit 5.5

  • [COMMANDBOX-1074] - Tie into FusionReactor to report transactions for tasks, commands, etc.

  • [COMMANDBOX-1086] - Default location to forgeboxStorage for package init command

  • [COMMANDBOX-1087] - Improve default package naming of jar endpoint

  • [COMMANDBOX-1093] - Add option to tray menu to open server home directory

  • [COMMANDBOX-1095] - Update to latest WireBox

  • [COMMANDBOX-1099] - Stop outputting extra line break for commands with no output

What's New in 3.3.0

Server Enhancements

The embedded CommandBox server have seen a number of nice enhancements to make it easier for you to use CommandBox for super easy local development.

Fusion Reactor Module

The more people begin to use CommandBox for local development, the more interested they became in being able to run on their dev servers to help trouble shoot their code. That's why we created a module. It's not part of the core, but can be installed in a single command and will attach FusionReactor's server monitor to every server you start. You'll need to have a to use it.

Web Aliases

CommandBox allows you to create web aliases for the web server that are similar to virtual directories. The alias path is relative to the web root, but can point to any folder on the hard drive. Aliases can be used for static or CFM files. To configure aliases for your server, create an object under web called alises. The keys are the web-accessible virtual paths and the corresponding values are the relative or absolute path to the folder the alias points to.

Here's what your server.json might look like.

Here's how to create aliases from the server set command:

Custom Error Pages

You can customize the error page that CommandBox servers return. You can have a setting for each status code including a default error page to be used if no other setting applies. Create an errorPages object inside the web object in your server.json where each key is the status code integer or the word default and the value is a relative (to the web root) path to be loaded for that status code. This is what you server.json might look like:

You can set error pages via the server set command like this:

Custom tray menu items

You can customize these tray menus and add your own option for your convenience. To add a menu contribution to an individual server, add the following to your server.json:

Tray menu makeover

We've updated to a new library that creates the tray icon for your running servers and the menu that appears when you right click. In addition to better support for some Linux distros, we've added some nice new icons to the menus.

Pre/Post package scripts

Before any package script is run, CommandBox will look for another package script with the same name, but prefixed with pre. After any package script is run, CommandBox will look for another package script with the same name, but prefixed with Post. So if you have a package that contains 3 package scripts: foo, preFoo, and postFoo, they will run in this order.

  1. preFoo

  2. foo

  3. postFoo

This works for built-in package script names as well as as doc package scripts. It also works on any level. In the example above, if you created a 4th package script called prePreFoo, it would run prior to preFoo.

Better ForgeBox Login management

If you use more than one ForgeBox login, perhaps a personal one and a company one, it can be a pain to keep logging in. It's also hard to remember the last user you logged in with. We've introduced two new commands to help with this. Run this to tell you who you are logged in as:

Run this to switch between users that you've previously logged in with:

onRelease interceptor/package script

We've added a new "onRelease" interceptor and package script to help with the workflow of publishing packages. Here's a run down of the three key points when bumping a package version.

  • preVersion - Announced before the new version is set using the bump command

  • postVersion - Announced after the new version using the bump command but before the Git repo is tagged.

  • onRelease - Announced after a new version is set using the bump command and after the Git repo is tagged.

Here is a typical package script work flow for working with a package that's hosted on GitHub and published to ForgeBox:

Then when you want to publish a new version of your package, commit your changes to Git and run the following commands:

Those two commands, in combination with your package scripts, would accomplish the following:

  1. Run the package's test suite (a failure will abort the process)

  2. Increase the minor version of the page

  3. Tag the Git repo

  4. Change the package's location property in box.json to point to the new tag

  5. Commit the tag and new box.json

  6. Publish the package to ForgeBox

  7. Push the new box.json and Git tag

onInstall interceptor/package script

Announced while a package is being installed, after the package endpoint and installation directory has been resolved but before the actual installation occurs. This allows you to override things like the installation directory based on package type. Any values updated in the interceptData struct will override what the install command uses.

CLI Engine Update

The Lucee version that the CLI runs on has been updated to be 4.5.3.020 which is also now the default engine to be used when you use the "server start" command and don't specify a cfengine. If you still want to start a web server on Lucee 4.5.2.018, then simply to this:

Release Notes

There are tons of little bug fixes in this version that you can view in our release notes.

Bug

  • [] - error when updating forgebox when slugname changes

  • [] - Empty command CFCs with no functions throw an error starting box

  • [] - Error "key [FUNCTIONS] doesn't exist" thrown when trying to start command box

  • [] - server name completion errors on server open command

  • [] - Document the resolvePath() differing behaviour on OSX vs Windows

  • [] - artifacts clean fails on OSX when there's .DS_Store files

  • [] - appSkeleton in the coldbox create app wizard needs to comply to IDs instead of local disk

  • [] - "server open" always opens localhost

  • [] - The trayicon in server.json does not work with relative paths

  • [] - update command doesn't respect original install path

  • [] - custom url rewrite location doesn't respect starting server by name in different location

  • [] - coldbox create crud doesn't work on Windows

New Feature

  • [] - Add Fusion Reactor support for server

  • [] - Starting server in web root with WEB-INF treats CWD as war

  • [] - Add "open" flag to touch/new command.

  • [] - forgebox whoami command to show what user your API key is set to

  • [] - Update the storage of the APIkey in the commandbox settings to include multiple keys

  • [] - Have a forgebox use {username} command to switch the current api key

  • [] - Allow aliases (virtual directory) in web server

  • [] - Provide custom 40x and 50x error pages for servers

Improvement

  • [] - Catch error scenario when user tries to start a server with a WEB-INF

  • [] - Upgrade to latest Runwar with several bug fixes

  • [] - Refactor string similarity to use external library

  • [] - Refactor semver CFC to be separate lib

  • [] - Refactor path pattern matcher CFC to be separate lib

  • [] - coldbox create app command does not list all templates

  • [] - Run pre/post package scripts by convention

  • [] - Add onRelease interception point/package script

  • [] - Serious performance issue with formatting large JSON strings

  • [] - Better handle syntax errors in a module's config

  • [] - Move onServerStart interception announcement to have server home dir

  • [] - Allow tray options to be customized

  • [] - Add onInstall interception point

  • [] - Incorrect custom model path in the unit test

  • [] - Exit REPL multi-line with extra enter stroke

  • [] - Don't use in-use port specified in start params or server.json

  • [] - Wait for full debug output when starting server with debug=true

  • [] - Append JVM args and runwar args to server defaults

  • [] - Update to Runwar 3.4.10

  • [] - Improve server status detections

  • [] - Show tag stack when executing .cfm files

  • [] - Improve tab completion of forgebox slugs

  • [] - Allow custom images inside tray menu plus disabled items

  • [] - Add overwrite confirmations to all coldbox create commands

  • [] - Improve version output in "forgebox show" command

  • [] - Upgrade engine to Lucee 4.5.3.020

What's New in 3.5.0

CLI Shell

We upgraded to a new version of the underlying library that handles the CLI interactions which brought a number of nice things.

  • The cls command now clears background colors that used to be left on the screen

  • Tab completion works better when two folders with different case were in the same directory

  • When developing commands, default text can be placed in the buffer when asking the user for input.

  • Fixed some instances where undesired spaces would get added when hitting tab completion

We also made the following improvements to the CLI shell environment

  • You don't need to escape an equals sign that's part of a quoted parameter value

  • Removed extra line break when piping the output of the "run" command

  • Fixed some regressions when piping text to the box binary

  • Added better BOM detection when tailing files

  • cp command will create destination directories

  • Windows paths that start with \ or / will be treated as absolute (like DOS works)

  • All OS's will expand ~ to the current user's home directory

Tail Command

The tail command used to only take a file as input, but now you can pipe raw text in as well.

CommandBox> forgebox search | tail lines=50

When tailing a file, you can specify the --follow flag and any new text added to the file will live stream to your console until you press Ctrl-C to stop. This is perfect for tailing application logs while your code is running to see new entries.

CommandBox> tail myFile.log --follow
CommandBox> system-log | tail --follow

The server log command also has a new --follow flag added to it which will live stream a running server's console log to the shell until you press Ctrl-C to stop it.

CommandBox> server log --follow

Package Management

The artifact storage location is now customizable thanks to Chris Schmitz, allowing you to store your artifacts on another drive, or even a network share so your coworkers can all use the same "local" copies.

CommandBox> config set artifactsDirectory=/path/to/artifacts

CommandBox will always re-download snapshot versions of packages to make sure you get a fresh version.

CommandBox> install [email protected]

When you try to install a package and CommandBox is offline, instead of giving up, we'll now look in your local artifacts cache for a satisfying version. If we find a package that works in your artifacts, we'll install it instead.

Server Starting

We added a few new ways to start up a server. You can use the --debug flag when starting a server to see additional information and the foreground process also waits for the server to start before finishing. Now when starting in debug mode this output will stream to the console as it becomes available instead of showing up all at the end. This is great to troubleshoot errors that are happening on server start as well as finding the slow parts of the startup sequence.

CommandBox> server start --debug

By default, your servers fire up in a new process that runs independently from the CLI. There is now a new flag called --console that will start the server up in the foreground and stream the console output to the CLI for you to watch. The start command will not end and will keep streaming the console output until you press Ctrl-C to stop it. You can also use --debug alongside the console flag for even more information.

CommandBox> server start --console
CommandBox> server start --console --debug

Server Welcome Files

If you have an app that uses a default welcome file other than index.cfm, you can control that now.

CommandBox> server set web.welcomeFiles="go.cfm,main.cfm,index.cfm,index.html"

Better SES URLs

This is one that you take for granted if you've always used Adobe ColdFusion, but for any CF server not running on Adobe's custom version of Tomcat, you can't use SES URLs in a subfolder like this without adding custom mappings to your web.xml:

site.com/myFolder/index.cfm/home/login

We've added just a dash of servlet fairy dust that now makes this possible. Note, if you want to hide the index.cfm with URL rewrites, you'll need a custom rewrite config for it to work in a subfolder.

Server Configuration

All server engines and versions have been standardized to install into the same reliable directory structure to make it easier for you to script config file replacements.

  • For Adobe CF WARs, the xml config files are located in the WAR here: /WEB-INF/cfusion/lib/neo.*.xml

  • For the Lucee server context, the xml config file is located in the WAR here: /WEB-INF/lucee-server/context/lucee-server.xml

  • For the Lucee web context, the xml config file is located in the WAR here: /WEB-INF/lucee-web/lucee-web.xml.cfm

To find the folder where your WEB-INF lives (as well as lots of other information about your server) you can use the server info command to get useful properties about a starting or started server.

# Find the "home" directory for a server (where the WEB-INF lives)
CommandBox> server info property=serverHomeDirectory

# Find the out log file
CommandBox> server info property=consoleLogPath

# Get all possible values as JSON
CommandBox> server info --JSON

Combining these allows you to do some nice one-liners like scripting out the copying of config settings when the server starts up. Hint: Use an onServerInstall or onServerStart package script!

CommandBox> cp neo-datasource.xml '`server info property=serverHomeDirectory`/WEB-INF/cfusion/lib/neo-datasource.xml'

Read more about this here:

https://commandbox.ortusbooks.com/content/v/development/embedded_server/copy-configs.html

Custom Server Home

Until now you've had to live with the special directory that CommandBox uses to install your servers into. Now you can get full control over where the server goes which is perfect for creating a folder "seeded" with config files that you want the server to use when it first starts. This trick (with some clever Git ignores) will also allow you to commit changes to your config files back to the repo while ignoring the rest of the engine.

  • Customize Lucee's server context folder with the serverConfigDir setting

  • Customize Lucee's web context folder with the webConfigDir setting

  • Customize where the entire WAR explodes to for any server with the serverHomeDirectory setting

This is very powerful since it gives you full control over the server deployment. Server installs have also been changed to NOT overwrite existing files when they unzip, so any config files you place in the server home prior to starting the server will be left in place and used by the server when it starts up. This means you can have datasources, mappings, and more start out-of-the-box for your site on a fresh install.

Read more about this here.

https://commandbox.ortusbooks.com/content/v/development/embedded_server/custom-server-home.html

A Few Changes

There were a few small changes in the "undocumented" core of CommandBox that got rearranged to make more sense. There's a small chance you may have been relying on one of them, so take note:

  • The serverHome property that comes back from server info has been renamed to serverHomeDirectory.

  • The webConfigDir property used to point to the server home, but this was incorrect. The property will now be blank unless specified. Use serverHomeDirectory instead.

  • The default Lucee server used to have a non-standard folder structure, but now matches the WAR folders of all other servers

  • The web context in Lucee servers used to be in a folder named after a random hash which was kind of silly (and impossible to find). It's now always under /WEB-INF/lucee-web

  • All "internal" Lucee servers used to share a single server context (and settings). All servers are now separate. Use the serverConfigDir setting to point more than one server at a single server context or use one of the new options for copying configs.

  • The core CLI server context now has a default password of "commandbox" set. This would apply if you wanted to use the tag from .cfm files executed via the shell or a custom command.

  • Several new properties were added to the server info data for your convenience. Check them out by starting a server and running server info --JSON.

Release Notes

Bug

  • [COMMANDBOX-236] - `box reload` doesn't clear background colors from buffer on Windows

  • [COMMANDBOX-248] - tab completion doesn't always work on paths

  • [COMMANDBOX-500] - CommandBox timeout is shorter than runwar timeout when starting Adobe servers

  • [COMMANDBOX-505] - BOM interferes with commandbox.properties

  • [COMMANDBOX-507] - Staring server with defautlPort in box.json, adds optional keys back in.

  • [COMMANDBOX-509] - Ignore equals in a quoted parameter

  • [COMMANDBOX-522] - Improve error message when endpoint fails installing server

  • [COMMANDBOX-526] - Use hostname for "coldbox reinit"

  • [COMMANDBOX-533] - Error starting CommandBox in some instances

  • [COMMANDBOX-539] - "run" expressions contain line break on Linux

  • [COMMANDBOX-542] - Regression in piping input from OS console

  • [COMMANDBOX-543] - Piping a file of commands with a BOM into box fails

  • [COMMANDBOX-544] - package set doesn't always set what you expect

  • [COMMANDBOX-545] - The `commandbox-home` when used in symbolic link mode fails on mac

New Feature

  • [COMMANDBOX-234] - ability for server start to deploy web-inf locally instead of server location

  • [COMMANDBOX-473] - Control list of welcome files

  • [COMMANDBOX-479] - Make artifacts path customizable

  • [COMMANDBOX-503] - Allow tail command to follow a log file

  • [COMMANDBOX-504] - Allow raw text to be piped into the tail command

  • [COMMANDBOX-506] - Add startTimeout parameter to control how long to wait for server to start

  • [COMMANDBOX-508] - Console flag to server start

  • [COMMANDBOX-523] - new preServerStart interceptor

  • [COMMANDBOX-534] - Add --follow flag to "server log" to tail it and follow

  • [COMMANDBOX-535] - cp command create directories if necessary when copying file

  • [COMMANDBOX-536] - If Forgebox is down, use artifacts cache on installs

  • [COMMANDBOX-538] - Allow programmatic access to server info

  • [COMMANDBOX-546] - Allow custom server home dir

Improvement

  • [COMMANDBOX-153] - Support for double wildcard servlet mappings

  • [COMMANDBOX-222] - Set default password Lucee CLI context

  • [COMMANDBOX-439] - absolute paths on Windows don't follow the same rules as DOS

  • [COMMANDBOX-456] - If forgebox is down, 'internal' server won't start

  • [COMMANDBOX-498] - Upgrade engine to Lucee 4.5.4.017

  • [COMMANDBOX-499] - improve contentbox-widget package installation conventions

  • [COMMANDBOX-501] - Stream server start log when debug is true

  • [COMMANDBOX-510] - Improve JSON parsing when piping complex values to cfml command

  • [COMMANDBOX-511] - Allow webConfigDir, serverConfigDir & webXML to be relative

  • [COMMANDBOX-514] - Improve rewrites to not fire on SES URLs in a subdir

  • [COMMANDBOX-515] - server forget does not stop server if running

  • [COMMANDBOX-518] - libdirs aren't relative when starting a server

  • [COMMANDBOX-519] - Libdirs aren't used for non-internal servers.

  • [COMMANDBOX-520] - Improve output of server info and server list commands

  • [COMMANDBOX-521] - Stop loading java agent for Lucee 5

  • [COMMANDBOX-524] - Improve starting internal server when not specifying buildID

  • [COMMANDBOX-528] - Improve server start intercepors

  • [COMMANDBOX-529] - Standardize server home directories

  • [COMMANDBOX-530] - Upgrade to JLine 2.15-snapshot

  • [COMMANDBOX-531] - Allow default text to be put in buffer for ask() function

  • [COMMANDBOX-532] - Don't cache snapshots

  • [COMMANDBOX-537] - Remove .git folder when cloning a Git repo

  • [COMMANDBOX-540] - Support ~ as a shortcut for the user home directory like bash.

  • [COMMANDBOX-547] - Improve tab completion for server/package/config set commands

  • [COMMANDBOX-549] - Spruce up the opening ASCII art

  • [COMMANDBOX-550] - Pass JVM args through to background server process

  • [COMMANDBOX-551] - Fix working directory of xxxInstall package scripts

install commandbox-fusionreactor
fr register "your FR license key"
server start
fr open
{
  "web" : {
    "aliases" : {
      "/foo" : "../bar",
      "/js" : "C:\static\shared\javascript"
    }
  }
}
server set web.aliases./foo = bar
{
  "web" : {
    "errorPages" : {
      "404" : "/path/to/404.html",
      "500" : "/path/to/500.html",
      "default" : "/path/to/default.html"
    }
  }
}
server set web.aliases.404=/missing.htm
{
  "trayOptions":[
    {
      "label":"Foo",
      "action":"openbrowser",
      "url":"http://${Setting: runwar.host not found}:${Setting: runwar.port not found}/foobar.cfm",
      "disabled":false,
      "image":"/path/to/image.png"
    }
  ]
}
forgebox whoami
forgebox use myUser
"scripts":{
  "preVersion":"testbox run",
  "postVersion":"package set location='gituser/repov#`package version`'",
  "postPublish":"!git push --follow-tags"
}
bump --minor
publish
start [email protected]+018
FusionReactor
CommandBox FusionReactor
FusionReactor license or sign up for a trial
COMMANDBOX-187
COMMANDBOX-422
COMMANDBOX-423
COMMANDBOX-426
COMMANDBOX-434
COMMANDBOX-435
COMMANDBOX-437
COMMANDBOX-449
COMMANDBOX-451
COMMANDBOX-464
COMMANDBOX-465
COMMANDBOX-466
COMMANDBOX-316
COMMANDBOX-399
COMMANDBOX-416
COMMANDBOX-430
COMMANDBOX-431
COMMANDBOX-432
COMMANDBOX-445
COMMANDBOX-458
COMMANDBOX-398
COMMANDBOX-410
COMMANDBOX-412
COMMANDBOX-413
COMMANDBOX-414
COMMANDBOX-419
COMMANDBOX-420
COMMANDBOX-421
COMMANDBOX-424
COMMANDBOX-425
COMMANDBOX-427
COMMANDBOX-428
COMMANDBOX-433
COMMANDBOX-436
COMMANDBOX-440
COMMANDBOX-442
COMMANDBOX-443
COMMANDBOX-444
COMMANDBOX-454
COMMANDBOX-457
COMMANDBOX-460
COMMANDBOX-461
COMMANDBOX-467
COMMANDBOX-468
COMMANDBOX-469
COMMANDBOX-470

What's New in 4.2.0

Random Fixes

In no particular order...

  • Fix background colors not showing up in Powershell and Windows cmd

  • System Setting expansions not always working in server.json

  • testbox run no longer blindly assumes you're returning JSON.

  • Piping commands into box was broken since 4.0.0

  • Starting server with --debug didn't output logs on error.

Random New Features

Sorted by createUUID() DESC...

  • Custom commands have more control over their tab completion candidates. Docs Here

  • Control how many levels deep package list displays

  • New versions of Lucee, JGit, JLine, and WireBox

  • More pack200 of the Lucee jar (and more improvements to come soon in the next version of Lucee)

  • Automatic detection for build servers like Travis-CI to hide progress bar animations. Docs Here

  • Cloning Git repos during install has a nice new progress bar that plays well with interactive jobs

  • You can use the aforementioned progress bar for your own purposes in custom commands and Task Runners. Docs Here

Improvements to Native Binaries

The run command has been a pain over the last few versions as every "fix" has seemed to lead to another regression. We've made some more changes to try and get each use case working as expected with no annoying bash messages about "job control". Fingers crossed.

Single one-off command, streams output to console as it comes.

!ping google.com

Piping output of native binary into another Command (output captured all together and not streamed).

!pwd | #listLast /

Running interactive commands. No output at all really, standard input and output of CommandBox bound directly to native shell

!nano index.cfm

Better Exit Code handling

You can now control the exit code that CommandBox (or your recipe) exits with. Remember, zero is successful, any other number is failure.

exit 123

Access the Exit Code of the previous command via a System Setting expansion of${exitCode}.

echo ${exitCode}

Recipes now have better support for exit codes. If a command throws an error OR returns a non-zero exit code, the recipe will stop and the exit code of the last command will be returned as the exit code from the recipe command. And if it was a non-interactive shell, the exit code will flow all the way back to the operating system from the box binary. Also, running "exit" inside of a recipe will no longer exit the entire shell, but just that recipe execution. This give you a lot better control over your recipes.

https://commandbox.ortusbooks.com/usage/execution/exit-codes

Command Chaining

Let's take a moment to review an existing but little known feature of CommandBox that we borrowed from bash. This is not new, but you need to know this for the following section to make any sense. Similar to bash, CommandBox allows you to chain multiple commands together on the same line and make them conditional on whether the previous command was successful or not.

&&

You can use && to run the second command only if the previous one succeeded.

mkdir foo && cd foo

||

You can use || to run the second command only if the previous one failed.

mkdir foo || echo "I couldn't create the directory"

;

You can use a single semicolon (;) to separate commands and each command will run regardless of the success or failure of the previous command.

mkdir foo; echo "I always run"

New Assertion Commands

With the above building blocks, we can get clever to create simple conditionals to only run commands if a condition is met. Or these can simply be used to cause recipes to stop execution or to fail builds based on a condition. The following commands output nothing, but they return an appropriate exit code based on their inputs.

https://commandbox.ortusbooks.com/usage/execution/exit-codes#assertions

pathExists

Returns a passing (0) or failing (1) exit code whether the path exists.

# Only run the package show command if the box.json file exists
pathExists box.json && package show

You can specify if the path needs to be a file or a folder.

# output server.json only if it exists
pathExists --file server.json && server show

# Create the dir foo only if it doesn't already exist
pathExists --directory foo || mkdir foo

assertTrue

Returns a passing (0) or failing (1) exit code whether truthy parameter passed. Truthy values are "yes", "true" and positive integers. All other values are considered falsy

# If this package is private, then run a package script
assertTrue `package show private` && run-script foo

# If this env var is true, then run a command
assertTrue ${ENABLE_DOOM} && run-doom

# Use the boolean output of a native CFML function to control this echo
assertTrue `#fileExists foo.txt` && echo "it's there!"

assertEqual

Returns a passing (0) or failing (1) exit code whether both parameters match. Comparison is case insensitive.

# If the name of our package isn't a specific string, only then set it
assertEqual `package show name` "My Package" || package set name="My Package"

# If this env var is the string "production", then perform a production install of dependencies
assertEqual ${ENVIRONMENT} production && install --production

New S3 Endpoint for Installing Packages

Big thanks to John Berquist and Dominic Watson for helping add this new feature. You can now install packages directly from S3, Amazon S3, Digital Ocean Spaces and Google Disk.

install s3://my-private-bucket/myPackage.zip

There are several different authentications mechanisms available too:

  • Per bucket credentials in your CommandBox endpoint settings

  • Global credentials in your CommandBox endpoint settings

  • Environment variables

  • AWS credentials file

  • IAM role

The full docs are here:

https://commandbox.ortusbooks.com/package-management/code-endpoints/s3

Updated Server Tray Menus

We've added 17 pieces of flair to our server tray menus to show you more information such as PID, webroot, and port as well as a new option to open up the web root in your file system explorer.

Release Notes

Here's the full list of everything that changed in CommandBox 4.2.0.

Bug

  • [COMMANDBOX-417] - .zip files in artifacts cache don't include empty folders

  • [COMMANDBOX-808] - "bash: no job control in this shell" error message (pull request)

  • [COMMANDBOX-809] - external commands/shells that are interactive (such as vi) are not working when executed from commandBox

  • [COMMANDBOX-810] - tab hinting colors wrong in PowerShell terminals.

  • [COMMANDBOX-811] - System settings not always used in server.json

  • [COMMANDBOX-829] - "testbox run" formats outputfile as JSON even if it's not

  • [COMMANDBOX-833] - Piping input to CommandBox broken

  • [COMMANDBOX-834] - Bleeding edge upgrades show wrong URL after S3 artifacts move

  • [COMMANDBOX-835] - --debug doesn't dump job logs on error

New Feature

  • [COMMANDBOX-814] - Allow arbitrary command params to have file/folder completion via annotation

  • [COMMANDBOX-815] - Allow custom completion UDFs to provide group and description

  • [COMMANDBOX-839] - New conditional commands pathExists, assertTrue and assertEqual

  • [COMMANDBOX-840] - Allow access to previous exitCode as system setting

  • [COMMANDBOX-841] - Allow user to exit shell with specific exit code

  • [COMMANDBOX-842] - Improve recipe handling of exitCodes

Improvement

  • [COMMANDBOX-746] - Compact package listing

  • [COMMANDBOX-779] - Write a custom JGit progress updater that clears out at the end

  • [COMMANDBOX-813] - Hide JLine warning about dumb terminals

  • [COMMANDBOX-817] - S3 Endpoint

  • [COMMANDBOX-818] - Upgrade to JGit 5.0.1

  • [COMMANDBOX-819] - Upgrade to Launch4J 3.12

  • [COMMANDBOX-820] - Skip forgebox checks on server start with server home dir that's already installed.

  • [COMMANDBOX-821] - Upgrade to JLine 3.8.2

  • [COMMANDBOX-823] - Pack200 Lucee bundles

  • [COMMANDBOX-825] - Upgrade to Lucee 5.2.8.50

  • [COMMANDBOX-826] - Default rewrites support /pms servlet used for Adobe CF 2018 performance monitor

  • [COMMANDBOX-827] - Default nonInteractiveShell setting in commonly known build environments

  • [COMMANDBOX-828] - Improve messaging when initting private package

  • [COMMANDBOX-837] - Reorganize the tray menus

  • [COMMANDBOX-843] - Upgrade to Wirebox 5.1

What's New in 3.0.0

Config Settings

CommandBox now has a JSON file of settings that can be used to configure any kind of behavior we want. We're still working on implementing features that actually use the settings, but the first will be the ability to set up a proxy server for your corporate network. Config settings give us a place to store ad-hoc settings like this as well as an API for retrieving them. What's great is the settings JSON file can store ANY information, including complex structs and arrays so feel free to use it for your own purposes as well. You can interact with config settings like so:

Modules

This is perhaps the most radical thing we've done in CommandBox to date and it is huge. We've introduced modules (just like ColdBox) into the actual CLI itself. A module is a unit of code re-use that allows you to take a folder of code that follows a few simple conventions and drop it into a module-aware application for instant extension. This means that we've broken out all the internal commands into system modules for organization. What's more, you can write your own CommandBox modules that hook into the internal workings with interceptors, register their own custom commands, or help manage settings or servers. Modules can be placed on and installed by your friends in seconds to extend the core of CommandBox. The benefits here can't be understated. Check out and go through the quick, easy steps to create your first CommandBox module.

Not only can modules have settings, but you can also override a module's default settings easily with config settings that follow a simple convention. For example, if a module named "foo" has a setting named "bar", you don't need to edit the module's code to change the setting. Simply run this command:

Interceptors

CommandBox interceptors, like modules, work the same way that ColdBox interceptors do. They give you hooks that you can register to listen to events broadcast by the CommandBox core, or custom events of your own design that you announce. These are very powerful for being able to extend and modify how the core CLI works to build upon it. Interceptors are bundled inside modules so they install quickly and easily. Distribute them on as well. I've already created a that uses the onCLIStart interceptor to modify the ASCII art banner that appears when you start CommandBox.

Here's some of the core interception points:

  • onCLIStart

  • onCLIExit

  • preCommand

  • postCommand

  • onServerStart

  • onServerStop

  • onException

  • preInstall

  • postInstall

Now you can write modules that check for upgrades on CommandBox startup, manipulate the output of commands, log exceptions, customize server startup, or audit what package you install the most!

Standardized Command Packaging

We've had the ability for custom commands for a while, but they were limited and didn't easily allow you to include additional CFC files with your commands. Now with the addition of modules, your custom commands can be package in a module right alongside settings, interceptors, or services. We also simplified the creation of custom commands so things like extending our BaseCommand class is optional thanks to WireBox's virtual inheritance. We hate boilerplate as much as you do!

There are already some cool custom commands popping up on ForgeBox. Check out for making http calls from the command line similar to curl.

Server.json

This feature has been a long-time coming. There are a lot of options you can set when starting a server, and portability has been hard for people wanting to distribute an app that needs to start with custom JVM args, rewrites, or a specific port. Now all server startup options can be set in your web root in a server.json file which will be used automatically the next time you run "start". You interact with these settings the same as package or config settings.

Shortcut for Native OS Binaries

We've had the "run" command for a while now that allows you to run native binaries from the interactive shell, or from a CommandBox recipe. The output is returned which allows you to create mashups that pipe the output of OS commands directly into CommandBox commands. We took this a step further and borrowed from other CLIs out there so now the parser allows you to call native OS binaries by simply prefixing an exclamation mark (!) in front of the binary name. Now only are OS commands run in the current working directory, they are also executed via the shell for that machine which makes non-binaries and aliases like "ll" function.

Shortcut for CFML Functions via REPL

This is a really neat feature that allows you to actually run CFML functions straight from the CommandBox CLI as commands. Just prefix the function name with a hash sign (#) and then type the function name with no parenthesis. Any parameters to the function can be passed (or piped) into the command like normal named or positional CLI command parameters.

This really gets cool when you start piping the output of commands together to string together mixtures of CommandBox commands and CFML functions for fancy one-liners. Here's some string manipulation. The first one does some list manipulation. The second one outputs the lowercase package name.

But wait, there's more! You can even use struct and array functions. Their output is returned as JSON and automatically deserialized as input to the next command. Keep in mind that piped data gets passed in as the FIRST parameter to the next command. This outputs a nice list of all the top-level dependencies in your package.

Expressions in Command Parameters

Parameter values passed into a CommandBox command don't have to be static. Any part of the parameter which is enclosed in backticks (`) will be evaluated as a CommandBox expression. That means that the enclosed text will be first executed as though it were a separate command and the output will be substituted in its place.

You can really go crazy with these mashups by combining CFML functions too. This example sets a property in a package's box.json that's equal to a nicely formatted date:

Command DSL

We've really focused on doing CommandBox development now with the possibilities opened up with the addition of modules. One pain point of extending CommandBox was calling other commands since parameters needed to be escaped. We created a nice method-chaining DSL to help execute any other command from inside of your custom commands.

You can even nest the DSL to pipe output between commands:

New WireBox Injection DSLs

In line with the previous item, we've made it yet easier to write custom modules that extend the functionality of CommandBox by adding new WireBox injection DSLs. Everything inside of CommandBox is created and autowired by WireBox. You can now ask WireBox to inject core services, module settings, or config settings.

Release Notes

Bug

  • [] - Starting a server by short name doesn't work

  • [] - Tag REPL seems to be unavailable

  • [] - REPL output cannot be piped

  • [] - url rewriterules in commandbox incorrect

  • [] - Brew fomulas SHA1 mismatch

  • [] - Starting server from OS shell doesn't always work

  • [] - Restarting server saves openBrowser as false in server.json

  • [] - Can't clear JSON properties with dash in the name

  • [] - Coldbox create view commands break if name includes package

  • [] - CommandBox TestBox array of runners does not run

New Feature

  • [] - Provide a more programmatic way to run commands/tasks like a method

  • [] - Allow native binary execution with exclamation mark

  • [] - Add server.json to default server settings

  • [] - Global CommandBox setting file

  • [] - Disable sendfile in runwar server

  • [] - Refactor JSON handling out of package commands for reuse

  • [] - Allow # as a REPL shortcut to run CFML tags or functions

  • [] - Allow expressions in command parameters

  • [] - Add option to server start for enabling/disabling directory browsing module

  • [] - Allow commands to be piped in to box

  • [] - Override module settings with config settings on module load

  • [] - WireBox injection DSLs for module config and settings

  • [] - Handle struct of environment variables in server.json

  • [] - Add additional helper reference to the Executor

Task

  • [] - Remove bleeding edge builds from production Debian repo.

Improvement

  • [] - Standardize command packaging

  • [] - HTTP Calls don't work behind company proxy

  • [] - Use virtual inheritance for commands

  • [] - Allow ad-hoc JVM args when starting server

  • [] - Add modularity

  • [] - Add event-listener model to CommandBox

  • [] - Improve error handling in CFLib endpoint

  • [] - Alias Execute as exec

  • [] - Return better details from progressable downloader

  • [] - Run command uses same environment as box executable when it was first started

  • [] - Improve error handling in HTTP endpoint

  • [] - Update to latest version of WireBox

  • [] - bump command reset minor and patch

  • [] - bump runwar version to 3.3.0

  • [] - Enhance server rewrites for file/dir detection

  • [] - Refactor core commands to be modules

  • [] - Move application templates into the coldbox-commands module

  • [] - Move scaffolding templates into respective modules

  • [] - Improve error handling in commands

  • [] - Shortcut to cd into directory after mkdir command

  • [] - Run command doesn't run in the same CWD as CommandBox

  • [] - Allow run command to run any OS command from the shell

  • [] - Allow ConfigService to use nested setting keys

  • [] - Improve parsing of run and ! command

  • [] - Allow user to set custom shell with config setting

  • [] - warn user if package has invalid JSON file

  • [] - Bump JRE version to 1.8.0_72

  • [] - Embedded server doesn't sent proper headers for SVGZ files

  • [] - Support ContentBox installation paths

config set name=mySetting
config set modules.myModule.mySetting=foo
config set myArraySetting[1]="value"
config set setting1=value1 setting2=value2 setting3=value3
config show settingName
config set modules.foo.bar=value
install commandbox-http-command
server set web.http.port=8080
server show web.http.port
server start
!myApp.exe
!git pull
!dir
#now
> {ts '2016-01-19 16:14:23'}
#hash mypass
> A029D0DF84EB5549C641E04A9EF389E5
#reverse abc
> cba
#listGetAt www.foo.com 2 . | #ucase | #reverse
> OOF
package show name | #lcase
> my package
package list --JSON | #structFind dependencies | #structKeyList
> coldbox,docbox,testbox,cbmessagebox
echo "Your CommandBox version is `ver` and this app is called '`package show name`'!!"
> Your CommandBox version is 3.0.0 and this app is called 'Brad's cool app'!
package set createdDate=`#now | #dateformat mm/dd/yyyy`
> Set createdDate = 1/19/2016
command( 'cp' )
    .params( path='/my/path', newPath='/my/new/path' )
    .run();
command( "echo" )
    .params( "hello#chr( 10 )#world" )
    .pipe( 
        command( "grep" )
        .params( "lo" )
    )
    .run();
property name='shell'  inject='commandbox';
property name='ModuleService'   inject='ModuleService';
property name='MyService' inject='MyService@MyModule';
property name='mySetting' inject='commandbox:moduleSettings:moduleName:mySetting';
property name='myConfigSetting' inject='commandbox:ConfigSettings:myConfigSetting'
Read More
ForgeBox
the docs
Read More
ForgeBox
simple example module
Read More
this community addition
Read More
Read More
Read More
Read More
Read More
Read More
Read More
COMMANDBOX-144
COMMANDBOX-285
COMMANDBOX-300
COMMANDBOX-305
COMMANDBOX-310
COMMANDBOX-317
COMMANDBOX-321
COMMANDBOX-324
COMMANDBOX-326
COMMANDBOX-333
COMMANDBOX-52
COMMANDBOX-111
COMMANDBOX-266
COMMANDBOX-291
COMMANDBOX-294
COMMANDBOX-296
COMMANDBOX-302
COMMANDBOX-303
COMMANDBOX-306
COMMANDBOX-312
COMMANDBOX-313
COMMANDBOX-314
COMMANDBOX-319
COMMANDBOX-320
COMMANDBOX-301
COMMANDBOX-121
COMMANDBOX-205
COMMANDBOX-226
COMMANDBOX-250
COMMANDBOX-251
COMMANDBOX-252
COMMANDBOX-284
COMMANDBOX-286
COMMANDBOX-287
COMMANDBOX-288
COMMANDBOX-289
COMMANDBOX-290
COMMANDBOX-292
COMMANDBOX-297
COMMANDBOX-298
COMMANDBOX-307
COMMANDBOX-308
COMMANDBOX-309
COMMANDBOX-311
COMMANDBOX-315
COMMANDBOX-322
COMMANDBOX-323
COMMANDBOX-325
COMMANDBOX-327
COMMANDBOX-328
COMMANDBOX-330
COMMANDBOX-331
COMMANDBOX-332
COMMANDBOX-334

What's New in 5.3.0

Override Config Settings via Env Vars

Every Config Setting can be overridden by convention by creating environment variables in the shell where you run box. This is ideal for CI builds where you want to easily set ForgeBox API keys, or tweak settings for your build.

box_config_endpoints_forgebox_APIToken=my-token-here

# JSON which will be parsed
box_config_proxy={ "server" : "localhost", "port": 80 }

# dot-delimited keys (windows only)
box_config_endpoints.forgebox.APIToken=my-token-here

# array indexes too (windows only)
box_config_foo.bar[baz].bum[1]=test

More Info: https://commandbox.ortusbooks.com/config-settings/env-var-overrides

Override Server Settings via Env Vars

Every server setting can be overridden by convention by creating environment variables in the shell where you run box. This is ideal for CI builds where you want to easily set ports, or tweak settings for your build.

box_server_profile=production

box_server_web_http_port=8080

# JSON which will be parsed
box_server_web_ssl={ "enabled" : true, "port": 443 }

# dot-delimited keys (Windows only)
box_server_web.http.port=8080

# array indexes too (Windows only)
box_server_web_rules[1]=path-suffix(/box.json) -> set-error(404)
box_server_web_rules[2]=disallowed-methods(trace)

More Info: https://commandbox.ortusbooks.com/embedded-server/configuring-your-server/env-var-overrides

HTTP/2 Support

CommandBox now has out-of-the-box support for the HTTP/2 protocol. It is always enabled by default and browsers will use it when you're serving over HTTPS.

server set web.http2.enable=true/false

More Info: https://commandbox.ortusbooks.com/embedded-server/configuring-your-server/server-port-and-host#http-2

JMES JSON filtering / jq Command

Thanks to a massive effort from Scott Steinbeck, the CFML world has a new CF implementation of the JMES spec, which is what powers the popular "jq" (or JSON Query) bash command. We've plugged this new library into CommandBox and exposed it in the following ways.

We've added a new jq command which behaves roughly like the bash counterpart. You can pipe in JSON, or read the JSON from a file and apply a JSON query against it which can be used to filter, massage, rewrite, map, or filter the JSON into a new JSON object.

# Return array of dependency names
package show | jq keys(dependencies)

# Find dependencies with "cb" in their name
package show | jq key_contains(dependencies,'cb')

We've also added the ability to specify powerful jq filters to the "package show", "server show", and "config show" commands directly. Just prefix your filter with the text "jq:" like so:

config show jq:endpoints.forgebox.apiToken
# .. is the same as ...
config show endpoints.forgebox.apiToken

# or you can get fancy...
config show 'jq:keys(modules)'

# Impress your friends
package show "jq:[name,version]"

# Be the life of the party
package show "jq:contributors|split(@,' ')" 

The jq command and JMES spec are very powerful and probably do much more than you realize! Make sure you check out the docs for more ideas.

More Info: https://commandbox.ortusbooks.com/usage/jq-command

AJP Secret Support

CommandBox's AJP listener (provided by Undertow) is already protected against the Ghostcat vulnerability. However, if you would like to set up an AJP secret as well to ensure all requests coming into the AJP listener are from a trusted source, you can do this by setting the web.ajp.secret property.

server set web.AJP.secret=mySecret

For this to work, you must also configure your AJP proxy in your web server to send the same secret!

More info: https://commandbox.ortusbooks.com/embedded-server/configuring-your-server/server-port-and-host#ajp-secret

AsyncManager Available to Task Runners and Commands

We've updated the version of WireBox inside the CLI and now have access to the AsyncManager for sweet threading and scheduled task support.

// Parallel Executions
async().all(
    () => hyper.post( "/somewhere" ),
    () => hyper.post( "/somewhereElse" ),
    () => hyper.post( "/another" )
).then( (results)=> logResults( results ) );

CommandBox is using an AsyncManager scheduled task thread now to redraw interactive jobs and progress bars. Look out for some new eye candy hiding in your server starts and package installs!

More Info: https://commandbox.ortusbooks.com/task-runners/threading-async#asyncmanager

New Table Printer

The print helper in commands and Task Runners has a new toy that will print ASCII representations of tabular data thanks to a pull request from Eric Peterson. You can see it in the output of the outdated command.

And you can use it in your Task Runners like so:

print.table(
	[ 'First Name', 'Last Name' ],
	[
		[ 'Brad', 'Wood' ],
		[ 'Luis', 'Majano' ],
		[ 'Gavin', 'Pickin' ]
	]
);

ColdBox Scaffolding for REST Handlers

When scaffolding ColdBox handlers, we have support for ColdBox 6.x REST Handlers now.

coldbox create handler --rest

Experimental Server Features

You can enable extra Resource Manager Logging when troubleshooting file system issues:

server set runwar.args="--resource-manager-logging=true"

You can force case sensitivity on a Windows server:

server set runwar.args="--case-sensitive-web-server=true"

You can force case Insensitivity on a Linux server:

server set runwar.args="--case-sensitive-web-server=false"

You can enable a cache of file system lookups of servlet paths. This is only for production and will eliminate repeated file system hits by your CF engine, such as checking for an Application.cfc file on every request, or testing where the servlet context root is. Standard Adobe ColdFusion installations have a similar cache of "real" paths from the servlet context that is tied to a setting in the administrator called "Cache Webserver paths" but that setting is not available and does not work on CommandBox servers for some reason. This setting would apply to any CF engine.

server set runwar.args="--cache-servlet-paths=true"

More Info: https://commandbox.ortusbooks.com/embedded-server/configuring-your-server/experimental-features

HTTPS Redirect/HSTS

When using a CommandBox web server in production, you may wish to force your users to visit your site over HTTPS for security (and for HTTP/2 to work). However, it is desirable to still have your web server listening on HTTP so a user just typing your address in his browser can still connect to HTTP and then redirect. CommandBox can be configured to redirect all HTTP traffic over to HTTPS with the following setting.

server set web.SSL.forceSSLRedirect=true

If you want to go one step further, you can add a Strict-Transport-Security header to your site. This instructs the browser to automatically use HTTPS every time the user visits your site again.

server set web.SSL.HSTS.enable=true
server set web.SSL.HSTS.maxAge=31536000
server set web.SSL.HSTS.includeSubDomains=true

More Info: https://commandbox.ortusbooks.com/embedded-server/configuring-your-server/https-redirect-hsts

Force Colored Output in your Builds

CommandBox won't use ANSI color formatting when running inside of a non-interactive terminal. However, build servers such as Gitlab or Jenkins (via a plugin) support ANSI color sequences. You can force CommandBox to use colored text output with this new setting:

config set colorInDumbTerminal=true

Loose Semantic Version Parsing

One of the common hangups for people dealing with Lucee Server and Adobe ColdFusion CF Engines versions, is that CommandBox follows the npm-flavor of the semantic version spec and expects

server start [email protected]+48

instead of

server start [email protected]

So we've loosened our sem ver library to treat the 4th number as a build ID if there is no plus sign in the version (instead of just discarding the 4th digit as the spec requires)

Support for "localhost subdomains"

Most modern browsers allow you to make up any subdomain you want before localhost such as mySite.localhost and will simply resolve them to localhost (127.0.0.1) even without a hosts file entry. CommandBox now supports using these domains and will bind your server's ports to localhost even without using the commandbox-hostupdater module.

server set web.host=mySite.localhost

More Info: https://commandbox.ortusbooks.com/embedded-server/configuring-your-server/server-port-and-host#a-gracious-host

Relative CommandBox home

You can customize where CommandBox lives by placing a commandbox.properties file next to the box binary. We have better support for relative paths now so you can have portable CommandBox installations such as a thumb drive.

commandbox_home=../customHome

More Info: https://commandbox.ortusbooks.com/setup/installation

Halt Server If Port In Use (Breaking Change)

The only known breaking change in this release is if you try to start two servers on the same HTTP port. Previously, CommandBox would just ignore the port on the second server and choose a random port. Due to the confusion that can cause, CommandBox will now throw an error. If you want to override an explicit port locally, set the port to an empty string or a 0 and CommandBox will choose a random port for you. For example, if you are using the commandbox-dotenv module, you can put this line in your project's .env file to override the port in your server.json

box_server_web_http_port=0

Relative Web Alias Behavior (regression)

If you have a server with the server.json outside of the web root and at least one relative web alias, the alias will not work on the first start of the server. The workaround is to change the web aliases to be relative to the folder that the server.json lives in.

Incompatibility with old DotEnv module

Some users receive the following error when starting CommandBox after updating:

The parameter [name] to function [get] is required but was not passed in.

If you see this, it means you have an older version of the commandbox-dotenv module installed that is not compatible with the new version of WireBox inside CommandBox. To fix, delete this folder out of your CommandBox home:

~/.CommandBox/cfml/modules/commandbox-dotenv

Now the CLI will start and you can install the latest version of dotenv.

install commandbox-dotenv

Release notes

Here is the list of all tickets included in the 5.3.0 release.

Bug

COMMANDBOX-1301 web server aliases in server.json should be relative to the folder of the server.json

COMMANDBOX-1300 ${Setting: serverinfo.foo not found} expansions don't work in a folder that's not the web root

COMMANDBOX-1291 Re-using same server.json with two names doesn't work

COMMANDBOX-1276 Corrupted WireBox metadata cache file will prevent CommandBox from starting

COMMANDBOX-1275 HTTP2 Additional Port Handling and Flexibility

COMMANDBOX-1271 REPL & Command highlighters don't handle square brackets [] well

COMMANDBOX-1270 JVM arg ending in backslash doesn't work

COMMANDBOX-1268 Coldbox Watch-Reinit Watches Unwanted Folders

COMMANDBOX-1263 Package installation doesn't always optimize duplicate packages

COMMANDBOX-1261 Globber.count() bombs if run after .asQuery()

COMMANDBOX-1259 Starting [email protected] will use light-light when using CommandBox Light

COMMANDBOX-1255 Loading class files in task runner doesn't work

COMMANDBOX-1253 variables scope doesn't persist between task dependencies

COMMANDBOX-1250 tokenreplace removes BOM from files

COMMANDBOX-1212 trayOptions.json not respecting serverHomeDirectory

COMMANDBOX-664 Server status not always correct.

Improvement

COMMANDBOX-1297 Add singleServerHome option to not auto-deploy different versions of servers

COMMANDBOX-1296 Improve error message if version isn't found in ForgeBox

COMMANDBOX-1295 Loosen parsing of build ID in semver

COMMANDBOX-1292 Treat empty HTTP port the same as 0 (chooses random port)

COMMANDBOX-1290 Remove runwar hack that sets java vesrion

COMMANDBOX-1288 Runwar timesout when Lucee's new warmup flag is used

COMMANDBOX-1287 Add option for PID file

COMMANDBOX-1285 Allow generic override of server start settings via env vars or java sys props

COMMANDBOX-1284 Have parser ignore quotes inside a token

COMMANDBOX-1269 Cache "/" path lookup in Runwar's mapped resource manager

COMMANDBOX-1267 Add setters for run() arguments in CommandDSL

COMMANDBOX-1258 Default embedded server only needs to copy lucee.jar

COMMANDBOX-1256 Have outdated also show latest version of a package

COMMANDBOX-1252 Integrate AsyncManager into CommandBox

COMMANDBOX-1251 Upgrade to latest WireBox 6.x

COMMANDBOX-1249 Bundle testbox in testbox module to prevent auto download

COMMANDBOX-1248 Halt server start if asked for port is in use

COMMANDBOX-1246 the git bullet train car disappears while current working directory is not the root project folder

COMMANDBOX-1216 Support AJP secret in Undertow

COMMANDBOX-1169 Rethink the way the screen is redrawn upon extensive installs so it can be fluent on all screen sizes

COMMANDBOX-1136 Can't link package if no modules are installed

COMMANDBOX-1117 New first-class setting to enable HTTP2

COMMANDBOX-1108 Comment out the default environment vars in .env when createing a new coldbox app

New Feature

COMMANDBOX-1294 Allow server rules to be commented out with #

COMMANDBOX-1293 Allow servers to use random.localhost domains

COMMANDBOX-1289 Integrate JMES JSON filtering

COMMANDBOX-1282 Debug when lucee-extensions don't find Lucee server

COMMANDBOX-1281 Allow JSON service to create implicit arrays

COMMANDBOX-1280 Add config setting to enable ANSI colors in dumb terminals

COMMANDBOX-1279 Allow generic override of config settings via env vars or java sys props

COMMANDBOX-1278 Add --json flag to server list

COMMANDBOX-1277 Add HTTP redirect options

COMMANDBOX-1273 Add optional servlet path cache in Runwar

COMMANDBOX-1262 Allow caching of task runners

COMMANDBOX-1260 Support for generating ColdBox RESTHandlers

COMMANDBOX-1245 Support default module export as @moduleName,

COMMANDBOX-676 Allow commandbox_home to be relative