How to distribute a Go app?

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

How to distribute a Go app?

问题

你好!根据你的描述,你使用Go语言编写了一个应用程序,它有两个外部依赖项,在编译之前需要满足这些依赖项。在Go生态系统中,最佳的方式是如何打包这个应用程序,以便用户可以简单地安装这些远程依赖项并安装你的应用程序呢?

在Go语言中,你可以使用Go Modules来管理你的项目依赖项并打包你的应用程序。Go Modules是Go 1.11版本引入的一种依赖管理工具,它可以帮助你管理项目的依赖关系,并确保每个开发者都使用相同的依赖项版本。

首先,你需要在你的项目根目录下初始化Go Modules。在终端中,进入你的项目目录并运行以下命令:

go mod init <module-name>

这将创建一个go.mod文件,其中包含你的项目名称和依赖项信息。

接下来,你可以使用go get命令来安装你的依赖项。例如,如果你的应用程序依赖于一个名为github.com/example/dependency1的包,你可以运行以下命令:

go get github.com/example/dependency1

这将自动下载并安装该依赖项。

当用户想要安装你的应用程序时,他们只需要克隆你的代码仓库,并运行以下命令:

go build

这将编译你的应用程序,并自动下载和安装所有在go.mod文件中列出的依赖项。

用户可以通过运行生成的可执行文件来启动你的应用程序。

希望这些信息对你有所帮助!如果你有任何其他问题,请随时问我。

英文:

I've written an application in Go. It has two external dependencies that would need to be met before compiling. In the Go ecosystem, what is the best way to package this app for a simple installation process that includes installing those remote deps? How would a user install my app?

答案1

得分: 13

  • 如果您希望用户编译您的应用程序,并且该应用程序依赖于第三方软件包或资源,那么我建议您只需为支持的平台进行交叉编译并提供二进制文件。

  • 如果您有要与应用程序一起提供的资源(例如配置文件),则可以选择:a)将二进制文件与资源打包并进行tar/zip压缩;b)对资源进行base64编码,并将其编译到二进制文件中在此处可以找到一个很好的示例;或者c)创建一个构建/安装脚本来为用户执行这些操作。

如果您能明确您的确切要求,将更容易给出更直接的答案。

英文:
  • If you are expecting a user to compile your application, and that application relies on third party packages or assets, then I'd suggest just cross-compiling for the supported platforms and providing binaries.

  • If you have assets that you want to provide alongside the application (a config file, for example) then either: a) package the binary with the assets and tar/zip it up; b) base64 encode the assets and compile them into the binary see here for a good example or c) create a build/install script that does this for the user.

If you can clarify your exact requirements it'll be easier to answer more directly.

答案2

得分: 11

Go二进制文件除了你在代码中可能强加的任何依赖关系之外,没有其他运行时依赖关系。(它的运行时库已包含在编译后的可执行文件中。)

因此,你可以像分发从C、C++或其他代码编译的任何其他静态链接二进制文件一样分发你的应用程序。

在Linux上,你可以使用相应的工具创建.rpm或.deb文件。在Windows上,你可以使用像InnoSetup这样的工具创建安装程序。

英文:

Go binaries do not have runtime dependencies other than any you might impose in your code. (Its runtime libraries are included in the compiled executable.)

So you would distribute your app the way you would any other statically-linked binary compiled from C, C++ or other code.

On Linux you might create an .rpm or .deb file using the appropriate tooling for that. On Windows you could create an installer using a tool like <a href="http://www.jrsoftware.org/isinfo.php">InnoSetup</a>.

答案3

得分: 5

Go生成一个单一的二进制文件。如果你的外部依赖是编译时依赖,那么你的用户不需要担心它们——它们已经被编译进去了。

如果它们是运行时依赖,那么只需要分发一个可执行文件和相关资源,任何安装程序都可以为你完成这个任务——无论这个可执行文件是用Go编写的还是其他语言编写的都无关紧要。
编辑:如果即使有运行时依赖也必须是一个单一的二进制文件,那么你需要将运行时依赖转换为编译时依赖。其中一种方法是elithrar提出的方法。

从Go的角度来看,你唯一需要担心的是为用户的平台编译你的代码。

英文:

Go produces a single binary. If your external dependencies are compile time dependencies, then your users do not need to worry about them - they're already compiled in.

If they're run time dependencies, then it is a matter of distributing an exe and related resources, which any installer can do for you - whether the exe was written in Go or not is irrelevant.
EDIT: If it absolutely must be a single binary even with run time dependencies, then you need to convert your run time dependencies to compile time ones. One method is the one elithrar has suggested.

The only thing you need to worry about from Go's point of view is that you have compiled your code for your user's platform.

huangapple
  • 本文由 发表于 2013年10月10日 07:37:04
  • 转载请务必保留本文链接:https://go.coder-hub.com/19284631.html
匿名

发表评论

匿名网友

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

确定