Go 跨平台(机器)部署这么方便的吗?

2018-12-17 10:23:58 +08:00
 imherer
这几天不忙就看了下 go,然后用 beego 写了个 demo

我是在 mac 上开发的,尝试部署在 Linux 和 Windows 上,我发现只需要直接 build 为对应平台的版本就行了,在对应的机器上不需要安装 go 运行环境吗?

像 Node.js 或者 Python 甚至.NET ,在部署在都得在需要部署的机器上提前安装好环境,go 不需要,直接 build 然后把 build 出来的文件丢到服务器上就行了?这么方便的吗?

另外还有几个问题请教一下大佬:

1.go 最后打包出来的可执行文件永远只有一个吗?有没有可能根据我的业务逻辑分别打包成几大块(例如:main、lib1、lib2 ),虽然好像这样意义也不大?

2.写代码前需要设置 GOPATH。假如我有多个项目的话 GOPATH 是不是也得设置多个?那 GOBIN 好像只能设置一个啊。
对于多个项目你们是怎么弄的?还是 GOPATH 只有一个,在 src 下建不同的文件夹来区分项目吗,最后通过 go build 指定路径来打包吗?

3.假如我现在打包出来一个文件为 main,在 Linux 执行它的方式为./main (是这样的吧)

4.go 有没有类似 Node.js 下的 pm2 这种守护进程管理工具? 你们在服务器上怎么部署的 go ?总不可能是 nohup 吧

最后:刚接触,可能有些地方问的不对的还请各位大佬见谅!
12917 次点击
所在节点    程序员
92 条回复
plqws
2018-12-17 15:53:52 +08:00
如果没有 分发单文件 binary / 无痛跨平台 这两个需求而去选 go 完全就是吃饱了撑着,所以那群需要动态链接的还是老老实实用其他语言吧
ixiaohei
2018-12-17 16:12:03 +08:00
@iwtbauh 静态链接讲的很有道理;另外嵌入式设备上令人烦躁的都是缺少依赖;特别是那种裁剪的嵌入式上,更令人头大;没有正常 linux 发行版有包管理工具...
caryqy
2018-12-17 16:35:42 +08:00
@hlwjia 收藏 /标记 /mark
neoblackcap
2018-12-17 16:48:49 +08:00
@iwtbauh 是的,因为这个是很久以前 Google 发文说的,不过除此以外我非常怀疑他们内部还有什么大系统是用 Golang 写的。就算现在吹那么多的容器编排,Borg 也还是用 C++写的。我对 Golang 在 Google 内部有很大的占比表示怀疑。
suley
2018-12-17 16:53:24 +08:00
@ixiaohei 如果经过剪裁的嵌入式,恐怕动态链接更需要了,毕竟静态链接编译出来的一般都比动态链接的大不少,嵌入式空间有限,捉襟见肘。
pathbox
2018-12-17 16:55:06 +08:00
go mac 下交叉编译放 centOS 上有 net 包的 bug 还是老老实实在 Linux 编译放生产

pm2 挺好用的。一般直接用于 go 项目 基本够用

一个 gopath。其他项目做软链接过去
hlwjia
2018-12-17 17:07:43 +08:00
@caryqy 谢谢,我大概能猜到是类似的意思。但是插眼和 mark 收藏是怎么关联起来的?
0xCNSumi
2018-12-17 17:12:02 +08:00
@hlwjia 插眼来自于游戏英雄联盟(lol)中的放置控制守卫,放置后可以在一段时间或者永久的或者放置区域的视野,引申到收藏可以关注帖子的动态
hlwjia
2018-12-17 17:39:49 +08:00
@gocnsumi 哈哈 谢谢详细地解释,不玩游戏的我是怎么都不会想到这个
dabaibai
2018-12-17 17:46:31 +08:00
相当方便好用
ixiaohei
2018-12-17 18:06:59 +08:00
@suley 现在嵌入式设备硬件配置很好的。
Muninn
2018-12-17 18:12:39 +08:00
我用了好几年 golang 了,应该能提供更好的答案,回答一下吧。

1. https://github.com/spf13/cobra
2. https://colobu.com/2018/08/27/learn-go-module/ 最新的 golang 不用了
3. 是 一般推荐用绝对路径,更一般的见 4
4. docker 研究一下不吃亏。golang 生态大多都用的容器,毕竟 docker 是 golang 的明星应用。
Muninn
2018-12-17 18:13:17 +08:00
补充,学 golang 别用 beego。会被带沟里。
web 框架的话推荐 gin 或者 echo
wenzhoou
2018-12-17 18:37:18 +08:00
只有我喜欢静态编译吗。反正编译之后也不太大。(当然体积能缩小一下就更开心了) 确实用了 docker 就能感觉出来 golang 的好处了。
imherer
2018-12-17 18:49:19 +08:00
@giuem
@wentaoliang
@janxin
@AlphaTr
@Muninn

问下大佬,看了你们的回复然后今天用了下 go mod。 我发用 go mod 方式的话不管是 go run 还会 go build 很慢,会花很长时间。
我就只引入了 github.com/astaxie/beego 这个
直接在 GOPATH 下无论是 go run main.go 或者是 go build 很快( 1s 不到就完成了),但是用 go mod 的话初步估计至少 30s 以上

是什么原因呢?大佬们有遇到同样的情况吗?
janxin
2018-12-17 18:51:56 +08:00
@imherer 因为依赖会下载一遍,和你没用的时候的依赖管理方式不一样
blless
2018-12-17 18:54:49 +08:00
动态链接多了就知道恶心了…不小心错一个版本直接系统都炸了,没有特殊需求我选择 go
imherer
2018-12-17 18:59:04 +08:00
@janxin 我用 time go build -v 看了下过程,第一条信息就是 Fetching https://golang.org/x/crypto?go-get=1
这个没梯子肯定拉不了,但是我在 go.mod 里已经用 github 的源把它给 replace 掉了,为什么还要拉呢

发现就是这个一直卡到 timeout 然后就 build 成功了
jjx
2018-12-17 19:07:03 +08:00
python 装环境哪里有你们说的那么可怕

如果是 gfw 问题的, aliyun 有 pypi 镜像


虽然我也用 go, 但 python 环境装一次后面的更新很小, go 每次要传 10 多 m 的文件

关键如果用 cgo 等, 交叉编译还是用不了的
jjx
2018-12-17 19:07:54 +08:00
补充一下, go 传文件更新还要解决文件锁定问题, python 都可以直接覆盖

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/518179

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX