可以将Go项目预编译并在不同的Linux发行版上运行吗?

huangapple go评论87阅读模式
英文:

Is it possible to precompile a Go project and run on different Linux distros

问题

你好!根据你的问题,你想知道在不编译应用程序及其依赖项的情况下,是否可以在不同的Linux系统上构建应用程序,并在目标机器上运行。你还想知道如何确定哪些二进制文件可以在目标系统上运行。

对于第一个问题,通常情况下,你需要在目标机器上编译应用程序及其依赖项,以确保它们能够在特定的Linux系统上正确运行。这是因为不同的Linux系统可能具有不同的库和依赖项版本,因此在目标机器上进行编译可以确保兼容性。

至于第二个问题,你可以通过以下几种方式来确定二进制文件在目标系统上的可运行性:

  1. 查看目标系统的操作系统版本和架构:你可以使用命令如uname -a来获取目标系统的操作系统版本和架构信息。比如,你可以确定目标系统是否为Linux,并查看其版本和架构(如x86、x86_64等)。

  2. 检查目标系统的依赖项:你可以检查目标系统上已安装的库和依赖项,以确定是否满足应用程序的要求。你可以使用命令如ldd来查看二进制文件所依赖的共享库。如果目标系统上缺少某些依赖项,你可能需要手动安装它们。

  3. 进行测试和验证:最可靠的方法是在目标系统上进行测试和验证。将应用程序及其依赖项复制到目标机器上,并尝试运行它们。如果应用程序能够在目标系统上正常运行,那么它们应该是可兼容的。

需要注意的是,尽管你可以尝试在不同的Linux系统上运行相同的二进制文件,但由于系统配置和依赖项的差异,可能会出现兼容性问题。因此,最好在目标系统上进行编译和测试,以确保应用程序能够正常运行。

英文:

I'm new to Go, and wonder if I can build my application on my computer, then put on target machines with different Linux systems and run without having to compile it or its dependencies?

How do I figure out on what target systems what binaries can run?

答案1

得分: 1

请注意,在Linux操作系统上编译的Go二进制文件可以在其他Linux发行版上运行。

如果Docker是一个选项,你可以考虑使用DockerHub上的Go Docker镜像之一。你可以根据<go-version>-onbuild镜像之一创建一个Dockerfile,或者在你的计算机上构建应用程序,然后将二进制文件COPY到基于你选择的Linux发行版的镜像之一中。

onbuild镜像会构建并运行你的应用程序。你可以在这里查看它的Dockerfile。我见过团队使用第二种方法,在golang-alpine Docker容器中分别构建和运行应用程序二进制文件,以减小生产镜像的大小。

否则,你可以使用Go内置的交叉编译支持,具体步骤如下:

  1. GOOSGOARCH环境变量设置为目标操作系统和架构的值。
  2. 运行go build -v YOURPACKAGE

请参考这里获取支持的GOOSGOARCH值的列表。

英文:

Note that Go binaries compiled on a Linux OS would work on other Linux distro.

If Docker is an option, you can consider using one of the Go Docker images on DockerHub. You can either create a Dockerfile based on one of the <go-version>-onbuild images or build your application on your computer, then COPY the binary over to one the images that is based off the Linux distro of your choice.

The onbuild images builds and runs your application. You can check out its Dockerfile here. I have seen team uses the second approach of building and running the application binary separately in golang-alpine Docker containers to reduce the size of production images.

Otherwise, you can use Go built-in cross-compilation support, which boils down to:

  1. Setting the GOOS and GOARCH environmental variables to be the values for the target operating system and architecture.
  2. Run go build -v YOURPACKAGE

Refer here for a list of supported GOOS and GOARCH values.

答案2

得分: 0

如果你在Linux机器上构建Go程序,只要将其标记为可执行文件chmod +x /path/to/main.go,它就可以在其他地方正常工作。

你可以使用envgo build命令工具来指定构建的目标架构(或操作系统),例如:

env GOARCH=arm go build main.go

如果你想指定Linux,可以使用以下命令:

env GOOS=linux go build main.go

请注意,这些是目标环境:

请注意,$GOARCH和$GOOS标识的是目标环境,而不是你正在运行的环境。实际上,你总是在进行交叉编译。通过架构,我们指的是目标环境可以运行的二进制文件类型:在运行32位操作系统的x86-64系统上,GOARCH必须设置为386,而不是amd64。

在这里可以查看完整的发行版和架构列表:
https://golang.org/doc/install/source#environment

英文:

If you build the go program on a Linux machine, it should just work elsewhere, if you mark it as executable chmod +x /path/to/main.go.

You can specify the build using env and the go build cmd tool which architecture to build for (or which OS), for example:

env GOARCH=arm go build main.go

If you want, you can specify Linux with

env GOOS=linux go build main.go

Note, these are the target environments:

> Note that $GOARCH and $GOOS identify the target environment, not the environment you are running on. In effect, you are always cross-compiling. By architecture, we mean the kind of binaries that the target environment can run: an x86-64 system running a 32-bit-only operating system must set GOARCH to 386, not amd64.

see here for a full list of distros and architectures:
https://golang.org/doc/install/source#environment

huangapple
  • 本文由 发表于 2016年8月27日 06:59:48
  • 转载请务必保留本文链接:https://go.coder-hub.com/39175717.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定