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 吧

最后:刚接触,可能有些地方问的不对的还请各位大佬见谅!
12808 次点击
所在节点    程序员
92 条回复
ShayneWang
2018-12-17 10:25:13 +08:00
插眼
hellojinjie
2018-12-17 10:26:27 +08:00
4. supervisorctl 或者 systemctl
Vogan
2018-12-17 10:28:02 +08:00
go 支持交叉编译;
go 编译出来的是二进制文件;
可用 systemd 管理;
Ediacaran
2018-12-17 10:29:27 +08:00
1 应该是只有一个二进制文件,没见过 go 用动态链接库的

顺便插眼
daigouspy
2018-12-17 10:29:43 +08:00
谁说.net 一定要提前部署环境?
ETiV
2018-12-17 10:34:42 +08:00
pm2 也支持任意可执行程序的运行的~

偷懒就都用 pm2 …

服务器上也可以用 docker 拉起来
richangfan
2018-12-17 10:37:08 +08:00
“一次编译,处处运行”不服
RqPS6rhmP3Nyn3Tm
2018-12-17 10:39:07 +08:00
go 是真的牛逼,跨架构直接编译成一个 binary,复制上去就能跑
我不会写 go,但是有一次编译 armv7 的 ss-go,指定 CPU 就能直接编译出一个 binary,没有任何依赖问题,对年轻的我造成了巨大的冲击
heimeil
2018-12-17 10:41:02 +08:00
1. 可以随意组织项目结构,随便分多少都行,只要你愿意;
2. GOPATH 一般情况都是一个,用目录区分,$GOPATH/src/<源码托管站域名>/<ID>/项目,不过也可以很随意,看个人或团队习惯;
3. 编译成二进制文件随便怎么改名都行,在 Linux 上只要保证权限正确就行了;
4. 我个人喜欢用 docker 托管,其他方法也很多。

另外 Golang 不是不用装环境,而是环境都在编译的二进制文件里面了,你会发现 Go 编译出来的二进制比.NET 之类的大太多了。
hnpyhyz
2018-12-17 10:42:23 +08:00
战略插眼
a719114136
2018-12-17 10:43:24 +08:00
1. go 编译时把所有用到的东西、运行环境都放到一个文件里了,所以其他平台没安装 go 也可以运行。至于生成多个块没研究过,go 编译时有个参数-buildmode,不知道能不能做到这个。
2. GOPATH 设置看习惯了,两种方式:每个项目有每个项目的 GOPATH,或者所有项目用一个 GOPATH。
3. 是
4. 进程管理工具都是通用的,有:supervisor,Upstart,Systemd 都可以
zarte
2018-12-17 10:45:21 +08:00
1.按微服务一个个开发。
2.我是在底下按文件夹分
3.是的
4.supervior 这类守护
v2xe2v
2018-12-17 10:46:02 +08:00
docker 了解一下
lfzyx
2018-12-17 10:49:24 +08:00
systemd

不管什么服务都推荐 docker 的,不是坏就是蠢
giuem
2018-12-17 10:49:56 +08:00
自从有了 go mod 之后,只要一个全局的 GOPATH,项目随便放,不需要非得放 GAPATH 下
zst
2018-12-17 10:52:05 +08:00
3.是的
4.用 systemd 就好

顺便问一下除了 go 还有有哪些不用安装依赖的😊
TinyKube
2018-12-17 10:56:04 +08:00
@giuem +1 GOPATH 各种不方便
iwtbauh
2018-12-17 10:58:52 +08:00
这正是我讨厌 golang 的原因

必须静态连接,无法动态连接,为什么不能拨出来一个 libgolang.so ?如果系统中都是 golang 编写的程序,那得多浪费多少内存啊(同样的代码被数次加载到主存),你们发现没有,Google 的软件从来都是不管内存占用的 。

由于静态连接,导致无法使用 dlopen 等方法动态载入共享对象到内存。这对于希望在运行时动态加载二进制插件的程序是灾难性的。

由于静态连接,程序体积膨胀。

由于没有共享库机制,使二进制代码重用非常困难。

所以,我站 rust,不知道比 golang 高到哪里去了
liuxey
2018-12-17 11:02:50 +08:00
@iwtbauh #18 Java 我觉得还是场景问题,rust 和 golang 主战场并不一样。
wentaoliang
2018-12-17 11:03:31 +08:00
1.go 最后打包出来的可执行文件永远只有一个吗?有没有可能根据我的业务逻辑分别打包成几大块(例如:main、lib1、lib2 ),虽然好像这样意义也不大?

go 是静态编译, 所以是只有一个;但是也是可以采取动态编译的,如果你想根据业务逻辑分别打包还是比较难受的,建议还是静态编译。

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

1.9 版本之前确实 GOPATH 比较蛋疼, 要么设置一个 GOPATH, 所有项目都放一起;要么每个项目设置一个 GOPATH, 写个 shell 放项目下, 然后开发哪个项目就运行下切换下 GOPATH, 但是 1.9 版本引入了 go mod, 可以摆脱对 GOPATH 对依赖,也是未来 go 的官方解决方案, 推荐使用 go mod


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

对的

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

supervisord 可以监控进程

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

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

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

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

© 2021 V2EX