人员、任务、进度、工时、周期、依赖关系 一目了然。无论项目大小、简单复杂都能轻松管理
话说前几天我遇到了一个死锁问题,当时想了一些办法糊弄过去了,不过并没有搞明白问题的细节,周末想起来便继续研究了一下,最终便有了这篇文章。
让我们搞一段简单的代码来重现一下当时我遇到的问题:
package main
import sync
func main() {
var wg sync.WaitGroup
foo := make(chan int)
bar := make(chan int)
closing := make(chan struct{})
w
话说前几天我遇到了一个死锁问题,当时想了一些办法糊弄过去了,不过并没有搞明白问题的细节,周末想起来便继续研究了一下,最终便有了这篇文章。
让我们搞一段简单的代码来重现一下当时我遇到的问题:
package main
import sync
func main() {
var wg sync.WaitGroup
foo := make(chan int)
bar := make(chan int)
closing := make(chan struct{})
w
最近我遇到了一个在 docker 环境导入私有仓库的问题:一个 Golang 项目,使用 gitlab ci 来发布,通过 gitlab runner 调用 docker-compose 来打包,但是在构建时失败了。
让我们重回案发现场,看看问题是怎么产生的:
首先是 .gitlab-ci.yml 文件,其相关代码片段内容如下:
build_job:
stage: build
script:
- make docker-build
然后是 Makefile
最近我遇到了一个在 docker 环境导入私有仓库的问题:一个 Golang 项目,使用 gitlab ci 来发布,通过 gitlab runner 调用 docker-compose 来打包,但是在构建时失败了。
让我们重回案发现场,看看问题是怎么产生的:
首先是 .gitlab-ci.yml 文件,其相关代码片段内容如下:
build_job:
stage: build
script:
- make docker-build
然后是 Makefile
我平常有一个习惯,就是不断看以前写的代码,想着有没有哪些方面可以改进,如果每天能把代码可读性量变 1%,那么日积月累就是质变:前些天我们写过一次对 Makefile 的重构,去掉了一处重复代码的坏味道,没过多久我便又发现了一处重复代码的坏味道,本文就让我们看看如何消灭它!
让我们先把问题的来龙去脉搞清楚,在 Golang 项目里,一般推荐在根目录创建一个名为 tools.go 的文件,里面记录本项目依赖的相关工具,比如我的某个项目的 tools.go 如下:
// +bu
我平常有一个习惯,就是不断看以前写的代码,想着有没有哪些方面可以改进,如果每天能把代码可读性量变 1%,那么日积月累就是质变:前些天我们写过一次对 Makefile 的重构,去掉了一处重复代码的坏味道,没过多久我便又发现了一处重复代码的坏味道,本文就让我们看看如何消灭它!
让我们先把问题的来龙去脉搞清楚,在 Golang 项目里,一般推荐在根目录创建一个名为 tools.go 的文件,里面记录本项目依赖的相关工具,比如我的某个项目的 tools.go 如下:
// +bu
如果你不了解 Makefile 的话,那么推荐看看阮一峰的文章「Make 命令教程」。本文通过一个重构的例子带你写出味道更好的 Makefile,让我们开始吧!
假设有一个名为 foo 的项目,用 golang 开发,在 docker 上部署,其 Makefile 如下:
APP = $(shell basename ${CURDIR})
TAG = $(shell git log --pretty=format:%cd.%h --date=short -1)
.PHON
如果你不了解 Makefile 的话,那么推荐看看阮一峰的文章「Make 命令教程」。本文通过一个重构的例子带你写出味道更好的 Makefile,让我们开始吧!
假设有一个名为 foo 的项目,用 golang 开发,在 docker 上部署,其 Makefile 如下:
APP = $(shell basename ${CURDIR})
TAG = $(shell git log --pretty=format:%cd.%h --date=short -1)
.PHON
最近一直在开发某个 OCR 项目:底层用的是 ABBYY 提供的 FineReader 引擎,应用层把 FineReader 包装成 gRPC 对外提供服务,因为 FineReader 项目是 C++ 实现的,而我们团队使用的编程语言是 Golang,所以二者间通过 CGO 来完成交互。整个项目没有什么特殊的需求,只是鉴于 OCR 耗时较长,为了提升产品体验,要求在处理过程中:客户端可以主动退出;服务端能够实时返回已处理百分比。下面是根据需求画出来的流程图:
流程图
看上去很
最近一直在开发某个 OCR 项目:底层用的是 ABBYY 提供的 FineReader 引擎,应用层把 FineReader 包装成 gRPC 对外提供服务,因为 FineReader 项目是 C++ 实现的,而我们团队使用的编程语言是 Golang,所以二者间通过 CGO 来完成交互。整个项目没有什么特殊的需求,只是鉴于 OCR 耗时较长,为了提升产品体验,要求在处理过程中:客户端可以主动退出;服务端能够实时返回已处理百分比。下面是根据需求画出来的流程图:
流程图
看上去很