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 吧

最后:刚接触,可能有些地方问的不对的还请各位大佬见谅!
12861 次点击
所在节点    程序员
92 条回复
fcten
2018-12-17 11:06:28 +08:00
编译成单个二进制文件不符合 unix KISS 的原则。不过 KISS 是一个对开发者友好,而使用者体验很差的原则……
wentaoliang
2018-12-17 11:07:22 +08:00
顺便有说静态编译体积大, 我倒感觉浪费一点体积换取运维的便利性还是值得的, 如果真的觉得太大,可以考虑 upx 套壳压缩
TinyKube
2018-12-17 11:12:17 +08:00
还是要区分场景,Go 在云原生+微服务场景还是能解决很多问题的
miniliuke
2018-12-17 11:13:26 +08:00
golang 有插件(动态库)的吧,仅 linux 可用,虽然没怎么用过
alichen
2018-12-17 11:16:21 +08:00
加上 cgo 的话交叉编译就难过了
iwtbauh
2018-12-17 11:18:12 +08:00
@liuxey #19

java 不一样,主流的 java 实现是编译为 java 字节码而不是二进制文件。gcj 我没用过就不说了。

golang 的诞生不就是为了取代 c++ 来“提高内存安全”,“提高编程效率”的吗,rust 也是在各方面和 c++ 比。可以说主战场是差不多的。现在好了,c++的某些重要优势被 golang 抛弃了,依赖这些优势的 c++程序员怎么可能转去 golang。
trait
2018-12-17 11:19:35 +08:00
@iwtbauh rust 和 go 没有可比性,go 的对标 C# java 更多
barbery
2018-12-17 11:23:54 +08:00
就是这么方便啊,进程监控用 supervisor 啊
jsfaint
2018-12-17 11:24:22 +08:00
Go 可以分成多个模块的~~
有几种方案
1. 动态库方案,编译成 C 的 shared library,这样可以用 C 或者其他语言去做交互
2. 用 Go 自带 plugin 去编译成特殊的动态库
3. 多个 binary 通过 rpc 通讯
circleee
2018-12-17 11:25:29 +08:00
插眼
zicla
2018-12-17 11:28:41 +08:00
插眼
iwtbauh
2018-12-17 11:31:09 +08:00
@trait #27

“ golang 对标 c#” 来源请求

在我看来,golang,rust 都是设计者讨厌 c++而诞生的。目的是做一个性能达到 c++并且简化编程、提升安全性的语言。所以是同一类的。
gamexg
2018-12-17 11:34:59 +08:00
如果用了 cgo(内嵌了 c 代码) 交叉编译就比较麻烦了,需要 c 的那一套交叉编译方式。

另外也不是完全的不依赖,很多情况下还会依赖于 glibc。
nekoyaki
2018-12-17 11:38:25 +08:00
go 程序是可以编译成动态链接的共享库的,好像只在 linux 平台上可以,没试过别的平台。
另外 go 可以被编译为 c 风格的库,嵌入到 python/ruby 里。
rockyou12
2018-12-17 11:41:43 +08:00
@trait go 最开始确实是为了取代 c++,他们觉得 c++特性太多完全是 shit。但对 java、c#,特别是在基础设施这层造成冲击完全是出乎设计者的意料。
trait
2018-12-17 11:43:14 +08:00
@iwtbauh golang gc 系只可能跟 C# java 争市场,怎么可能跟 c/c++对比,google 重新定义系统语言概念,并不是所有人会认同
janxin
2018-12-17 11:50:05 +08:00
1. 做动态库比较麻烦还不好用,还不如单体应用,太大了就拆分走微服务间调用的模式
2. GOPATH 单个就行,走 go mod 或者 vendor 解决多版本间冲突问题;当然空间够用的话多个也不错
3. ...
4. systemd 是 Linux 下系统自带的进程守护方案,什么都不需要装,没什么不好的地方
trait
2018-12-17 11:50:33 +08:00
@rockyou12 完全不是取代 C++,当然 google 重新定义的“系统语言”环境下无可厚非,而是 Rob 亲口 go 方便大学毕业生,显然他们不信任这些新人的内存管理水平,把 C/C++的内存管理权限从菜鸟手中剥夺了,直接放到语言层面。没什么出乎意料的,带 gc 的“系统语言"确不能对内存作出精确管理压榨性能,去跟 gc 系抢饭吃是必然
lideshun123
2018-12-17 11:52:18 +08:00
@daigouspy .net 还有人用吗
keniusahdu
2018-12-17 12:12:38 +08:00
怎么这么多"插眼"的? v2 不是不让水么.

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

https://www.v2ex.com/t/518179

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

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

© 2021 V2EX