Merge pull request #1375 from kolyshkin/no-docs
Add `urfave_cli_no_docs` build tag
This commit is contained in:
commit
77fb75adf7
6
.github/workflows/cli.yml
vendored
6
.github/workflows/cli.yml
vendored
@ -37,12 +37,18 @@ jobs:
|
|||||||
- name: vet
|
- name: vet
|
||||||
run: go run internal/build/build.go vet
|
run: go run internal/build/build.go vet
|
||||||
|
|
||||||
|
- name: test with tags
|
||||||
|
run: go run internal/build/build.go -tags urfave_cli_no_docs test
|
||||||
|
|
||||||
- name: test
|
- name: test
|
||||||
run: go run internal/build/build.go test
|
run: go run internal/build/build.go test
|
||||||
|
|
||||||
- name: check-binary-size
|
- name: check-binary-size
|
||||||
run: go run internal/build/build.go check-binary-size
|
run: go run internal/build/build.go check-binary-size
|
||||||
|
|
||||||
|
- name: check-binary-size with tags (informational only)
|
||||||
|
run: go run internal/build/build.go -tags urfave_cli_no_docs check-binary-size || true
|
||||||
|
|
||||||
- name: Upload coverage to Codecov
|
- name: Upload coverage to Codecov
|
||||||
if: success() && matrix.go == '1.18.x' && matrix.os == 'ubuntu-latest'
|
if: success() && matrix.go == '1.18.x' && matrix.os == 'ubuntu-latest'
|
||||||
uses: codecov/codecov-action@v2
|
uses: codecov/codecov-action@v2
|
||||||
|
10
README.md
10
README.md
@ -55,6 +55,16 @@ import (
|
|||||||
...
|
...
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Build tags
|
||||||
|
|
||||||
|
You can use the following build tags:
|
||||||
|
|
||||||
|
#### `urfave_cli_no_docs`
|
||||||
|
|
||||||
|
When set, this removes `ToMarkdown` and `ToMan` methods, so your application
|
||||||
|
won't be able to call those. This reduces the resulting binary size by about
|
||||||
|
300-400 KB (measured using Go 1.18.1 on Linux/amd64), due to less dependencies.
|
||||||
|
|
||||||
### GOPATH
|
### GOPATH
|
||||||
|
|
||||||
Make sure your `PATH` includes the `$GOPATH/bin` directory so your commands can
|
Make sure your `PATH` includes the `$GOPATH/bin` directory so your commands can
|
||||||
|
3
docs.go
3
docs.go
@ -1,3 +1,6 @@
|
|||||||
|
//go:build !urfave_cli_no_docs
|
||||||
|
// +build !urfave_cli_no_docs
|
||||||
|
|
||||||
package cli
|
package cli
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
131
docs_test.go
131
docs_test.go
@ -1,138 +1,13 @@
|
|||||||
|
//go:build !urfave_cli_no_docs
|
||||||
|
// +build !urfave_cli_no_docs
|
||||||
|
|
||||||
package cli
|
package cli
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
|
||||||
"errors"
|
"errors"
|
||||||
"io/ioutil"
|
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
func testApp() *App {
|
|
||||||
app := newTestApp()
|
|
||||||
app.Name = "greet"
|
|
||||||
app.Flags = []Flag{
|
|
||||||
&StringFlag{
|
|
||||||
Name: "socket",
|
|
||||||
Aliases: []string{"s"},
|
|
||||||
Usage: "some 'usage' text",
|
|
||||||
Value: "value",
|
|
||||||
TakesFile: true,
|
|
||||||
},
|
|
||||||
&StringFlag{Name: "flag", Aliases: []string{"fl", "f"}},
|
|
||||||
&BoolFlag{
|
|
||||||
Name: "another-flag",
|
|
||||||
Aliases: []string{"b"},
|
|
||||||
Usage: "another usage text",
|
|
||||||
},
|
|
||||||
&BoolFlag{
|
|
||||||
Name: "hidden-flag",
|
|
||||||
Hidden: true,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
app.Commands = []*Command{{
|
|
||||||
Aliases: []string{"c"},
|
|
||||||
Flags: []Flag{
|
|
||||||
&StringFlag{
|
|
||||||
Name: "flag",
|
|
||||||
Aliases: []string{"fl", "f"},
|
|
||||||
TakesFile: true,
|
|
||||||
},
|
|
||||||
&BoolFlag{
|
|
||||||
Name: "another-flag",
|
|
||||||
Aliases: []string{"b"},
|
|
||||||
Usage: "another usage text",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
Name: "config",
|
|
||||||
Usage: "another usage test",
|
|
||||||
Subcommands: []*Command{{
|
|
||||||
Aliases: []string{"s", "ss"},
|
|
||||||
Flags: []Flag{
|
|
||||||
&StringFlag{Name: "sub-flag", Aliases: []string{"sub-fl", "s"}},
|
|
||||||
&BoolFlag{
|
|
||||||
Name: "sub-command-flag",
|
|
||||||
Aliases: []string{"s"},
|
|
||||||
Usage: "some usage text",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
Name: "sub-config",
|
|
||||||
Usage: "another usage test",
|
|
||||||
}},
|
|
||||||
}, {
|
|
||||||
Aliases: []string{"i", "in"},
|
|
||||||
Name: "info",
|
|
||||||
Usage: "retrieve generic information",
|
|
||||||
}, {
|
|
||||||
Name: "some-command",
|
|
||||||
}, {
|
|
||||||
Name: "hidden-command",
|
|
||||||
Hidden: true,
|
|
||||||
}, {
|
|
||||||
Aliases: []string{"u"},
|
|
||||||
Flags: []Flag{
|
|
||||||
&StringFlag{
|
|
||||||
Name: "flag",
|
|
||||||
Aliases: []string{"fl", "f"},
|
|
||||||
TakesFile: true,
|
|
||||||
},
|
|
||||||
&BoolFlag{
|
|
||||||
Name: "another-flag",
|
|
||||||
Aliases: []string{"b"},
|
|
||||||
Usage: "another usage text",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
Name: "usage",
|
|
||||||
Usage: "standard usage text",
|
|
||||||
UsageText: `
|
|
||||||
Usage for the usage text
|
|
||||||
- formatted: Based on the specified ConfigMap and summon secrets.yml
|
|
||||||
- list: Inspect the environment for a specific process running on a Pod
|
|
||||||
- for_effect: Compare 'namespace' environment with 'local'
|
|
||||||
|
|
||||||
` + "```" + `
|
|
||||||
func() { ... }
|
|
||||||
` + "```" + `
|
|
||||||
|
|
||||||
Should be a part of the same code block
|
|
||||||
`,
|
|
||||||
Subcommands: []*Command{{
|
|
||||||
Aliases: []string{"su"},
|
|
||||||
Flags: []Flag{
|
|
||||||
&BoolFlag{
|
|
||||||
Name: "sub-command-flag",
|
|
||||||
Aliases: []string{"s"},
|
|
||||||
Usage: "some usage text",
|
|
||||||
},
|
|
||||||
&StringFlag{
|
|
||||||
Name: "sub-command-hidden-flag",
|
|
||||||
Usage: "some hidden usage text",
|
|
||||||
Hidden: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
Name: "sub-usage",
|
|
||||||
Usage: "standard usage text",
|
|
||||||
UsageText: "Single line of UsageText",
|
|
||||||
}},
|
|
||||||
}}
|
|
||||||
app.UsageText = "app [first_arg] [second_arg]"
|
|
||||||
app.Description = `Description of the application.`
|
|
||||||
app.Usage = "Some app"
|
|
||||||
app.Authors = []*Author{
|
|
||||||
{Name: "Harrison", Email: "harrison@lolwut.com"},
|
|
||||||
{Name: "Oliver Allen", Email: "oliver@toyshop.com"},
|
|
||||||
}
|
|
||||||
return app
|
|
||||||
}
|
|
||||||
|
|
||||||
func expectFileContent(t *testing.T, file, got string) {
|
|
||||||
data, err := ioutil.ReadFile(file)
|
|
||||||
// Ignore windows line endings
|
|
||||||
// TODO: Replace with bytes.ReplaceAll when support for Go 1.11 is dropped
|
|
||||||
data = bytes.Replace(data, []byte("\r\n"), []byte("\n"), -1)
|
|
||||||
expect(t, err, nil)
|
|
||||||
expect(t, got, string(data))
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestToMarkdownFull(t *testing.T) {
|
func TestToMarkdownFull(t *testing.T) {
|
||||||
// Given
|
// Given
|
||||||
app := testApp()
|
app := testApp()
|
||||||
|
123
fish_test.go
123
fish_test.go
@ -1,6 +1,8 @@
|
|||||||
package cli
|
package cli
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
|
"io/ioutil"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -19,3 +21,124 @@ func TestFishCompletion(t *testing.T) {
|
|||||||
expect(t, err, nil)
|
expect(t, err, nil)
|
||||||
expectFileContent(t, "testdata/expected-fish-full.fish", res)
|
expectFileContent(t, "testdata/expected-fish-full.fish", res)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func testApp() *App {
|
||||||
|
app := newTestApp()
|
||||||
|
app.Name = "greet"
|
||||||
|
app.Flags = []Flag{
|
||||||
|
&StringFlag{
|
||||||
|
Name: "socket",
|
||||||
|
Aliases: []string{"s"},
|
||||||
|
Usage: "some 'usage' text",
|
||||||
|
Value: "value",
|
||||||
|
TakesFile: true,
|
||||||
|
},
|
||||||
|
&StringFlag{Name: "flag", Aliases: []string{"fl", "f"}},
|
||||||
|
&BoolFlag{
|
||||||
|
Name: "another-flag",
|
||||||
|
Aliases: []string{"b"},
|
||||||
|
Usage: "another usage text",
|
||||||
|
},
|
||||||
|
&BoolFlag{
|
||||||
|
Name: "hidden-flag",
|
||||||
|
Hidden: true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
app.Commands = []*Command{{
|
||||||
|
Aliases: []string{"c"},
|
||||||
|
Flags: []Flag{
|
||||||
|
&StringFlag{
|
||||||
|
Name: "flag",
|
||||||
|
Aliases: []string{"fl", "f"},
|
||||||
|
TakesFile: true,
|
||||||
|
},
|
||||||
|
&BoolFlag{
|
||||||
|
Name: "another-flag",
|
||||||
|
Aliases: []string{"b"},
|
||||||
|
Usage: "another usage text",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Name: "config",
|
||||||
|
Usage: "another usage test",
|
||||||
|
Subcommands: []*Command{{
|
||||||
|
Aliases: []string{"s", "ss"},
|
||||||
|
Flags: []Flag{
|
||||||
|
&StringFlag{Name: "sub-flag", Aliases: []string{"sub-fl", "s"}},
|
||||||
|
&BoolFlag{
|
||||||
|
Name: "sub-command-flag",
|
||||||
|
Aliases: []string{"s"},
|
||||||
|
Usage: "some usage text",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Name: "sub-config",
|
||||||
|
Usage: "another usage test",
|
||||||
|
}},
|
||||||
|
}, {
|
||||||
|
Aliases: []string{"i", "in"},
|
||||||
|
Name: "info",
|
||||||
|
Usage: "retrieve generic information",
|
||||||
|
}, {
|
||||||
|
Name: "some-command",
|
||||||
|
}, {
|
||||||
|
Name: "hidden-command",
|
||||||
|
Hidden: true,
|
||||||
|
}, {
|
||||||
|
Aliases: []string{"u"},
|
||||||
|
Flags: []Flag{
|
||||||
|
&StringFlag{
|
||||||
|
Name: "flag",
|
||||||
|
Aliases: []string{"fl", "f"},
|
||||||
|
TakesFile: true,
|
||||||
|
},
|
||||||
|
&BoolFlag{
|
||||||
|
Name: "another-flag",
|
||||||
|
Aliases: []string{"b"},
|
||||||
|
Usage: "another usage text",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Name: "usage",
|
||||||
|
Usage: "standard usage text",
|
||||||
|
UsageText: `
|
||||||
|
Usage for the usage text
|
||||||
|
- formatted: Based on the specified ConfigMap and summon secrets.yml
|
||||||
|
- list: Inspect the environment for a specific process running on a Pod
|
||||||
|
- for_effect: Compare 'namespace' environment with 'local'
|
||||||
|
|
||||||
|
` + "```" + `
|
||||||
|
func() { ... }
|
||||||
|
` + "```" + `
|
||||||
|
|
||||||
|
Should be a part of the same code block
|
||||||
|
`,
|
||||||
|
Subcommands: []*Command{{
|
||||||
|
Aliases: []string{"su"},
|
||||||
|
Flags: []Flag{
|
||||||
|
&BoolFlag{
|
||||||
|
Name: "sub-command-flag",
|
||||||
|
Aliases: []string{"s"},
|
||||||
|
Usage: "some usage text",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Name: "sub-usage",
|
||||||
|
Usage: "standard usage text",
|
||||||
|
UsageText: "Single line of UsageText",
|
||||||
|
}},
|
||||||
|
}}
|
||||||
|
app.UsageText = "app [first_arg] [second_arg]"
|
||||||
|
app.Description = `Description of the application.`
|
||||||
|
app.Usage = "Some app"
|
||||||
|
app.Authors = []*Author{
|
||||||
|
{Name: "Harrison", Email: "harrison@lolwut.com"},
|
||||||
|
{Name: "Oliver Allen", Email: "oliver@toyshop.com"},
|
||||||
|
}
|
||||||
|
return app
|
||||||
|
}
|
||||||
|
|
||||||
|
func expectFileContent(t *testing.T, file, got string) {
|
||||||
|
data, err := ioutil.ReadFile(file)
|
||||||
|
// Ignore windows line endings
|
||||||
|
// TODO: Replace with bytes.ReplaceAll when support for Go 1.11 is dropped
|
||||||
|
data = bytes.Replace(data, []byte("\r\n"), []byte("\n"), -1)
|
||||||
|
expect(t, err, nil)
|
||||||
|
expect(t, got, string(data))
|
||||||
|
}
|
||||||
|
@ -46,6 +46,12 @@ func main() {
|
|||||||
Action: checkBinarySizeActionFunc,
|
Action: checkBinarySizeActionFunc,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
app.Flags = []cli.Flag{
|
||||||
|
&cli.StringFlag{
|
||||||
|
Name: "tags",
|
||||||
|
Usage: "set build tags",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
err := app.Run(os.Args)
|
err := app.Run(os.Args)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -68,6 +74,8 @@ func VetActionFunc(_ *cli.Context) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestActionFunc(c *cli.Context) error {
|
func TestActionFunc(c *cli.Context) error {
|
||||||
|
tags := c.String("tags")
|
||||||
|
|
||||||
for _, pkg := range packages {
|
for _, pkg := range packages {
|
||||||
var packageName string
|
var packageName string
|
||||||
|
|
||||||
@ -79,7 +87,7 @@ func TestActionFunc(c *cli.Context) error {
|
|||||||
|
|
||||||
coverProfile := fmt.Sprintf("--coverprofile=%s.coverprofile", pkg)
|
coverProfile := fmt.Sprintf("--coverprofile=%s.coverprofile", pkg)
|
||||||
|
|
||||||
err := runCmd("go", "test", "-v", coverProfile, packageName)
|
err := runCmd("go", "test", "-tags", tags, "-v", coverProfile, packageName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -201,14 +209,16 @@ func checkBinarySizeActionFunc(c *cli.Context) (err error) {
|
|||||||
mbStringFormatter = "%.1fMB"
|
mbStringFormatter = "%.1fMB"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
tags := c.String("tags")
|
||||||
|
|
||||||
// get cli example size
|
// get cli example size
|
||||||
cliSize, err := getSize(cliSourceFilePath, cliBuiltFilePath)
|
cliSize, err := getSize(cliSourceFilePath, cliBuiltFilePath, tags)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// get hello world size
|
// get hello world size
|
||||||
helloSize, err := getSize(helloSourceFilePath, helloBuiltFilePath)
|
helloSize, err := getSize(helloSourceFilePath, helloBuiltFilePath, tags)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -270,9 +280,9 @@ func checkBinarySizeActionFunc(c *cli.Context) (err error) {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func getSize(sourcePath string, builtPath string) (size int64, err error) {
|
func getSize(sourcePath string, builtPath string, tags string) (size int64, err error) {
|
||||||
// build example binary
|
// build example binary
|
||||||
err = runCmd("go", "build", "-o", builtPath, "-ldflags", "-s -w", sourcePath)
|
err = runCmd("go", "build", "-tags", tags, "-o", builtPath, "-ldflags", "-s -w", sourcePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println("issue getting size for example binary")
|
fmt.Println("issue getting size for example binary")
|
||||||
return 0, err
|
return 0, err
|
||||||
|
Loading…
Reference in New Issue
Block a user