Upgrade to Pro — share decks privately, control downloads, hide ads and more …

We want AWESOME CLI tool & development

We want AWESOME CLI tool & development

micnncim

May 18, 2019
Tweet

More Decks by micnncim

Other Decks in Programming

Transcript

  1. We want AWESOME CLI
    tool & development
    Go Conference 2019 Spring
    @micnncim

    View Slide

  2. $ whoami
    @micnncim @micnncim
    University Student (CS/B4)
    No Job (Welcome job opportunity!)
    Blog: https://micnncim.github.io/

    View Slide

  3. CLI, UNIX, Go

    View Slide

  4. View Slide

  5. A Quarter-Century of Unix (1994)
    Write programs that do one thing and do it well.
    Write programs to work together.
    Write programs to handle text streams,
    because that is a universal interface.

    View Slide

  6. Why Go for CLI?


    View Slide

  7. What component?
    ば Argument/Flag/(Subcommand)
    ば I/O (Standard Stream)
    ば Exit Code

    View Slide

  8. What needed for awesome CLI?
    ば UX/DX




    View Slide

  9. Design and Test CLI

    View Slide

  10. Design & Test I/O
    ば fmt.Println()
    Testable
    ば io.Writer
    ば I/O interface

    View Slide

  11. Design I/O

    View Slide

  12. Test I/O

    View Slide

  13. Design I/O

    View Slide

  14. Design I/O
    From github/hub

    View Slide

  15. Design I/O
    From mitchellh/cli

    View Slide

  16. Test I/O
    ば bytes.Bu er

    View Slide

  17. Handling Exit Code
    ば error Exit Code 0
    ば Exit Code
    ば Exit Code error type

    View Slide

  18. Handling Exit Code
    From github/hub

    View Slide

  19. Test with golden files
    ば ( )
    .golden

    API .golden

    View Slide

  20. Test with golden files

    View Slide

  21. Test with golden files
    ば testdata/expect.golden

    View Slide

  22. Test with golden files

    View Slide

  23. Cross Platform

    View Slide

  24. Support Cross Platform
    ば Go Linux/macOS/Windows
    ば Utility

    View Slide

  25. Pkgs for Cross Platform
    ば Home Directory: mitchellh/go-homedir
    ば Open ( | URL): skratchdot/open-golang
    ば Color: mattn/go-colorable

    View Slide

  26. Pkgs for Cross Platform
    From
    mitchellh/go-homedir

    View Slide

  27. Build & Release CLI

    View Slide

  28. Build & Release
    ば $ go get potentially unstable, Go
    ば GitHub Release curl + tar + chmod?

    View Slide

  29. Build & Release
    ば mitchellh/gox:
    ば tcnksm/ghr:
    ば goreleaser/goreleaser:
    , , etc.

    View Slide

  30. GoReleaser
    ば YAML
    ば Homebrew
    ば CI easy

    View Slide

  31. GoReleaser: Build
    ば YAML

    DX

    View Slide

  32. GoReleaser: Changelog
    ば Changelog
    = UX

    View Slide

  33. GoReleaser: Package Manager
    ば Formula

    DX
    ば UX

    View Slide

  34. CI/CD
    ば tag push CI

    View Slide

  35. CI/CD
    ば GoReleaser dead simple
    GoReleaser dead simple

    View Slide

  36. Update

    ば CLI GUI
    ば rhysd/go-github-selfupdate tj/go-update

    View Slide

  37. Auto Update

    View Slide

  38. Document CLI

    View Slide

  39. Documentation
    ば Go
    ( | )

    ば ( )

    View Slide

  40. Demo
    ば GIF? SVG?
    ば troublesome
    ば asciinema + (asciicast2gif | svg-term-cli)

    View Slide

  41. Demo

    View Slide

  42. Develop Rich CLI

    View Slide

  43. Awesome CLI packages
    ば All in One
    ば Flag Parser
    ば Standard Stream
    ば Progress UI
    ば Con guration

    View Slide

  44. All in One
    ば urfave/cli 10,714
    ば spf13/cobra 11,958
    ば mitchellh/cli 966
    , ,
    , etc.

    View Slide

  45. All in One

    View Slide

  46. Flag Parser
    ば alecthomas/kingpin 2,431
    ば jessevdk/go- ags 1,458
    ,
    , ag/argument,
    ag parse

    View Slide

  47. Flag Parser

    View Slide

  48. Standard Stream
    ば manifoldco/promptui 2,803
    ば AlecAivazis/survey 1,144
    validation,
    Select, Con rm, Password UI
    UX Stdin UI
    Utility

    View Slide

  49. Standard Stream

    View Slide

  50. Progress UI
    ば cheggaaa/pb 1,878
    ば gosuri/uiprogress 1,400
    ば briandowns/spinner 734
    I/O ,
    Spinner UI

    View Slide

  51. Progress UI

    View Slide

  52. Configuration
    ば spf13/viper 8,467
    JSON/TOML/YAML/HCL
    Con g ,
    , Path

    View Slide

  53. Example

    View Slide

  54. micnncim/bitbrew
    ✔ Document, Demo

    View Slide

  55. micnncim/bitbrew

    View Slide

  56. micnncim/bitbrew

    View Slide

  57. micnncim/bitbrew
    ✔ Testable I/O

    View Slide

  58. micnncim/bitbrew
    ✔ Con g

    View Slide

  59. micnncim/bitbrew
    ✔ Rich UI

    View Slide

  60. micnncim/bitbrew
    ✔ Installation

    View Slide

  61. See also
    ば golang/go
    ば hashicorp/consul, terraform, nomad, packer, etc.

    View Slide

  62. @micnncim
    Thank you!

    View Slide