Skip to content

Fiery/go-run

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

go-run

Running system program with calls chained together, inspired by gulp.js.

Inspired by godo and created as a plugin for belt task runner

GoDoc

Quick Start

As a quick overview of usages, below shows an example of how to use run in general.

go-run runs independently, means that you can import it and use it anywhere you want

package main

import (
    "fmt"
    run "github.com/Fiery/go-run"
)

func main(){
    // set local env, use "::" as cross-platform path list separator
    run.Set(`GOPATH=./lib/::$GOPATH`)
    // simply executes shell command with local and global envs
    run.Shell("echo Hello $USER!").Run()


    // You could also specify local envs in command line strings, just as how you type in shell
    run.Call("GOOS=linux GOARCH=amd64 go build").Run()

    // In allows you to temporarily change to the specified folder and run
    run.Shell("bash","script.sh").In("project").Run()

    // Pipe the Stdout (and/or Stderr) to evaluate later
    var output = bytes.Buffer
    run.Call("echo Just run it!").Pipe(run.Stdout|run.Stderr, output).Run()
    fmt.Println(output.String())


    // Asynchronously runs the command
    run.Start("node server.js").Run()
}

API

run.Runnable

Runnable is the universal interface for all chainable runners available in run. Fill in your own type with below functions to implement run.Runnable.

  Run() error

  // Runnable functions can be chained in any order

  Call(string) Runnable
  Start(string) Runnable
  Shell(...string) Runnable

  With(...string) Runnable
  Pipe(int, *bytes.Buffer) Runnable

  At(string) Runnable
  In(string) Runnable

run.Shell

Shell returns an object implements Runnable, which allows you to chain another run function. It uses sh as default shell and can be specified with optional configuration.

run.Shell(`
    echo -n $USER
    echo some really long \
        command
`).Run()

above snippet will run multiline commands.

Environment variables are acceptable anywhere in command line If the binary itself is a env var, it will be expanded before execution

run.Env.Set("name=run")
run.Shell(`echo -n $name`).Run()

Can be chained by Pipe( ) to capture Stdout and Stderr or to bind Stdin.

var output bytes.Buffer
run.Shell(`bash`, `echo -n $USER`).Pipe(run.Stdout, &output).Run()

run.Call

Similarly, run.Call() returns Runnable which can be chained by Pipe( ), With( ), In( ), or another Call( ) if needed

  run.Call("echo Hello").Call("echo Hello again").Call("echo Hello again and again").Run()
  // Output:
  // Hello
  // Hello again
  // Hello again and again

run.Start

Start an async command. returns immediately.

run.Start("main").Run()

run.Runnable.In

Temporarily cd to specified path and run the Runnables

run.Call("...").In("path/to/run").Run()
run.Shell("...").In("path/to/run").Run()

run.Runnable.At

Runs the command with working directory set to be the input

run.Call("...").At("path/to/run").Run()
run.Shell("...").At("path/to/run").Run()

run.Runnable.Pipe

Any Runnable can use Pipe to direct its Stdin|Stdout|Stderr to a predefined io.Reader|io.Writer. Again it returns Runnable which can be chained with other functions.

var output = bytes.NewBuffer(nil)
run.Call(`GOOS=linux GOARCH=amd64 go build`).Pipe(run.Stdout|run.Stderr, output)

run.Runnable.With

Set command specific variables, only valid within the calling Runnable chain

run.Call("$c $t/txt").With("c=cat","t=test").Run()

Runtime Environment

Set from command line

Environment variables may be set via key-value assignments as prefix in command line.

Process environment will be set as the combination of available system environment variables and run.Env

  USER=run PATH=$PATH::./lib/ ./run/main

Set using run.Env

Use run.Env.Set To specify runtime environment for the command. Assignment expression to be separated with any type of spaces. All $VAR or ${VAR} will be expanded when loading at runtime

run.Env.Set(
    // Path list should use "::" as cross-platform path list separator.
    // On Windows "::" will be replaced with ";".
    // On Mac and linux "::" will be replaced with ":".
`
    PATH=./lib/::$PATH
    USER=user
`)

Use run.Runnable.With

More fine-grained environment configuration can be achieved by using With( )

// only valid in current Call
run.Call("$c $t/txt").With("c=cat","t=test").Run()

TIP: Set the Env when using a dependency manager like godep

wd, _ := os.Getwd()
run.Env.Set(fmt.Sprintf("GOPATH=%s::$GOPATH", path.Join(wd, "Godeps/_workspace")))

Tools

  • To get plain string user input

user := Prompt("user: ")


* To get hidden/masked user input

  ```go
password := PromptHidden("password: ")
password := PromptMasked("password: ")

About

Running system program with gulp-like calls chained together, designed for belt task runner

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages