首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

记又一次对Makefile重构

平常有一个习惯,就是不断看以前写代码,想着有没有哪些方面可以改进,如果每天能把代码可读性量变​ 1%,那么日积月累就是质变:前些天我们写过一次对 Makefile 重构,去掉了一处重复代码坏味道...,没过多久便又发现了一处重复代码坏味道,本文就让我们看看如何消灭它!..." _ "google.golang.org/protobuf/cmd/protoc-gen-go" ) 如此一来,执行「go mod tidy」时候,依赖工具版本信息就会记录到 go.mod,.../dasel/cmd/dasel \ google.golang.org/grpc/cmd/protoc-gen-go-grpc \ google.golang.org/protobuf/cmd...下面让我们看看如何重构:tools.go 和 Makefile 比起来,肯定 tools.go 更重要,它是不能改,所以我们要去掉 Makefile 里重复代码,更具体点来说是最好能在 Makefile

25120

重构:保持Dockerfile整洁5个技巧

Dockerfile超出合理范围,会出现以下问题: 很难理解和维护-我们需要阅读数百行以了解所有依赖关系 在这么多行之间可能忽略一个明显安全问题 每个人都在更改同一文件,Git将引发更多冲突...例如:需要使用terraform没必要再重新apt-get安装了,可以直接使用带有terraform官方镜像。...总是觉得拥有三种类型标签非常有用: 分支名称:标识特定分支镜像最新版本 注意:为什么不使用latest?使用时latest,永远不知道它是表示整个存储库中最新稳定版本还是最新版本。...建议使用语义版本控制(major.minor.patch)。 提交:一直想知道标签所指向提交。现在,您可以通过在存储库中创建版本标记来执行此操作。...但是,这不可能,只需使用其Commit SHA标记镜像即可。 ---- 谢谢阅读,希望您可以更轻松地维护Dockerfile。

1K30
您找到你想要的搜索结果了吗?
是的
没有找到

Go——依赖管理

Moving executable to /home/baxiang/go/bin/dep MacOS 使用 Homebrew安装 $ brew install dep $ brew upgrade dep...除了go.mod之外,go命令还维护一个名为go.sum文件,其中包含特定模块版本内容预期加密哈希,go.sum 文件不需要手工维护。...go mod使用vendor目录 如果你不喜欢 go mod 缓存方式,你可以使用vendor命令回到 godep 或 govendor 使用 vendor 目录进行包管理方式。...发布也只需要和使用 godep 一样将 vendor 目录带上即可 依赖包版本管理 :gin-gonic baxiang$ tree -L 1 . ├── gin@v0.0.0-20190328061400...如果,在go.mod用require语句指定包和版本 ,go命令会根据指定路径和版本下载包, 指定版本可以用latest,这样它会自动下载指定包最新版本;如果包作者还没有标记版本,默认为 v0.0.0

1.3K20

Go 包管理机制深入分析

一般来说,GOPATH 目录下会包含 pkg、src 和 bin 三个子目录,这三个目录各有用处。...src 目录用来放置代码源文件,在进行 import ,是使用这个位置作为根目录。自己编写代码也应该放在这下面,不同项目放在不同目录下进行管理。...项目在 src 目录下管理,多个项目可能都会使用相同依赖,如果每个项目都存一份依赖显然会带来大量冗余,这里我们推荐一个设置 GOPATH 环境变量小技巧。...dep 是一个开源项目, 大家可以在 https://github.com/golang/dep 了解详细信息,其安装方式大家可以参考官方说明,这里我们主要介绍其使用。...关于 dep 更多深入内容,可以参考  https://golang.github.io/dep/docs/introduction.html 总结 Go dep 目前是一款比较好用依赖管理工具,很多比较大型项目都在使用

79540

《快学 Go 语言》第 16 课 —— 包管理 GOPATH 和 Vendor

默认会使用 https 协议下载代码仓库 ,可以使用 -insecure 参数切换到 http 协议。...其它项目导入这个包,import 语句后面的路径是 mongo 包目录路径,而使用包名却是这个目录下面代码中 package 语句声明包名 mgo。...讲到这里还有一个很重要问题没有解决,github 上有很多开源项目,这些项目都有多个版本号,如何引入具体某一个版本呢?...使用它之前我们需要将 dep 工具安装到 GOPATH 下面 $ go get github.com/golang/dep 同时需要将 ~/go/bin 目录加入到环境变量 PATH 中,因为 dep...但是令人意外dep 居然表示不能直接解决「钻石型」依赖,这让感受到了它危机,在 dep 中依赖包是扁平化,vendor 不允许嵌套。如果出现了版本冲突,需要使用某种特殊手段来解决。

1.1K40

GO 依赖管理工具go Modules(官方推荐)

以前写过一篇关于go管理依赖包工具 dep文章,当时认为dep将会成为官方依赖工具,现在看来是自己图样图斯内幕破了,正如官方一直提到dep是“official experiment”官方实验项目的那样...当然现在 随着模块一起推出还有模块代理协议(Module proxy protocol),通过这个协议我们可以实现 Go 模块代理(Go module proxy),也就是依赖镜像。...GO111MODULE: 这个环境变量主要是 Go modules 开关,主要有以下参数: auto:只在项目包含了 go.mod 文件启用 Go modules,在 Go 1.13 中仍然是默认值...,Go 自动尝试列表中下一个,遇见 “direct” 回源,遇见 EOF 终止并抛出类似 “invalid version: unknown revision...”...那什么情况下会不存在 zip hash 呢,就是 Go 认为肯定用不到某个模块版本时候就会省略它 zip hash,就会出现不存在 zip hash,只存在 go.mod hash 情况。

1.6K41

如何实现 Go Module 依赖关系可视化

于是,也花了一些时间研究了下。期间,遇到了一个需求,如何清晰地识别模块中依赖项之间关系。一番了解后,发现了 go mod graph。...二是之前手里有一个项目,包管理一直用dep。于是,也了解了下它,把官方文档仔细读了一遍。其中某个章节介绍了依赖项可视化展示方法。...再看下它使用,发现都是通过管道命令组合方式,而且前面的部分基本相同,都是 dep status -dot | dot -T png。...接收管道输入 先要检查数据输入管道是否正常。 我们目标是使用类似 dep 中作图方式,go mod graph 通过管道将数据传递给 modv。...接下来就是使用了。 使用体验 开始体验下吧。补充一句,这个工具,现在只测试了 Mac 下使用,如有问题,欢迎提出来。

2.8K10

Gin 框架 - 安装和路由配置

概述 看下 Gin 框架官方介绍: Gin 是一个用 Go (Golang) 编写 web 框架。...这篇文章分享 Gin 安装和Gin 路由配置。 路由配置包含功能点如下: 实现了,路由分组 v1版本、v2版本。 实现了,生成签名和验证验证。 实现了,在配置文件中读取配置。...框架安装可以参考官网: https://gin-gonic.com/zh-cn/docs/quickstart/ 在安装,用dep 安装,给大家分享下。 dep 是啥 ?...本机是 Mac,安装只需一个命令: brew install dep 咱们接下来创建一个新项目:ginDemo。...对了,还有一个点没说,就是如何读取配置文件中配置,是这样做: package config const ( PORT = ":8080" APP_NAME = "ginDemo

1.5K40

初窥dep

在编译(godep go build)godep通过临时修改GOPATH环境变量方法让go编译器使用缓存在Godeps/_workspace下项目依赖特定版本第三方包,这样保证了项目不再受制于依赖第三方包...下第三方包如何进行管理问题:依赖包分析、记录和获取等,进而实现项目的reproducible build。...这里也让比较困惑! 三、dep探索 上面的dep使用基本工作流完全可以满足日常包管理需求了。但对于喜欢求甚解来说,必要要探索一下dep背后行为和原理。...但目前使用dep版本还没有实现这个功能,其默认工作方式依旧是先GOPATH mode,如果没有找到依赖包存在,则针对该包实施network mode。...但失败背后还有一层原因,那就是dep设计要求flatten vendor,即使用dep项目只能有一个root vendor,所以直接依赖或传递依赖包中包含vendor,vendor目录也都会被strip

1.8K80

使用Go构建一个Data Thrashing CLI工具

使用Cobra之前,需要安装Go依赖管理工具dep使用下面的命令来安装或者升级。...brew install dep brew upgrade dep 如果你用不是MacOS或者brew命令 ,你也可以通过 go get方式来安装,执行go get -u github.com/golang...对你项目的根目录初始化命令是dep Init接下来会详细说明。 首先,使用Cobra CLI为自己CLI生成初始代码。...接下来,使用dep(包括dep init命令)来设置项目,第一次拉取依赖关系如下: 当我执行这个命令dep完成了以下操作。 查找已经存在管理依赖关系文件进行转换。...有关dep更多信息,请查看github上项目README。 下一个添加依赖项是faker,使用dep命令如下。

88500

Dockerfile 最佳实践及示例

而在前两步会有大量镜像体积冗余,使用多阶段构建可以避免这一问题 这是构建 Go 应用一个示例 FROM golang:1.11-alpine AS build # Install tools required.../dep/cmd/dep # List project dependencies with Gopkg.toml and Gopkg.lock # These layers are only re-built...,可以参考 如何使用 docker 高效部署前端应用[2] FROM node:10-alpine as builder ENV PROJECT_ENV production ENV NODE_ENV...如前端应用使用 npm install --production 只装生产环境所依赖包。 一个容器只做一件事 如一个 web 应用将会包含三个部分,web 服务,数据库与缓存。...如在个人服务器中,使用 traefik 做负载均衡与服务发现,所有应用及数据库都在 traefik_default 网络下,详情参考 使用 traefik 做负载均衡与服务发现 version:

1.1K30

Go 中 gRPC 入门详解

Protocol Buffers Protocol Buffers 是一个与编程语言无关、与平台无关可拓展机制,用于序列化结构数据,是一种数据交换格式,gRPC 使用 protoc 作为协议处理工具。...,test.pb.go 使用包名是 main,所以在编译,需要把多个 go 文件一起编译: go build ....一个 message 中,每个字段都有唯一编号,这些数字用于标识二进制格式字段(数据传输时会被压缩等),编号范围是 1-15 ,存储编号需要一个字节,也就是说 message 中字段尽量不超过...例如: repeated int32 samples = 4 [packed=true]; 在可选字段中 optional 中,我们可以为其设置一个默认值,传递消息如果没有填写此字段,则使用其默认值...前面提到了 protoc,可以将协议文件转为为具体代码。 为了兼容各种编程语言,我们协议设置 _package,这样可以支持生成不同语言代码设置包/库名称。

2.9K20

【Vue原理】依赖收集 - 源码版之基本数据类型

我们今天来看源码流程 首先,响应式更新,分为两步,依赖收集和依赖更新 今天讲的是依赖收集,如何去收集 使用了数据地方 依赖收集,又分为两个流程 1、数据初始化流程 2、依赖收集流程 当前篇,先以基本数据类型为例讲解...(obj, key) { // dep 用于中收集所有 依赖 东西 var dep = new Dep(); var val = obj[key]...正在使用数据,数据就要收集这个watcher 你可以先不用管 Dep.target 到底是怎么指向,你只用记住 在 watcher 比如当前页面开始渲染Dep.target 会提前指向当前页面的...watcher,就可以调用 watcher 去更新了 watcher 在 依赖收集中只起到被收集作用,所以不会在这里详细解释 2、Dep Dep 是一个构造函数,用于创建实例,并带有很多方法 实例会包含一个属性...东西发售,就会打你电话通知你,让你来领取(完成更新)。

41630

干货满满 Go Modules 和 goproxy.cn

如果说 Go 1.11 和 Go 1.12 由于模块不完善你不愿意切入,那么 Go 1.13 你则可以大胆地开始放心使用。...本次分享将讨论如何使用模块和模块代理,以及在它们使用中会常遇见坑,还会讲解如何快速搭建自己私有模块代理,并简单地介绍一下七牛云推出 goproxy.cn 以及它出现对于中国 Go 语言开发者来说重要在何处...GO111MODULE 这个环境变量主要是 Go modules 开关,主要有以下参数: auto:只在项目包含了 go.mod 文件启用 Go modules,在 Go 1.13 中仍然是默认值,...Q&A Q:如何解决 Go 1.13 在从 GitLab 拉取模块版本遇到,Go 错误地按照非期望值路径寻找目标模块版本结果致使最终目标模块拉取失败问题?...Q:使用 Go modules 可以同时依赖同一个模块不同两个或者多个小版本(修订版本号不同)吗?

1.1K11

vue响应式原理实现

大家好,又见面了,是你们朋友全栈君。 Vue 最独特特性之一,是其非侵入性响应式系统。数据模型仅仅是普通 JavaScript 对象。而当你修改它们,视图会进行更新。...本文整理较为粗糙,大体说明了一下响应式实现过程,很多地方直接使用模拟数据,不过整体流程还是比较清晰。 ---- 数据劫持 听起来这个词挺唬人,换句话讲就是如何对监听一个对象改变?...即可 因为指向就是watcher本身,Dep.target主要作用就是代指某个watcher,添加完之后设置Dep.target = null。...比如说{ {message}}这个变量 在头部、尾部、导航中都有用到,那{ {message}}改变时候如何同时所有调用它地方呢?...watcher是每个{ {message}} Dep包含所有watcher集合。

57410

Go语言|go version命令高级用法

go version这个命令相信大家已经非常熟悉了,使用它可以查看我们自己电脑上Go SDK版本。...显示帮助内容比较多,截取一部分。从该命令用法来看,它可以接受多个文件,用于打印这些文件构建版本信息。现在来通过一些例子演示该命令高级用法。...,从结果看,电脑里goimports是使用go1.13版本构建。...小提示:传递给go version文件要是绝对路径,以上示例是因为正好在$GOBIN目录下,所以可以省略路径,直接使用文件名。...比如gocode,可以看出它github地址是github.com/mdempsky/gocode,模块名也一样,并且依赖了golang.org/x/tools库,并且还显示了库版本。

10.3K20

vue原理及其手撸(一)

就形成不了自身技术竞争力。在解决关键问题还得靠大神同事。这就是技术壁垒。 本节将尝试手撸一个核心vue代码。不妨称之为Due,因为这是同事口头禅。也是火大唾上最狠一句。...编译生成函数被实际渲染时候,会触发getter进行依赖收集,数据变化时,触发setter进行更新。 看一下原理。...当你打印出obj.name,执行get。因为我们设置,get还顺便返回了div#name内值。 那么,一个响应式雏形就有了。就不用去做dom操作了。...$data可能包含深层次数据对象,因此需要递归调用this.observe // 执行深层次数据劫持 defineReactive(obj,key,val){ Object.defineProperty...接到这个需求应如何实现呢?

75830

【算法-字节笔试-中等难度】Tarjan算法求解公共祖先问题LCA,并介绍倍增算法

今天字节笔试第二题,详情由于保密协议不能上网,但是大意就是给一大堆节点,去求LCA。...递归直接爆栈,用stack写递归有一个点,改进优化了一下有两个点…… 印象中这个算法挺简单,就搜了一下,果然找到了。不是,现在校招算法题都这么丧病了吗。 由于保密协议,不能放代码。...LCA问题参考资料, Tarjan时间复杂度为O((n+q)× 并查集复杂度 ),而使用路径压缩和按秩合并并查集复杂度为O(Alpha(n))。所以作为离线算法,Tarjan比倍增算法快很多。...top && head[Stack[top]] == 0) top--;//清理叶子节点 } void swim(int &x,int H){ //目标是让x向上跳H步,使用二进制方式...for(int i=0;H>0;i++){ if(H&1) x = anc[x][i];//i相当于现在跳2^i步,H%2==1 x

22810

计算属性是如何被Vue实现

其次,Computed 相关原理需要一些 Effect 相关原理。如果你不是很清楚 Effect 是什么,推荐你优先阅读这篇 Vue3中响应式是如何被JavaScript实现。...只有当计算属性(fullName)中依赖响应式数据 发生改变,计算属性才会重新执行从而计算出最新值。 支持任意值 大多数小伙伴利用 Computed ,无非是使用了它计算以及缓存两个特点。...传入第二个函数第一个参数中依赖响应式数据变化并不会执行传入 getter 而是回执行对应第二个参数 scheduler。 在 scheduler 中,我们进行了处理。...Effect 已经在前置文章 Vue3中响应式是如何被JavaScript实现 中介绍过它实现,有兴趣深入了解同学可以移步查阅。 同理,当我们首次访问该计算属性。...当我们使用了该 computed ,访问 computed getter 属性。

80030
领券