- vừa được xem lúc

Build ứng dụng Cross Platform với Go và CGO

0 0 37

Người đăng: HendrickPhan

Theo Viblo Asia

1. Giới thiệu

Go là một ngôn ngữ lập trình được đi kèm với các bộ công cụ mạnh mẽ giúp cho việc tải các package và build file thực thi rất đơn giản. Một trong những tính năng hay nhất của Go đó là khả năng build file thực thi cho đa nền tảng, miễn là Go support (các nền tảng này mình sẽ đề cập ở dưới). Điều này giúp cho chúng ta test cũng như triển khai ứng dụng, package của mình trên các nền tảng 1 cách dễ dàng, bởi vì không cần phải vào từng nền tảng để tiến hành build lại nữa. Tuy nhiên cũng sẽ có những trường hợp mà chúng ta sẽ không thể chỉ dùng mỗi go để có thể build đa nền tảng. Trong bài này mình sẽ hướng dẫn các bạn build đa nền tảng với Go và CGO

2. Sử dụng go build để build cross platform

Chúng ta sẽ tạo 1 ứng dụng go đơn giản: In ra màn hình Hello From Go package main
import "fmt" func main() { fmt.Println("Hello from go")
}

Vì mình đang sử dụng MacOS nên để build file thực thi cho thì chỉ cần chạy:
go build
và để phân biệt được các file thực thi mình sẽ chỉ định cụ thể file được build ra bằng cách dùng -o file_name như sau:
go build -o mac_exe

Khi này ở thư mục của project mình đã có được 1 file mới là mac_exe. Để chạy file này thì mình chỉ cần chạy ./mac_exe. Kết quả hiển thị sẽ là Hello from go
Tiếp đến mình sẽ build thêm cho windows và ubuntu.
Để build cho các nền tảng khác thì chúng ta sẽ cần phải xác định được hệ điều hành (os), và architecture của chip. Dưới đây là 1 số os và architecture:

OS ARCH
android arm
darwin 386
darwin amd64
darwin arm
darwin arm64
dragonfly amd64
freebsd 386
freebsd amd64
freebsd arm
linux 386
linux amd64
linux arm
linux arm64
linux ppc64
linux ppc64le
linux mips
linux mipsle
linux mips64
linux mips64le
netbsd 386
netbsd amd64
netbsd arm
openbsd 386
openbsd amd64
openbsd arm
plan9 386
plan9 amd64
solaris amd64
windows 386
windows amd64

Khi đã xác định được 2 giá trị này thì chúng ta chỉ việc set GOOS và GOARCH khi build như sau để build cho windowns và linux:

GOOS=linux GOARCH=amd64 go build -o linux_exe .
GOOS=windows GOARCH=amd64 go build -o windows_exe.exe .
Vậy là chúng ta đã build được 3 file thực thi cho cả 3 hệ điều hành là macos, ubuntu, windows.

3. CGO và go build

Go cũng hỗ trợ chúng ta nhũng code C, C++ thông qua CGO. Đây là 1 chương trình đơn giản mà mình sẽ nhúng thêm C vào trong Go.

cheader.h:

#include <stdio.h>
void Hello();

csource.c:

#include "cheader.h"
void Hello(){ printf("Hello from C\n");
}

main.go:

package main /* #include "cheader.h"
*/
import "C"
import "fmt" func main() { fmt.Println("Hello from Go") C.Hello()
}

Khi sử dụng lệnh go build, chúng ta vẫn có thể build ra được file thực thi trên môi trường hiện tại.
Nhưng khi set GOOS và GOARCH chúng ta sẽ bị lỗi build constraints exclude all Go files

4. Sử dụng elastic Docker image để build cross platform cgo

Một trong nhưng cách đơn giản nhất mà mình hay dùng để giải quyết vấn đề cross build với cgo đó chính là sử dụng docker image này do elastic phát triển để build: https://github.com/elastic/golang-crossbuild
Để sử dụng được image thì trước tiên các bạn phải cài đặt docker trong máy của mình. Sau đó chúng ta vào https://github.com/elastic/golang-crossbuild/tags và chọn version go muốn chạy.
Ở đây mình sẽ chọn là 1.18 và để build cho ubuntu và window nên sẽ dùng image này docker.elastic.co/beats-dev/golang-crossbuild:1.18-main
Cuối cùng chỉ cẩn chạy (thay PROJECT_PATH bằng path đến code của các bạn):
Ubuntu:

docker run -it --rm \ -v PROJECT_PATH:/go/src/app \ -w /go/src/app \ -e CGO_ENABLED=1 \
docker.elastic.co/beats-dev/golang-crossbuild:1.18-main\ --build-cmd "go build -o linux_exe" \ -p "linux/amd64"

Windows:

docker run -it --rm \ -v PROJECT_PATH:/go/src/app \ -w /go/src/app \ -e CGO_ENABLED=1 \
docker.elastic.co/beats-dev/golang-crossbuild:1.18-main\ --build-cmd "go build -o windows_exe.exe" \ -p "windows/amd64"

Sau khi chạy thì mình đã có được 2 file thực thi cho linux và window trong thư mục của project.

5. Tổng kết

Như vậy mình đã giới thiệu sơ qua cách build cross platform cho go cũng như 1 cách để build cgo. Hẹn gặp các bạn ở những bài sau.

Bình luận

Bài viết tương tự

- vừa được xem lúc

gRPC - Nó là gì và có nên sử dụng hay không?

Nhân một ngày rảnh rỗi, mình ngồi đọc lại RPC cũng như gRPC viết lại để nhớ lâu hơn. Vấn đề là gì và tại sao cần nó .

0 0 131

- vừa được xem lúc

Embedded Template in Go

Getting Start. Part of developing a web application usually revolves around working with HTML as user interface.

0 0 56

- vừa được xem lúc

Tạo Resful API đơn giản với Echo framework và MySQL

1. Giới thiệu.

0 0 60

- vừa được xem lúc

Sử dụng goquery trong golang để crawler thông tin các website Việt Nam bị deface trên mirror-h.org

. Trong bài viết này, mình sẽ cùng mọi người khám phá một package thu thập dữ liệu có tên là goquery của golang. Mục tiêu chính của chương trình crawler này sẽ là lấy thông tin các website Việt Nam bị deface (là tấn công, phá hoại website, làm thay đổi giao diện hiển thị của một trang web, khi người

0 0 237

- vừa được xem lúc

Tạo ứng dụng craw dữ liệu bing với Golang, Mysql driver

Chào mọi người . Lâu lâu ta lại gặp nhau 1 lần, để tiếp tục series chia sẻ kiến thức về tech, hôm nay mình sẽ tìm hiểu và chia sẻ về 1 ngôn ngữ đang khá hot trong cộng đồng IT đó là Golang.

0 0 75

- vừa được xem lúc

Golang: Rest api and routing using MUX

Routing with MUX. Let's create a simple CRUD api for a blog site. # All . GET articles/ .

0 0 54