Getting Started
The fastest way to get started is to use the built-in Gluegun CLI (very meta!) to generate it.
Creating a new Gluegun-powered CLI
Gluegun works on macOS, Linux, and Windows 10. First, ensure you have Node installed and that you can access it (minimum version 7.6):
$ node --version
We will also be using yarn in this guide rather than npm
. You can use npm
if you want.
Install gluegun
globally.
$ yarn global add gluegun
Next, navigate to the folder you'd like to create your CLI in and generate it.
$ gluegun new mycli
Gluegun will ask if you want to use TypeScript or modern JavaScript:
? Which language would you like to use? (Use arrow keys)
TypeScript - Gives you a build pipeline out of the box (default)
Modern JavaScript - Node 8.2+ and ES2016+ (https://node.green/)
You can also pass in --typescript
or --javascript
(or -t
or -j
for short) to bypass the prompt:
$ gluegun new mycli -t
$ gluegun new mycli -j
Note: We recommend TypeScript, but you don't have to use it! Gluegun works great with modern JavaScript.
Linking your CLI so you can access it
Navigate to the new mycli
folder and run yarn link
to have it available globally on your command line.
$ cd mycli
$ yarn link
$ mycli --help
Creating your first command
Your Gluegun-powered CLI isn't very useful without a command! In your CLI, create a new JS file in src/commands
called hello.js
. In that file, add this:
// src/commands/hello.js
module.exports = {
run: async (toolbox) => {
toolbox.print.info('Hello, world!')
},
}
For TypeScript, it's not much different:
// src/commands/hello.ts
import { GluegunToolbox } from 'gluegun'
module.exports = {
run: async (toolbox: GluegunToolbox) => {
toolbox.print.info('Hello, world!')
},
}
Now run your command:
$ mycli hello
Hello, world!
Yay!
Creating your first extension
You can add more tools into the toolbox
for all of your commands to use by creating an extension
. In your mycli
folder, add a new file in src/extensions
called hello-extension.js
. (It doesn't have to end in -extension
, but that's a convention.)
// src/extensions/hello-extension.js
module.exports = async (toolbox) => {
toolbox.hello = () => {
toolbox.print.info('Hello from an extension!')
}
}
Or TypeScript:
// src/extensions/hello-extension.ts
import { GluegunToolbox } from 'gluegun'
module.exports = async (toolbox: GluegunToolbox) => {
toolbox.hello = () => {
toolbox.print.info('Hello from an extension!')
}
}
Then, in your hello
command, use that function instead:
// src/commands/hello.js
module.exports = {
run: (toolbox) => {
const { hello } = toolbox
hello()
},
}
When you run the command, this time it'll use the extension's output:
$ mycli hello
Hello from an extension!
Note that we sometimes call the toolbox
the context
or the RunContext
. That's just another word for the same thing.
Next steps
There are many more tools in the toolbox than just print.info
. You can generate from a template, manipulate files, hit API endpoints via HTTP, access parameters, run system commands, ask for user input, and much more. Explore the API docs in this folder to learn more or follow a tutorial like Making a Movie CLI.