75lb / command-line-args

A mature, feature-complete library to parse command-line options.
MIT License
679 stars 107 forks source link

Support Electron process.argv structure, prevent first arg being lost #103

Open mattdwen opened 5 years ago

mattdwen commented 5 years ago

I'm running v5.1.1 in an Electron app.

I have the following code

const optionDefinitions = [
  { name: 'debug', type: Boolean },
  { name: 'divafsDisable', type: Boolean },
  { name: 'serve', type: Boolean }
];
const options = commandLineArgs(optionDefinitions);

console.error('options', options);
console.error('argv', process.argv);

I am then executing:

C:\Projects\diva4\dist\client\win-unpacked\DIVAClient.exe --debug --divafsDisable

And I get the following output:

options { divafsDisable: true }
argv [ 'C:\\Projects\\diva4\\dist\\client\\win-unpacked\\DIVAClient.exe',
  '--debug',
  '--divafsDisable' ]

If I pass just a single argument then the options has no properties defined.

I've also tried directly passing in process.argv with the same result.

mattdwen commented 5 years ago

If I use:

const options = commandLineArgs(optionDefinitions, {
  argv: process.argv.slice(1)
});

then it's working.

I wonder if it's something around https://github.com/75lb/command-line-args/blob/master/lib/argv-tools.mjs#L40 which is causing it with the default argv? When I check process.execArgv it's empty, which would cause those first two arguments to be spliced out.

75lb commented 5 years ago

yes, it's probably to do with that line.

It's because process.argv almost always contains node and the script name as the first two items, e.g. [ 'node', 'example.js', '--help' ]. I think you have found a case (Electron) where this is not true.

As you've discovered, passing in your own argv array works around this issue and I'll take a look into other options, too. If there is a reliable way of detecting command-line-args is running within an Electron app, and Electron apps only ever need one arg trimming from the front of process.argv and not two then we could put a permanent fix in.