如何通过命令行运行当前目录中的所有.go文件(多文件包)

问题描述 投票:51回答:11

我是Go的新手。我非常喜欢这种语言,但是我很快意识到,由于程序大小增加,我需要开始分割文件。

go run main.go(main.go已成为我的main()函数的文件)

没有工作,我遇到了障碍,因为我不知道如何使程序正常工作。

一些快速搜索使我找到了答案

go run main.go other.go ..

通过键入package main包含的所有文件的位置,我可以使程序运行。但是,每次这样做都非常麻烦且令人沮丧。

我写了以下自我回答的问题,以防止像我这样的人可能再次遇到这个障碍。

go command-line-interface
11个回答
67
投票

作为Nate Finch注释:

开始运行……实际上仅意味着可以在非常小的程序上使用,这些程序通常只需要一个文件。

即使在unix上,go run *.go通常也不正确。在任何具有单元测试的项目中(每个项目都应具有单元测试),这将产生错误:

go run: cannot run *_test.go files (something_test.go)

它还将忽略构建限制,因此_windows.go文件将在Unix上编译(或尝试编译),这不是您想要的。

[bit of discussion使go run像其余的go命令一样工作,并且有一个开放的CL(5164)。 Go 1.4目前正在考虑中。同时,在所有平台上推荐的解决方案是:

go build && ./<executable>

0
投票

对于尝试将go rungo generate结合使用的人们,可以使用以下解决方案:

//go:generate sh -c "go run path/*.go"

-1
投票

对于窗口,以下工作:打开cmd,然后转到文件夹所在的路径。然后键入以下命令,然后按Enter。

go build

此可执行文件将被创建。然后在命令提示符下调用可执行文件。如果您的可执行文件名为Project.exe,则键入以下内容,然后按Enter:

Project.exe

24
投票

Unix相关系统

go run *.go在大多​​数情况下就足够了。

如果导致错误,请继续下面的方法。

Windows系统(以及在其他情况下,go run *.go不起作用)

令牌扩展在Windows命令行中不起作用,因此以上内容将不起作用并显示错误。由于当前的编译器限制,在某些情况下,go run *.go也可能无法在操作系统中使用。

在这些情况下,使用

go build && foo.exe

其中foo.exe是所生成的.exe文件的名称。如果您可能不知道可执行文件的名称,请首先

go build并检查生成的.exe文件的名称。然后,使用包含文件名的方法。

这两种方法将以最小的麻烦构建并运行当前目录中的所有.go文件。


22
投票

最后我们现在可以使用:

go run .

感谢:https://github.com/golang/go/issues/22726#issuecomment-345841019


20
投票

您可以使用此bash构造运行除测试以外的所有.go文件:

go run $(ls -1 *.go | grep -v _test.go)

18
投票

最佳方法是像这样运行它:

go run !(*_test).go

它会跳过所有测试文件,而这正是避免错误所需要的。

另一个建议:

go build && ./<executable>

有点烦人。您必须一直删除可执行文件,以免被git标记。您可以将它放在gitignore中,但是我很懒,这是一个额外的步骤。


5
投票

如果我正确理解您的问题,则需要导入其他代码作为库。

小例子

./ testing / main.go:

package main

import "fmt"
import L "testing/lib"

func main() {
    fmt.Println("Hello from main()")
    L.Somefunc()
}

./ testing / lib / somelib.go:

package lib

import "fmt"

func Somefunc() {
    fmt.Println("Hello from Somefunc()")
    return
}

要启动-go run main.go


2
投票

仅使用此

go run *.go 

假设您没有任何测试文件,它将正常工作


2
投票

这是我的解决方法:

go run $(find . -name "*.go" -and -not -name "*_test.go" -maxdepth 1)

我将它与别名结合使用,以使其易于运行命令行应用程序

alias gorun='go run $(find . -name "*.go" -and -not -name "*_test.go" -maxdepth 1)'

$ gorun param1 param2

1
投票

在Windows上,我通常只向我的所有项目目录中添加一个test.bat

go build
.\{project_name}.exe
go clean

效果很好。当然,将{project_name}替换为可执行文件的名称。可执行文件完成后,批处理脚本将继续进行清理。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.