github.com/Azure/draft-classic@v0.16.0/cmd/draft/plugin_install.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "io" 6 7 "github.com/spf13/cobra" 8 9 "github.com/Azure/draft/pkg/draft/draftpath" 10 "github.com/Azure/draft/pkg/plugin" 11 "github.com/Azure/draft/pkg/plugin/installer" 12 ) 13 14 type pluginInstallCmd struct { 15 source string 16 version string 17 home draftpath.Home 18 out io.Writer 19 args []string 20 } 21 22 func newPluginInstallCmd(out io.Writer) *cobra.Command { 23 pcmd := &pluginInstallCmd{ 24 out: out, 25 args: []string{"plugin"}, 26 } 27 28 cmd := &cobra.Command{ 29 Use: "install [options] <path|url>...", 30 Short: "install one or more Draft plugins", 31 PreRunE: func(cmd *cobra.Command, args []string) error { 32 return pcmd.complete(args) 33 }, 34 RunE: func(cmd *cobra.Command, args []string) error { 35 return pcmd.run() 36 }, 37 } 38 cmd.Flags().StringVar(&pcmd.version, "version", "", "specify a version constraint. If this is not specified, the latest version is installed") 39 return cmd 40 } 41 42 func (pcmd *pluginInstallCmd) complete(args []string) error { 43 if err := validateArgs(args, pcmd.args); err != nil { 44 return err 45 } 46 pcmd.source = args[0] 47 pcmd.home = draftpath.Home(homePath()) 48 return nil 49 } 50 51 func (pcmd *pluginInstallCmd) run() error { 52 installer.Debug = flagDebug 53 54 i, err := installer.New(pcmd.source, pcmd.version, pcmd.home) 55 if err != nil { 56 return err 57 } 58 59 debug("installing plugin from %s", pcmd.source) 60 if err := installer.Install(i); err != nil { 61 return err 62 } 63 64 debug("loading plugin from %s", i.Path()) 65 p, err := plugin.LoadDir(i.Path()) 66 if err != nil { 67 return err 68 } 69 70 debug("running any install instructions for plugin: %s", p.Metadata.Name) 71 if err := runHook(p, plugin.Install); err != nil { 72 return err 73 } 74 75 fmt.Fprintf(pcmd.out, "Installed plugin: %s\n", p.Metadata.Name) 76 return nil 77 }