迪克猪的博客
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

go-etl在macos下编译若干问题

一、go-etl简介

1.1 go-etl是什么

go-etl是一个集数据源抽取,转化,加载的工具集,提供强大的数据同步能力。

1.2 go-etl有什么功能

  • 主流数据库的数据抽取以及数据加载的能力,在storage包中实现
  • 类二维表的数据流的数据抽取以及数据加载的能力,在stream包中实现
  • 类似datax的数据同步能力,在datax包中实现

1.3 go-etl的优势

本数据数据同步工具以下数据源的同步能力

1.4 go-etl源码地址

https://github.com/Breeze0806/go-etl

二、在macos环境下编译

2.1 下载源码

创建自己的工作版本,然后下载源码

git clone https://github.com/zsy619/go-etl.git

2.2 阅读readme.md

主要注意事项如下:

  • 只提供了linux与windows编译的脚本,macos下没有提供编译脚本
  • oracle主要依赖的类库:
    • github.com/godror/godror
    • 安装相关的oracle类库,请从官网下载并安装
    • 本机安装目录:/Volumes/D/oracle/instantclient_19_16
  • 排除对db2编译
  • 启用cgo——CGO_ENABLED=1
  • 这个工具现在就支持单表单任务数据同步,如要做定时同步,请使用crontab或者其他定时任务工具

2.3 macos下第一次编译

步骤一:添加缺少文件

cmd/datax/tools/script_darwin.go
storage/database/db2/decode_chinese_darwin.go

步骤二:根据release.bat构建自己的编译脚本

export IGNORE_PACKAGES=db2
set GO111MODULE=on
go mod download
go mod vendor   
go generate ./...
cd cmd/datax
go build -o datax-darwin
cp -f datax-darwin ../../release/datax-darwin
chmod -R 777 ../../release/datax-darwin
rm -f datax-darwin
cd ../..
go run tools/datax/release/main.go

步骤三:macos编译下提示错误:

../../vendor/github.com/godror/godror/orahlp.go:563:19: undefined: VersionInfo

步骤四:经过N次尝试,发现godror类库在macos下无法编译,最终找到如下命令,需要安装gcc

brew install gcc
gcc -v
Apple clang version 15.0.0 (clang-1500.3.9.4)
Target: x86_64-apple-darwin23.5.0
Thread model: posix

2.4 解决oracle类库

2.5 解决交叉编译生成windows应用问题

错误提示: gcc_libinit_windows.c:6:10: fatal error: ‘windows.h’ file not found 解决方案:

  • 使用mingw-w64工具进行交叉编译
  • MinGW-w64不仅能编译为Win64程序,也能编译为Win32程序。
  • MinGW-w64同样是跨平台软件,可以运行在Windows、GNU/Linux、macOS中。
  • MinGW-w64官网:http://mingw-w64.org
  • MacOS下安装mingw-w64
    brew install mingw-w64
    
  • 最终交叉编译命令
# CGO_ENABLED=1 CC=x86_64-w64-mingw32-gcc CXX=x86_64-w64-mingw32-g++ GOOS=windows GOARCH=amd64 go build -v -o datax.exe
  • 验证生成的文件
    file datax.exe
    datax.exe: PE32+ executable (console) x86-64, for MS Windows  
    
    说明生成成功~~~

三、遗留问题

针对linux下交叉编译,还是有问题,暂未解决,后期补充。

linux_syscall.c:67:13: error: call to undeclared function 'setresgid'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
linux_syscall.c:67:13: note: did you mean 'setregid'?
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/unistd.h:593:6: note: 'setregid' declared here
linux_syscall.c:73:13: error: call to undeclared function 'setresuid'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
linux_syscall.c:73:13: note: did you mean 'setreuid'?
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/unistd.h:595:6: note: 'setreuid' declared here

四、总结

  • 在macos下编译go-etl,主要解决oracle类库以及交叉编译生成windows应用问题
  • 在macox下交叉编译linux应用,还是有问题,暂未解决,后期补充。
  • 最终交叉编译脚本如下:
    	#!/bin/bash
    
      sh cover.sh
    
      export IGNORE_PACKAGES=db2
      export CGO_ENABLED=1
      export GO111MODULE=on
      go mod download
      go mod vendor
      go generate ./...
      cd cmd/datax
    
      # 【darwin/amd64】
      echo "start build darwin/amd64 ..."
      CGO_ENABLED=1 GOOS=darwin GOARCH=amd64 go build -o datax-darwin
      cp -f datax-darwin ../../release/datax-darwin
      chmod -R 777 ../../release/datax-darwin
      rm -f datax-darwin
    
      # 【linux/amd64】
      # echo "start build linux/amd64 ..."
      # CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -o datax-linux
      # cp -f datax-linux ../../release/datax-linux
      # chmod -R 777 ../../release/datax-linux
      # rm -f datax-linux
    
      # 【windows/amd64】
      echo "start build windows/amd64 ..."
      CGO_ENABLED=1 CC=x86_64-w64-mingw32-gcc CXX=x86_64-w64-mingw32-g++ GOOS=windows GOARCH=amd64 go build -v -o datax.exe
      cp -f datax.exe ../../release/datax.exe
      chmod -R 777 ../../release/datax.exe
      rm -f datax.exe
    
      cd ../..
      go run tools/datax/release/main.go
    
  • 详细代码查看