Command Line Interface Arguments

Eksempler på forskellige måder at man kan bruge argumenter fra kommandolinjen til at påvirke afviklingen af et program.

Simpel brug af CLI argumenter

Kommandolinje argumenter kan f.eks. benyttes således

const args = process.argv.slice(2)
console.log(args)

if(1 == args.length){
  const name = args[0]
  console.log(`Hello, ${name}!`)
} else {
  console.log("Hello, world!")  
}

Programmet giver dette output ved afvikling af med forskellig input argumenter.

$ node cli-args-demo.js
[]
Hello, world!
$ node cli-args-demo.js Bjarne
[ 'Bjarne' ]
Hello, Bjarne!
$ node cli-args-demo.js Finn, Find og Bjarne
[ 'Finn', 'Find', 'og', 'Bjarne' ]
Hello, world!

Minimist pakken

Det kan være fordelagtigt at benytte npm pakken minimist, hvis der er brug for mere end de aller simpleste argumenter. Det gør det langt nemmere at parse indholdet in i variabler, der kan benyttes i programmet.

const args = require('minimist')(process.argv.slice(2))
args['name']

console.log(args)

if(args.name !== undefined){
  console.log(`Hello, ${args.name}!`)
} else {
  console.log("Hello, world!")  
}

Her er et eksempel på output fra programmet.

$ node cli-minimist-demo.js
{ _: [] }
Hello, world!
$ node cli-minimist-demo.js Bjarne
{ _: [ 'Bjarne' ] }
Hello, world!
$ node cli-minimist-demo.js Finn, Find og Bjarne
{ _: [ 'Finn', 'Find', 'og', 'Bjarne' ] }
Hello, world!
$ node cli-minimist-demo.js Find --name=Bjarne og Finn
{ _: [ 'Find', 'og', 'Finn' ], name: 'Bjarne' }
Hello, Bjarne!

Husk at installere minimist inden eksemplet køres, med kommandoen nmp install minimist

Yargs pakken

Er der brug for mere avanceret håndtering af argumenter på kommandolinjen, kan man benytte npm pakken yargs. Det giver blandt andet mulighed for at tilknytte beskrivelser, typer og aliaser for de forskellige argumenter.

Her er et eksempel på håndtering af mere indviklede argumenter på kommandolinjen.

const yargs = require('yargs');

const argv = yargs
  .command('lyr', 'Tells whether an year is leap year or not', {
    year: {
      description: 'the year to check for',
      alias: 'y',
      type: 'number',
    }
  })
  .option('time', {
    alias: 't',
    description: 'Tell the present Time',
    type: 'boolean',
  })
  .help()
  .alias('help', 'h')
  .argv;

if (argv.time) {
  console.log('The current time is: ', new Date().toLocaleTimeString());
}

if (argv._.includes('lyr')) {
  const year = argv.year || new Date().getFullYear();
  if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) {
    console.log(`${year} is a Leap Year`);
  } else {
    console.log(`${year} is NOT a Leap Year`);
  }
}

console.log(argv);

For at kunne køre eksemplet kræver det at pakken yargs er installeret, hvilket kan gøres med kommandoen npm i yargs.

Her er indholdet af package.json.

{
  "name": "cli-args",
  "version": "1.0.0",
  "description": "",
  "main": "cli-yargs-demo.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "yargs": "^17.2.1"
  }
}

Her er et eksempel på output fra programmet.

$ node cli-yargs-demo.js       
{ _: [], '$0': 'cli-yargs-demo.js' }
$ node cli-yargs-demo.js -h    
cli-yargs-demo.js [command]

Commands:
  cli-yargs-demo.js lyr  Tells whether an year is leap year or not

      --version  Show version number                                   [boolean]
  -t, --time     Tell the present Time                                 [boolean]
$ node cli-yargs-demo.js --version
1.0.0
$ node cli-yargs-demo.js --help lyr
cli-yargs-demo.js lyr


Options:
      --version  Show version number                                   [boolean]
  -t, --time     Tell the present Time                                 [boolean]
  -h, --help     Show help                                             [boolean]
  -y, --year     the year to check for                                  [number]
$ node cli-yargs-demo.js lyr       
2021 is NOT a Leap Year
{ _: [ 'lyr' ], '$0': 'cli-yargs-demo.js' }
$ node cli-yargs-demo.js lyr --time
The current time is:  22.48.45
2021 is NOT a Leap Year
{ _: [ 'lyr' ], time: true, t: true, '$0': 'cli-yargs-demo.js' }
$ node cli-yargs-demo.js lyr --time -y 3000
The current time is:  22.48.59
3000 is NOT a Leap Year
{
  _: [ 'lyr' ],
  time: true,
  t: true,
  y: 3000,
  year: 3000,
  '$0': 'cli-yargs-demo.js'
}

Materiale