Project CommandBox (Gideon): The CFML CLI, Package Manager and REPL
So at Into The Box this week we unveiled our latest here at Ortus that we've been calling project Gideon. I'll note now that I'm blogging this to the Ortus blog because this is not beholden to the ColdBox MVC platform, but a new general tool we hope to help color the CFML developer's toolbox with. Of course, even though this is a general tool aimed at the CFML community, you can bet your bippy we're cooking up some sweet Box love for our existing libraries.
CommandBox is a standalone, native tool that will have binaries 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. We are working on a number of command namespaces to easily interact with 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.
So one of the biggest things we think the CFML community is missing is a true package management platform. With this in mind, we are going to be reworking ForgeBox this year and opening it up to the entire community. 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. Hand in hand with this move, is the complete modularization of the ColdBox platform. 75% of its code has been stripped from the core, and moved into modules on ForgeBox. 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. We want the community to follow in this manner, and if they aren't writing modules for ColdBox (which are getting some sweet new features in ColdBox 4) at least start writing package-able CF code that can be distributed in a consistent and scriptable manner.
CommandBox will have tons of command 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.
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 "start" and a super fast Railo server spins up on a new port running your code. When you're done type "stop" from that directory or use the little icon that's showed up in your system tray.
Whiz Bang Cool
So one of the most interesting things about this entire project is that the actual commands are written in CFML itself! CommandBox is small, lightweight, integrated at the operating system level, but actually running on CFML at the same time. This means you will eventually be able to extend it with your own commands that do cool stuff for a different framework, or automate repetitive tasks you're tired of doing every day. All the code for CommandBox is open source and already available on GitHub. Tonight I did an informal demo of CommandBox to a BOF here at cf.Objective(). I recorded it on Connect. I start out talking a bit about ColdBox 4 and ForgeBox, but just stick with me-- I'm laying the groundwork to help paint the bigger picture we're trying to achieve here at Ortus. We're really trying to push the CFML world forward with tools no one else is making that fall into a bigger picture of productivity, automation, and modular applications. We hope to have an alpha out in the next week or so to play with and provide your feedback. Watch the 20 minute recording below and then fire off your thoughts in the comments.
Add Your Comment
May 16, 2014 22:10:18 UTC
by Sean Corfield
This looks absolutely awesome! As you can see from Github and JIRA, I've been trying this out and ran into a few issues / questions, but I'm very excited about adding FW/1 command support and, ultimately, some FW/1 packages when you open up the package manager!
May 19, 2014 20:50:43 UTC
by Luis Majano
Thanks Sean! Really appreciate it. We definitely need help testing and helping us extend it. As for registration, you might want to add your projects to ForgeBox now. Can you give me some recommendations on category types to create? This way you can test your contributions until we can decouple the site in the coming months.
May 22, 2014 00:55:05 UTC
by Daniel Mejia
This is a sweet tool. I love that I can spin up a test server quickly. So I cloned the repo and ran box-cli build.cli.all, then I added ~/Development/programs/box-cli/dist/cli/ to /etc/paths.d/commandbox and now I can run "box" from anywhere in command line. Should I not get used to this setup? Is the near future going to install it all for me in some default directory? Or will it be better to not install commandbox globally and include it in the source of the app as a dev dependancy? Would it be better if we didn't have to go INTO commandbox by typing "box" and instead: dev:~ danielmejia$ box server start dev:~ danielmejia$ box coldbox create app OR box install coldbox-platform dev:~ danielmejia$ box init Then leaving cd, clear, ls, mkdir etc for system to handle. Would like to hear your thoughts?
May 22, 2014 12:33:43 UTC
by Daniel Mejia
Ok, so apperantly I can startup the server with one command "box server start", instead of just "box" then waiting for that namespace to load then typing "server start". Sweet. I can't find a way to start up the server using a configuration file that will configure my mail settings, datasource settings and mappings. In ServerService.cfc I would like to be able to supply a --config argument that points to my configuration file, json preferrably. Actually, the --config argument would be passed in from cfml/commands/server/start.cfc manager.start(arguments.config); So my start command would look like this: $ box server start --config "server.config.json"
Jun 04, 2014 14:18:49 UTC
by Gareth Arch
How/where should we log issues? I've fixed and committed some things, but wanted to make sure I keep track of things I've found so I can perhaps look into them later or make them known to others if they run into them.
Jun 05, 2014 07:37:04 UTC
Awesome, REPL is a long due wishlist item of lot of CFML devs. Thanks a lot ColdBox team for this project.
Jun 05, 2014 10:16:33 UTC
by Brad Wood
@Gareth, I'm glad to see you've already being playing with CommandBox. Our ticket tracker for it is here: https://ortussolutions.atlassian.net/browse/COMMANDBOX/ If you don't have an account, you can sign up for a free one with the register link under the login fields. There are still a lot of things changing as we massage the project into shape. We'll be putting our an official alpha or beta release soon.
Jun 06, 2014 18:22:06 UTC
by Paul Klinkenberg
Congratulations guys, this is a big step forward. Totally agree a package manager is/was a big missing item in the CFML world. Keep up the good work :)
Jun 10, 2014 07:57:37 UTC
by Gareth Arch
@Brad, Thanks. I must be a little slow, but I don't see a spot to actual create an issue. I didn't previously have an account, so I created that, but I'm unsure how to create the issue.
Jun 26, 2014 19:29:40 UTC
by Jeff Peters
Bravo, Luis et al! Just bounced over here from Ray's tweet--I can see you've continued at your usual breakneck pace. Having recently surfaced from a federal project that monopolized my time for several years, I'm enjoying seeing what's been happening in the outside world. As an long-time CLI guy, I'm definitely diggin' CommandBox.
Jun 26, 2014 21:40:28 UTC
by Luis Majano
Thanks Jeff! We are trying! Would love your feedback
Jul 01, 2014 14:04:23 UTC
by Jeff Davis
I set up Jenkins to pull the package and build it on my laptop and, sweeeet! it works! I've played around with creating apps, etc. and am really excited about the capabilities. So next commit you make to github, I'll get to see the package update itself! I'm excited about everything, but most want to try to create a package myself. I want to be able to use a local server as the repository as well as Forgebox.... in other words public and private packages... Thanks Louis, Brad, the whole team!
Jul 13, 2014 09:47:29 UTC
by Alex Sante
Luis this looks and sounds great! It's definitely something I've been wanting for a long time, and look forward to incorporating it into my daily workflow. Thanks for pushing CF in the right direction.
Jul 16, 2015 11:45:56 UTC
by Chris Walker
Game changer. We just re-started our dying 20 year old CFUG with teaching members how to leverage the CF backend with cool frameworks like Angular. And we are getting traction. All the time, I've been thinking...If only I could get Railo in embedded systems. BOOM! Goes the dynamite!