@@ -26,6 +26,7 @@ import (
2626 "os"
2727 "os/exec"
2828 "path/filepath"
29+ "runtime"
2930 "strings"
3031 "time"
3132
@@ -135,6 +136,40 @@ func runTime(cmd *exec.Cmd) error {
135136 return cmd .Run ()
136137}
137138
139+ func gorun (srcFilename string , env []string , buildDir string , runDir string , args ... string ) error {
140+ exeDir , err := os .MkdirTemp ("" , "goeval*" )
141+ if err != nil {
142+ return err
143+ }
144+ defer func () {
145+ if err := os .RemoveAll (exeDir ); err != nil {
146+ log .Printf ("RemoveAll(%q): %v" , exeDir , err )
147+ }
148+ }()
149+
150+ exePath := filepath .Join (exeDir , "goeval-run" )
151+ if runtime .GOOS == "windows" {
152+ exePath += ".exe"
153+ }
154+
155+ cmdBuild := exec .Command (goCmd , "build" , "-o" , exePath , srcFilename )
156+ cmdBuild .Env = env
157+ cmdBuild .Dir = buildDir
158+ cmdBuild .Stdout = os .Stdout
159+ cmdBuild .Stderr = os .Stderr
160+ if err := run (cmdBuild ); err != nil {
161+ return fmt .Errorf ("failed to build: %w" , err )
162+ }
163+
164+ cmdRun := exec .Command (exePath , args ... )
165+ cmdRun .Env = env
166+ cmdRun .Dir = runDir // In Go module mode we run from the temp module dir
167+ cmdRun .Stdin = os .Stdin
168+ cmdRun .Stdout = os .Stdout
169+ cmdRun .Stderr = os .Stderr
170+ return run (cmdRun )
171+ }
172+
138173var goCmd = "go"
139174
140175func getGOMODCACHE (env []string ) (string , error ) {
@@ -187,7 +222,7 @@ func flagAction(name string, a actionBits, usage string) {
187222
188223func _main () error {
189224 imports := imports {
190- packages : map [string ]string {" " : "os" },
225+ packages : map [string ]string {},
191226 onlySemVer : true ,
192227 }
193228 flag .Var (& imports , "i" , "* import package: [alias=]import-path\n * switch to Go module mode and import package: [alias=]import-path@version" )
@@ -366,10 +401,6 @@ func _main() error {
366401 }
367402 src .WriteString ("func main() {\n " )
368403 if action <= actionDump {
369- src .WriteString ("os.Args[1] = os.Args[0]\n os.Args = os.Args[1:]\n " )
370- if moduleMode {
371- fmt .Fprintf (& src , "_ = os.Chdir(%q)\n " , origDir )
372- }
373404 src .WriteString ("//line :1\n " )
374405 }
375406 src .WriteString (code )
@@ -391,22 +422,11 @@ func _main() error {
391422 srcFinal = f
392423 srcFilename = f .Name ()
393424
394- runArgs := make ([]string , 0 , 3 + len (args ))
395- runArgs = append (runArgs , "run" , srcFilename , "--" )
396- runArgs = append (runArgs , args ... )
397- // log.Println(goCmd, runArgs)
398-
399- cmd := exec .Command (goCmd , runArgs ... )
400- cmd .Env = env
401- cmd .Dir = dir // In Go module mode we run from the temp module dir
402- cmd .Stdin = os .Stdin
403- cmd .Stdout = os .Stdout
404- cmd .Stderr = os .Stderr
405425 tail = func () error {
406426 if err = f .Close (); err != nil {
407427 return err
408428 }
409- return run ( cmd )
429+ return gorun ( srcFilename , env , dir , origDir , args ... )
410430 }
411431 case actionPlay :
412432 var cleanup func ()
0 commit comments