d4l3k/go-pry
An interactive REPL for Go that allows you to drop into your code at any point.
repo name | d4l3k/go-pry |
repo link | https://github.com/d4l3k/go-pry |
homepage | https://gopry.rice.sh/ |
language | Go |
size (curr.) | 239 kB |
stars (curr.) | 2587 |
created | 2015-03-05 |
license | MIT License |
go-pry
go-pry - an interactive REPL for Go that allows you to drop into your code at any point.
Example
Usage
Install go-pry
go get github.com/d4l3k/go-pry
go install -i github.com/d4l3k/go-pry
Add the pry statement to the code
package main
import "github.com/d4l3k/go-pry/pry"
func main() {
a := 1
pry.Pry()
}
Run the code as you would normally with the go
command. go-pry is just a wrapper.
# Run
go-pry run readme.go
If you want completions to work properly, also install gocode
if it
is not installed in your system
go get -u github.com/nsf/gocode
How does it work?
go-pry is built using a combination of meta programming as well as a massive amount of reflection. When you invoke the go-pry command it looks at the Go files in the mentioned directories (or the current in cases such as go-pry build
) and processes them. Since Go is a compiled language there’s no way to dynamically get in scope variables, and even if there was, unused imports would be automatically removed for optimization purposes. Thus, go-pry has to find every instance of pry.Pry()
and inject a large blob of code that contains references to all in scope variables and functions as well as those of the imported packages. When doing this it makes a copy of your file to .<filename>.gopry
and modifies the <filename>.go
then passes the command arguments to the standard go
command. Once the command exits, it restores the files.
If the program unexpectedly fails there is a custom command go-pry restore [files]
that will move the files back. An alternative is to just remove the pry.Apply(...)
line.
Inspiration
go-pry is greatly inspired by Pry REPL for Ruby.
License
go-pry is licensed under the MIT license.
Made by Tristan Rice.