We recently went through this same decision. In the end, we settled on using Gulp which is a Javascript-based task runner that you use in development and my recommendation is that you do the same. Gulp has a huge community and userbase and tons of plugins. It can watch files for changes as you develop and automatically re-concatenate, minify (and about 1000 other things - see http://gulpjs.com/plugins/).
Using a Gulp plugin called gulp-rev, files are automatically renamed, like file-k34jzkl3.css, to bust browser caches when changes are made. Using another gulp plugin, gulp-manifest, we automatically generate a JSON file that maps the original CSS file to the cachebusted name (e.g., "file.css": "file-k34jzkl3.css") and then we have a simple CFC that translates those names in the right place in our HTML. This is what our manifest JSON file looks like:
{
"baseline.css": "/global/baseline-82bcd2ab92.css",
"user.css": "/global/user-0d1d32170c.css"
}
And then our CFML markup looks like this:
<link rel="stylesheet" href="#application.asset.getAsset("baseline.css")#">
Which generates HTML output like:
<link rel="stylesheet" href="/global/baseline-82bcd2ab92.css">
I created a repo with the code at https://github.com/ghidinelli/assets.cfc