有没有简单的方法来检查Golang项目的大小?它不是可执行文件,它是我在我自己的项目中导入的包。
您可以通过查看$GOPATH/pkg
目录来查看库二进制文件的大小(如果$GOPATH
未导出,则go
默认为$HOME/go
)。
所以要检查一些gorilla
http pkgs的大小。首先安装它们:
$ go get -u github.com/gorilla/mux
$ go get -u github.com/gorilla/securecookie
$ go get -u github.com/gorilla/sessions
我的64位MacOS(darwin_amd64
)上的KB二进制大小:
$ cd $GOPATH/pkg/darwin_amd64/github.com/gorilla/
$ du -k *
284 mux.a
128 securecookie.a
128 sessions.a
编辑:
库(包)大小是一回事,但链接阶段后可执行文件中占用的空间可能会有很大差异。这是因为包具有自己的依赖关系,并且带来了额外的行李,但是该行李可能由您导入的其他包共享。
一个例子证明了这一点:
empty.go:
package main
func main() {}
http.go:
package main
import "net/http"
var _ = http.Serve
func main() {}
mux.go:
package main
import "github.com/gorilla/mux"
var _ = mux.NewRouter
func main() {}
所有3个程序在功能上都是相同的 - 执行零用户代码 - 但它们的依赖性不同。在KB
中生成的二进制大小:
$ du -k *
1028 empty
5812 http
5832 mux
这告诉我们什么?核心去pkg net/http
为我们的可执行文件增加了很大的大小。 mux
pkg本身并不大,但它对net/http
pkg具有导入依赖性 - 因此它的重要文件大小也是如此。然而,mux
和http
之间的差异只是20KB
,而mux.a库中列出的文件大小是284KB
。所以我们不能简单地添加库pkg大小来确定它们的真实足迹。
结论:go链接器将在构建过程中从单个库中删除大量的包袱,但为了真正了解导入某些包的额外重量,必须将所有pkg的子依赖关系视为好。