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

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")))
user := Prompt("user: ")
* To get hidden/masked user input
```go
password := PromptHidden("password: ")
password := PromptMasked("password: ")