Gop - 编译和管理在GOPATH之外的Go工程

安装

go get github.com/lunny/gop

起子

自开始使用Go进行开发之后,工程一直都保存在GOPATH之下,Go1.5支持 vendor 机制之后开始使用 govendor 来管理依赖项。其实一直都有需求要将 Go 的工程放在 GOPATH 之外,因为在一个大的项目中,各种语言写的内容放在一个 git 工程的子文件夹中,但一直没有很好的工具来解决依赖的问题。

几个月之前,这个问题已经严重影响到工作了,终于不能忍受了。于是动手写了 Gop 的首个版本,最近又升级到了0.3版本。最新版本的 Gop 工程目录结构如下:

<project root>
├── gop.yml
├── bin
├── doc
└── src
    ├── main
    │   └── main.go
    ├── models
    │   └── models.go
    ├── routes
    │   └── routes.go
    └── vendor
        └── github.com
            ├── go-xorm
            │   ├── builder
            │   ├── core
            │   └── xorm
            └── lunny
                ├── log
                └── tango

通过以上的目录结构可以看到,其实gop是兼容GOPATH的。只要把 <project root> 设置到GOPATH中,即使没有安装gop命令,通过go命令也可以编译,但是这时对 vendor 管理也是不太方便。但如果使用 gop 来管理项目,则问题迎刃而解。

其中 gop.yml 的结构如下:

targets:
- name: myproject1
  dir: main
  assets:
  - templates
  - public
  - config.ini
  - key.pem
  - cert.pem
- name: myproject2
  dir: web
  assets:
  - templates
  - public
  - config.ini

除了可以放到 GOPATH 之外,Gop 工程还具有以下特性:

  • 多编译目标支持

默认的编译目标是 src/main 目录,编译名字是 src 的父目录的名字,当然你也可以通过 gop.yml 来自定义。如果输入gop build 命令,默认会编译第一个编译目标。如果指定了编译目标,如 gop build myproject2 那么将会编译指定的目标。默认编译好的可执行文件会放在 src/main/ 目录下,也可以通过 gop build -o ./bin/my.exe 来进行指定。除了 <target> 参数外,其它的参数和 go build 的参数相同。

  • 依赖管理

一般只需要执行 gop ensure -g 即可将所有的依赖项全部下载且拷贝到 vendor 下。如果依赖项需要更新,也可以使用 gop ensure -u 将所有的依赖项更新到最新的版本。不再需要的依赖项,可以通过 gop rm <package1> <package2> 删除,通过 gop status 可以查看默认编译目标的依赖项的安装情况。

  • 编译并运行某个目标

gop run 可以让你编译并运行某个目标,通过 -w,在源码修改之后还可以自动重新编译并运行。

  • 发布管理

gop release 编译,打包资源并拷贝到 bin 目录下。

blog comments powered by Disqus