2015-05-07 3 views
4

Для быстрого взлома я предпочитаю использовать go run prog.go ... вместо того, чтобы сначала создавать исполняемый файл. Тем не менее, программа, над которой я работаю, должна принимать в качестве аргумента другой файл go-файла. Как следствие, go run и скомпилированные бинарные ведут себя по-разному:Передача .go-файла в качестве дополнительного аргумента для `go run`

go run prog.go foo.go 

будет пытаться выполнить оба идут-файлы, в то время как

go build prog.go && ./prog foo.go 

правильно взять мой файл в качестве входных данных (предполагаемое поведение). Теперь я могу передать дополнительные аргументы, подобные этому go run ... -- foo.go, но тогда из-за -- позиция файла отличается от os.Args между go run prog.go -- foo.go и ./prog foo.go. Любое простое решение? Я бы хотел избежать полной обработки флагов. Должен ли я просто сдаться и придерживаться скомпилированной версии?

+0

Исправить ошибку 'go/cmd/run.go' будет очень мало; Я рекомендую обсудить его в списке орехов и отправить CL. Я не вижу никакого способа обойти это. \ –

+3

Учитывая минимальные издержки 'go build prog.go && ./prog foo.go' по сравнению с' go run prog.go foo.go' (который также компилируется и связывает вашу программу) Я бы просто придерживался версии «build». – Volker

+0

Да; Я использую 'go build' слишком большую часть времени из-за всех проблем с' go run', но действительно раздражающая вещь IMO заключается в том, что она записывает неподписанный файл в ваш исходный каталог. Хорошая версия 'go run' определенно была бы полезной. –

ответ

3

Это невозможно. Вот source для команды:

for i < len(args) && strings.HasSuffix(args[i], ".go") { 
    i++ 
} 
files, cmdArgs := args[:i], args[i:] 

Вы можете использовать go install вместо go build. Это поместит ваш исполняемый файл в вашу папку $GOPATH/bin (мне не нравится иметь двоичный файл в той же папке, потому что иногда я случайно добавляю его в git). Но это действительно не так.

Другой вариант, который вы, возможно, захотите рассмотреть, - rerun. Он будет автоматически перекомпилировать и запустить свой код при каждом изменении файла:

rerun path/to/your/project foo.go 
0

Глядя на мою проблему еще раз, я должен узнать, если я когда-нибудь понадобится несколько входных файлов. Если нет, я могу уйти, просто прочитав от Stdin вместо открытия файла.

Смежные вопросы