commandline
commandline copied to clipboard
Configure name, version, and copyright info printed text
I have a C# app composed of multiple projects. The entry point is called CLI.
Following the example on the front page, it looks like I'm forced to print this every time my app is called:
CLI 1.0.0
Copyright (C) 2021 CLI
However I don't want to print the name of the assembly - nor do I want to print copyright info and version info - I'd rather handle that myself.
Is it possible to inject this information? I tried disabling it, but it looks like that will disable the help text also - which isn't what I want. (I tried this https://github.com/commandlineparser/commandline/wiki/Generating-Help-and-Usage-information#overriding-the-default-behavior).
I don't really want to mess with my assembly info just to print the accurate product name.
I find this to be a really odd default behavior.
The HelpText Configuration page has more details on this: https://github.com/commandlineparser/commandline/wiki/HelpText-Configuration
Specifically, the HelpText.AutoBuild method seems to be what you're looking for:
//3- generate help based on result and parameters
var helpText = HelpText.AutoBuild(parserResult, h =>
{
//configure HelpText
h.AdditionalNewLineAfterOption = false; //remove newline between options
h.Heading = "Myapp 2.0.0-beta"; //change header
h.Copyright = "Copyright (c) 2019 Global.com"; //change copyright text
// more options ...
return h;
}, e => e);
PSA: You can also set Heading or Copyright to an empty string ("") to disable them from showing up in the help text.
I think disabling the AutoHelp in order to modify the version and copyright info is not a real solution. With disabled AutoHelp the entire display of available verbs and options and individual help screens for the verbs needs to be reimplemented.
Also: Changing the heading and copyright info in the help screen has no effect for the AutoVersion output. I think it should be possible to easily modify or disable the version output without messing with the AutoHelp functionality.
Further down the HelpText Configuration page I found that you can also just set the name, version and copyright info as AssemblyInfo attributes and it will automatically get picked up from there.
So either in AssemblyInfo.cs:
[assembly: AssemblyTitle("Application Title")]
[assembly: AssemblyCompany("Company")]
[assembly: AssemblyCopyright("Copyright")]
[assembly: AssemblyInformationalVersion("1.0.0-beta")]
Or as part of the project file:
<PropertyGroup>
...
<Copyright>Copyright_text</Copyright>
<Company>Company_text</Company>
<Version>1.2.3-beta</Version>
<AssemblyTitle>title_text</AssemblyTitle>
</PropertyGroup>
I am using the MIT licensed commandline code in a fork of an open sourced MIT licensed project. There shouldn't be a copyright, and having to disable the auto generated help only to generate my own manually without the copyright I think is a very odd workaround. Could these not just be boolean flags instead of setting .HelpWriter to null?
Also combining the suggestions from here and here as
<PropertyGroup>
...
<Copyright></Copyright>
</PropertyGroup>
Still results in the copyright being shown. Also note that from the Visual Studio IDE you cannot assign empty strings as that is what they are by default.
I found such a weird workaround of this.
If I change csproj to have <GenerateAssemblyInfo>false</GenerateAssemblyInfo> I can add my own AssemblyInfo.cs with the following
[assembly: AssemblyTitle("My App")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyCopyright("")]
[assembly: AssemblyInformationalVersion("1.0.0")]
It's a shame, because auto generated AssemblyInfo added a bunch of stuff I wish I had.
Now I just have the weird issue that help is still output while a user just calls --version. Nothing seems to make that want to stop.
I saw this (most likely on the same FAQ):
https://github.com/commandlineparser/commandline/wiki/How-To#q8
Where it suggests:
class ApplicationInfo
{
public static string Version =>HeadingInfo.Default;
public static string Copyright =>CopyrightInfo.Default;
public static void ShowIntro()
{
Console.WriteLine(Version);
Console.WriteLine(Copyright);
}
}
But it does not show it in context with the rest of the application.