Sometimes you still want to support the API and quick developer experience of a single command, while still supporting multi commands in your CLI. This is handy when, for example, you want your user to do something useful with just npx mycli
.
Here's a quick hack that lets you do that, while also deepening your understanding of how your CLI works with TypeScript, Node.js and Oclif under the hood.
If we have multi commands, when we run:
yarn mycli
It will just list all the commands we have here:
Now, let's say, we want to set 'init' command as default command.
What we can do:
// bin/run.js #!/usr/bin/env node const fs = require('fs') const path = require('path') const project = path.join(__dirname, '../tsconfig.json') const dev = fs.existsSync(project) if (dev) { require('ts-node').register({project}) } const recongnizedCommand = ['init', 'build'] if (process.argv.length > 2 && recongnizedCommand.includes(process.argv[2])) { require(`../${dev ? 'src' : 'lib'}`).run() .catch(require('@oclif/errors/handle')) } else { require(`../${dev ? 'src' : 'lib'}/commands/init`).run() .catch(require('@oclif/errors/handle')) }
Now, if we just run:
yarn mycli // the same as yarn mycli init