Skip to content

Allow linker to perform deadcode elimination for programs using kingpin#365

Open
rosstimothy wants to merge 1 commit intoalecthomas:masterfrom
rosstimothy:tross/dead_code
Open

Allow linker to perform deadcode elimination for programs using kingpin#365
rosstimothy wants to merge 1 commit intoalecthomas:masterfrom
rosstimothy:tross/dead_code

Conversation

@rosstimothy
Copy link
Copy Markdown

This was largely inspired by spf13/cobra#1956.

The usage rendering relied on text/template which in turn relied on reflect.MethodByName. As a result, Go's deadcode elimination is prevented from running, and thus means any downstream consumers of kingpin also cannot take advantage of deadcode elimination.

This changes the usage rendering of kingpin such that text/template is not used by default. The existing templates were converted into pure Go functions, and an extensive test suite was added to ensure equality with the legacy templates. Default applications now use the pure Go equivalent of kingpin.DefaultUsageTemplate. The existing UsageTemplate and UsageFuncs APIs remain intact to preserve compatibility. Any use of either API will result in text/template rendering usage and preventing deadcode elimination.

The basic app used in TestDeadCodeElimination was tested before and after this change. The usage text remained the same, but the binary size shrunk from ~5MB to ~2MB.

This was largely inspired by spf13/cobra#1956.

The usage rendering relied on text/template which in turn relied on
reflect.MethodByName. As a result, Go's deadcode elimination is
prevented from running, and thus means any downstream consumers of
kingpin also cannot take advantage of deadcode elimination.

This changes the usage rendering of kingpin such that text/template
is not used by default. The existing templates were converted into
pure Go functions, and an extensive test suite was added to ensure
equality with the legacy templates. Default applications now use
the pure Go equivalent of kingpin.DefaultUsageTemplate. The existing
UsageTemplate and UsageFuncs APIs remain intact to preserve compatibility.
Any use of either API will result in text/template rendering usage
and preventing deadcode elimination.

The basic app used in TestDeadCodeElimination was tested before and
after this change. The usage text remained the same, but the binary
size shrunk from ~5MB to ~2MB.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant