【问题标题】:How to run all .go files within current directory through the command line (multi file package)如何通过命令行运行当前目录下的所有.go文件(多文件包)
【发布时间】:2014-07-04 21:59:53
【问题描述】:

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

go run main.go(main.go 是我的 main() 函数的文件)

没有工作,我遇到了一段时间的障碍,因为我不知道如何让我的程序工作。

一些快速搜索引导我找到答案

go run main.go other.go ..

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

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

【问题讨论】:

    标签: go command-line-interface


    【解决方案1】:

    如果您在 Windows 上的 Vscode 终端中运行并且不了解工作区,请这样做:

    go run $(ls *.go)
    

    【讨论】:

      【解决方案2】:

      我们现在终于可以使用了:

      go run .
      

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

      【讨论】:

      • 但是当我的工作目录不是并且不能是.时,我该怎么做?
      • 。只是当前目录的占位符。您可以通过任何其他路径替换。
      【解决方案3】:

      对于窗口,以下工作: 打开 cmd 并转到您的文件夹所在的路径。然后输入以下命令并回车。

      go build
      

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

      Project.exe
      

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          最好的方法是像这样运行它:

          go run !(*_test).go
          

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

          另一个建议:

          go build && ./<executable>
          

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

          【讨论】:

          • @user1872384 你应该先运行shopt -s extglob 以启用!(...) 通配符语法
          • 运行良好,但由于某些原因不在 bash 文件中,我想有一些不受支持的字符。
          【解决方案6】:

          这是我的解决方案:

          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
          

          【讨论】:

            【解决方案7】:

            就用这个

            go run *.go 
            

            假设你没有任何测试文件,它会工作

            【讨论】:

            • 这绝对是我想要的!谢谢!
            • 无法在 Windows 上运行。 CreateFile *.go: The filename, directory name, or volume label syntax is incorrect.
            • 但是现在,我们可以使用 go run 了。 :)
            • 如果有任何测试文件将不起作用。更好地使用go run .
            • 是的,它适用于 Windows。只需使用 git bash
            【解决方案8】:

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

            go build
            .\{project_name}.exe
            go clean
            

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

            【讨论】:

              【解决方案9】:

              您可以使用此 bash 构造运行所有 .go 文件,不包括测试:

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

              【讨论】:

              • 这应该是公认的答案。它解决了 *nix 开发者的问题
              • 我喜欢这个,但是当它被设置为别名时,该命令不能很好地播放。 r.sendecky 使用shopt!(...) 的解决方案效果很好。
              【解决方案10】:

              Unix 相关系统

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

              如果这导致错误,请继续以下方法。

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

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

              在这些情况下,请使用

              go build &amp;&amp; foo.exe

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

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

              这 2 种方法将在您当前目录中构建和运行所有 .go 文件,而无需大惊小怪。

              【讨论】:

              • 如何在子文件夹下的文件夹下运行*.go?
              • 如果您使用 Windows PowerShell,它是:go build; .\foo.exe(而不是 && 你有 ;(点和逗号))
              • 有没有跨平台方式,filepath.Abs(filepath.Dir(os.Args[0]))不是临时目录?
              【解决方案11】:

              正如Nate Finch 注释:

              Go run 是......真的只适用于非常小的程序,通常只需要一个文件。

              即使在 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>
              

              【讨论】:

                【解决方案12】:

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

                小例子

                ./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

                【讨论】:

                • 这是 Windows 开发人员的正确答案。就我而言,我必须使用完全限定的路径 import "github.com/abacaj/hello/lib",然后像 sc := new(lib.ServiceControl) 一样使用它
                猜你喜欢
                • 2014-05-03
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-01-14
                • 1970-01-01
                • 2021-07-20
                • 1970-01-01
                • 2013-09-03
                相关资源
                最近更新 更多