当我们从github下载开源的go项目时,开源项目一般都会引入很多其它的开源库,这样我们直接去编译的时候就会提示缺少哪些库,然后一个一个用go get命令安装上,这样是在浪费生命啊!使用glide直接一键安装,还可以管理依赖包的版本号,这样当相关依赖包进行了重大升级时,我们也不怕。

Install glide

  • 方法一: 使用go get安装

    go get github.com/Masterminds/glide
    
  • 方法二: 使用官方安装脚本

    curl https://glide.sh/get | sh
    
  • 方法三: 使用系统自带的安装软件

    # mac osx
    brew install glide
    #arch linux
    pacman -S glide
    

使用

$ glide create                            # Start a new workspace
$ vim glide.yaml                         # and edit away!
$ glide get github.com/Masterminds/cookoo # Get a package and add to glide.yaml
$ glide install                           # Install packages and dependencies
# work, work, work
$ go build                                # Go tools work normally
$ glide up                                # Update to newest versions of the package

glide create(或init)

初始化一个开发环境。在初始化过程中,会自动创建glide.yaml文件,并会尝试猜测依赖包的版本号,并将其写入yaml配置文件中。比如,你的项目使用的Godep管理的,glide会自动探测Godep使用的版本号。

$ glide create
[INFO]	Generating a YAML configuration file and guessing the dependencies
[INFO]	Attempting to import from other package managers (use --skip-import to skip)
[INFO]	Scanning code to look for dependencies
[INFO]	--> Found reference to github.com/Masterminds/semver
[INFO]	--> Found reference to github.com/Masterminds/vcs
[INFO]	--> Found reference to github.com/codegangsta/cli
[INFO]	--> Found reference to gopkg.in/yaml.v2
[INFO]	Writing configuration file (glide.yaml)
[INFO]	Would you like Glide to help you find ways to improve your glide.yaml configuration?
[INFO]	If you want to revisit this step you can use the config-wizard command at any time.
[INFO]	Yes (Y) or No (N)?
n
[INFO]	You can now edit the glide.yaml file. Consider:
[INFO]	--> Using versions and ranges. See https://glide.sh/docs/versions/
[INFO]	--> Adding additional metadata. See https://glide.sh/docs/glide.yaml/
[INFO]	--> Running the config-wizard command to improve the versions in your configuration

glide install

要安装glide.lock文件里面的特定版本的依赖包,使用glide install命令

$ glide install

这个命令会读取glide.lock文件,并会安装特定commit id的版本到此目录下面的vender文件夹中,如果这个文件不存在,运行glide install时将会执行一次update并生成lock文件

使用实例

cd $GOPATH/src
git clone https://github.com/xtaci/kcptun.git
cd kcptun
glide create
glide install
cd server
go build

说明

  1. 一定要放到$GOPATH/src目录下面,要不go build找不到vender目录下面的依赖包。这个是由于go build查找相应的依赖包的机制有关。
  2. 不要直接用go build, 这样会带上debug信息,生成的可执行文件非常大,使用下面命令编译,不带上debug信息

    go build -ldflags "-s -w"
    
  3. 使用-s选项后安装包还是非常大,我们再使用upx工具对其进行终极压缩,可以缩小几倍

    • 安装goupx

      $ pacman -S upx
      $ go get github.com/pwaller/goupx
      
    • 编译大小对比,upx可以对可以执行文件进行压缩并进行一些混淆,这里主要用来作为压缩功能。此处压缩后的大小与gz压缩后的大小差不多

      $ go build
      $ ls -lh
      total 9.5M
      -rw-r--r-- 1 vagrant vagrant 1.2K May 30 23:53 config.go
      -rw-r--r-- 1 vagrant vagrant  11K May 30 23:53 main.go
      -rwxr-xr-x 1 vagrant vagrant 9.5M May 31 00:06 server
      -rw-r--r-- 1 vagrant vagrant  391 May 30 23:53 signal.go
      
      
      $ go build -ldflags "-s -w"
      $ ls -lh
      total 6.4M
      -rw-r--r-- 1 vagrant vagrant 1.2K May 30 23:53 config.go
      -rw-r--r-- 1 vagrant vagrant  11K May 30 23:53 main.go
      -rwxr-xr-x 1 vagrant vagrant 6.4M May 31 00:06 server
      -rw-r--r-- 1 vagrant vagrant  391 May 30 23:53 signal.go
      
      
      $ goupx server
      2017/05/31 00:06:24 {Class:ELFCLASS64 Data:ELFDATA2LSB Version:EV_CURRENT OSABI:ELFOSABI_NONE ABIVersion:0 ByteOrder:LittleEndian Type:ET_EXEC Machine:EM_X86_64 Entry:4570928}
      2017/05/31 00:06:24 File fixed!
                             Ultimate Packer for eXecutables
                                Copyright (C) 1996 - 2017
      UPX 3.94        Markus Oberhumer, Laszlo Molnar & John Reiser   May 12th 2017
      
              File size         Ratio      Format      Name
         --------------------   ------   -----------   -----------
         6644512 ->   2400840   36.13%   linux/amd64   server
      
      Packed 1 file.
      $ ls -lh
      total 2.4M
      -rw-r--r-- 1 vagrant vagrant 1.2K May 30 23:53 config.go
      -rw-r--r-- 1 vagrant vagrant  11K May 30 23:53 main.go
      -rwxr-xr-x 1 vagrant vagrant 2.3M May 31 00:06 server
      -rw-r--r-- 1 vagrant vagrant  391 May 30 23:53 signal.go