如何编译由多个文件组成的Go程序?


88

我有一个包含三个文件的小程序,所有文件都属于同一个程序包(主文件),但是当我“进行构建main.go”时,构建不会成功。当它只是一个文件(main.go)时,一切正常。现在,我已经花了一些力气来分离代码,看来编译器无法找到从main.go中取出的东西并放入其他两个文件(与main.go位于同一目录中) 。导致“未定义的'类型'”错误。

如何编译由多个文件组成的程序?

Answers:


85

新方法(推荐):

请看看这个答案

旧方法:

假设您正在编写一个名为myprog的程序:

将所有文件放在这样的目录中

myproject/go/src/myprog/xxx.go

然后添加myproject/go到GOPATH

然后跑

go install myprog

这样,您可以根据需要在myproject / go / src中添加其他程序包和程序。

参考:http : //golang.org/doc/code.html

(此文档总是被新手所错过,并且一开始常常被误解。它应该得到Go小组IMO的最大关注)


5
为什么不摆脱/ go /而只做myproject / src?
亚历山大·米尔斯

另外,我假设“去安装myprog”以某种方式将项目源写入$ GOPATH位置?那正确吗?如果是这样,也可以将该解释也作为答案的一部分
Alexander Mills

1
@AlexanderMills只有小项目仅使用一种技术。
DenysSéguret17年

2
@DenysSéguret不确定我是否同意,但是无论如何这是针对简单项目的,您可以删除go部分-人们可能会认为go事情是必要的,而事实并非如此。您告诉我,走还是走,哪个更简单?:)
亚历山大·米尔斯

1
我还是不明白为什么这个文件夹结构?
Madeo

67

main.go例如more.go,当您将代码从分隔为时,您只需将该文件也传递给go build/ go run/ go install

所以如果你以前跑过

go build main.go

你现在只是

go build main.go more.go

作为更多信息:

go build --help

状态:

如果参数是.go文件列表,则build会将其视为指定单个程序包的源文件列表。


请注意,go build和的go install区别go run在于前两个状态期望将程序包名称作为参数,而后者则期望go files。但是,前两个也将像go install一样接受go文件。

如果您想知道:build将仅build打包/文件,install将在GOPATH中生成目标文件和二进制文件,run并将编译并运行程序。


6
如果您不想继续添加越来越多的文件,请使用正则表达式,并执行以下操作:go run *
.go

好的,谢谢,Go是否总是只写出一个可执行文件?它不会将可执行文件分开(例如在Java中)吗?
亚历山大·米尔斯

我认为@AlexanderMills因为Windows而使用nix。或至少是mingw。
谢尔盖·戈拉诺夫

是啊,我是使用MacOS的,但也许这是Bash的版本3就是他妈的了,我应该升级到猛砸4
亚历山大·米尔斯

29

你也可以跑

go build

在您的项目文件夹myproject / go / src / myprog中

然后你可以输入

./myprog

运行您的应用


3
输出是go对象,而不是可执行文件。
user2284570 '17

@ user2284570只需添加chmod +x该文件的运行权限即可
dalmate

13

从Go 1.11+开始,不再建议使用GOPATH,因此新方法是使用Go模块。

假设您正在编写一个名为的程序simple

  1. 创建目录:

    mkdir simple
    cd simple
    
  2. 创建一个新模块:

    go mod init github.com/username/simple
    # Here, the module name is: github.com/username/simple.
    # You're free to choose any module name.
    # It doesn't matter as long as it's unique.
    # It's better to be a URL: so it can be go-gettable.
    
  3. 将所有文件放在该目录中。

  4. 最后,运行:

    go run .
  5. 另外,您可以通过构建可执行程序来创建它:

    go build .
    
    # then:
    ./simple     # if you're on xnix
    
    # or, just:
    simple       # if you're on Windows
    

有关更多信息,您可以阅读此内容

从1.11开始,Go就包含了对版本模块的支持。最初的原型vgo于2018年2月发布。2018年7月,版本化模块降落在主Go存储库中。在Go 1.14中,模块支持被认为已准备好用于生产,并且鼓励所有用户从其他依赖项管理系统迁移到模块。



5

这取决于您的项目结构。但最直接的是:

go build ./... -o ./myproject

然后运行./myproject

假设您的项目结构如下所示

- hello
|- main.go

然后您只需转到项目目录并运行

go build -o ./myproject

然后./myproject在shell上运行。

要么

# most easiest; builds and run simultaneously
go run main.go

假设您的主文件嵌套在一个子目录中,例如 cmd

- hello
|- cmd
 |- main.go

那你就跑

go run cmd/main.go

3

对!这很简单,这就是打包策略起作用的地方。据我所知,有三种方法。文件夹结构:

GOPATH / src / github.com/ abc / myproject / adapter / main.go pkg1 pkg2警告:适配器只能包含软件包main和sun目录

  1. 导航到“适配器”文件夹。跑:
    go build main.go
  1. 导航到“适配器”文件夹。跑:
    go build main.go
  1. 导航到GOPATH / src识别包main的相对路径,此处为“ myproject / adapter”。跑:
    go build myproject/adapter

exe文件将在您当前所在的目录中创建。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.