22

我正在尝试设置一个多包 go 项目,例如

./main.go

./subpackage1/sub1_1.go

./subpackage1/sub1_2.go

./subpackage2/sub2_1.go

./subpackage2/sub2_2.go

其中 main.go 导入 subpackage1 和 subpackage2。并且 subpackage2 导入 subpackage1。

我一直在寻找 go makefile 示例,但我找不到任何支持这种设置的东西。任何想法?

4

4 回答 4

17

安装godag然后运行:

gd -o myapp

它将自动构建src/目录中所有依赖项的有向无环图 (DAG),然后以正确的顺序编译和链接每个包。

比手动维护 Makefile 容易得多,特别是因为 $(GOROOT)/src/Make.* 在最近的 Go 版本中发生了变化(不再有 Make.$(GOARCH))。也很有用:

gd clean删除目标文件。

gd -test运行您的自动化测试(请参阅测试包)。

gd -dot=myapp.dot生成您可以使用 GraphViz 可视化的包导入图表。

于 2010-12-06T02:58:33.233 回答
7

像这样的东西应该工作

# Makefile
include $(GOROOT)/src/Make.$(GOARCH)
all:main
main:main.$O
    $(LD) -Lsubpackage1/_obj -Lsubpackage2/_obj -o $@ $^
%.$O:%.go  subpackage1 subpackage2
    $(GC) -Isubpackage1/_obj -Isubpackage2/_obj -o $@ $^
subpackage1:
    $(MAKE) -C subpackage1
subpackage2:
    $(MAKE) -C subpackage2
.PHONY:subpackage1 subpackage2

# subpackage1/Makefile
TARG=subpackage1
GOFILES=sub1_1.go sub1_2.go
include $(GOROOT)/src/Make.$(GOARCH)
include $(GOROOT)/src/Make.pkg

# subpackage2/Makefile
TARG=subpackage2
GOFILES=sub2_1.go sub2_2.go
include $(GOROOT)/src/Make.$(GOARCH)
include $(GOROOT)/src/Make.pkg
GC+=-I../subpackage1/_obj
LD+=-L../subpackage1/_obj
sub2_1.$O sub2_2.$O:subpackage1
subpackage1:
    $(MAKE) -C ../subpackage1
.PHONY:subpackage1

如果您不安装子包,则需要显式设置包含路径。提供的makefile Make.pkg 主要用于构建包,这就是它只包含在子包makefile 中的原因。

于 2009-11-19T23:13:01.900 回答
5

带有 Makefile 和测试的 hello world (Googles Groupes : golang-nuts)

于 2009-11-19T22:29:55.660 回答
4

查看https://github.com/banthar/Go-SDL,这是一个使用 Makefiles 积极维护的多包 go 项目。

我注意到其中一些答案使用了过时Make.$(GOARCH)的包含。因此,希望上面的链接比试图在此处的答案中保持在 Google 不断变化的 API 之上更稳定。

于 2011-06-02T05:15:17.293 回答