使用 @ 路径别名 在使用 import 的时候, 可以使用相对路径 ../components/HelloWorld.vue 指定文件位置, 但这依赖文件本身的位置,在 跨目录 的时候, 并不方便。 例如, 路由文件 要使用 Components 组件 1 2 3 4 // file: /src/router/index.ts // 路由目标组件 import HelloWorld from '../components/HelloWorld.vue' import World from '../components/World.vue' 要使用路径别名, 需要进行一些额外配置 安装 @types/node 支持 安装 @types/node 组件 1 yarn add @types/node 在 tsconfig.json 中, compilerOptions 下配置 1 2 3 4 5 6 7 8 9……
阅读全文
gin 内部重定向时 middleware 不可用异常 axios 请求时出现 cors error 在使用 axios 请求后端时,遇到 cors 跨域问题, 虽然已经在 gin 中添加了 cors 的 middleware 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 func cors() gin.HandlerFunc { return func(c *gin.Context) { method := c.Request.Method origin := "*" if method != "" { c.Header("Access-Control-Allow-Origin", origin) // 可将将 * 替换为指定的域名 c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE, UPDATE") c.Header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization,X-Token") c.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers, Cache-Control, Content-Language, Content-Type") c.Header("Access-Control-Allow-Credentials", "true") } if method == "OPTIONS" { c.AbortWithStatus(http.StatusNoContent) } } } 问题原因 gin Middleware……
阅读全文
K8S 使用 TTL 控制器自动清理完成的 Job Pod 最近为集群 CI 默认添加了 .spec.ttlSecondsAfterFinished 参数, 以便在 cronjob 和 job 运行完成后自动清理过期 pod 。 但是在 CI 的时候却失败, 报错如下。 1 spec.jobTemplate.spec.ttlSecondsAfterFinished: Forbidden: disabled by feature-gate 核查资料得知, 在 v1.21 之前, 该开关默认是关闭的。 刚好错误集群低于此版本。 Job TTL 控制器 K8S 提供了一个 TTL 控制器, 可以自动在 JOB Complete 或 Failed 之后, 经过一定时间……
阅读全文
经过99次失败后, 我总结了几点 Golang 反射的经验(附源码) golang 反射很好用, 也有很多坑。 代码在: https://github.com/tangx-labs/golang-reflect-demo Kind 和 Type 在 golang 的反射中, 有两个可以表示 类型 的关键字, Kind 和 Type 。 定义覆盖范围 Kind 的定义覆盖范围比 Type 要大。 Kind 在定义上要 更抽象, Type 要更具体。 可以简单理解为, 如果 Kind 是 车 , 那么 Type 可能是 公交车 、 消防车 内置类型字面……
阅读全文
太久没写, 都忘记了 golang slice 切片的完整表达式 原文链接: https://tangx.in/posts/2021/09/22/golang-slice-expressions/ 通常,我们写的 golang slice 边界只有两个数字 slice[1:3] , 这是一种简单写法。 而完整写法是 三个数字 slice[1:3:5] 简单表达式 一个冒号, 两个参数, 表示 slice 元素的 起止区间 1 a[low:high] 案例代码如下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 package main import ( "fmt" ) func main() { a := [5]int{1, 2, 3, 4, 5} s := a[1:4] // [2,3,4] fmt.Println(s) s1 :=……
阅读全文
快速创建 gitlab shell runner 真没想道有一天, 我居然会创建 gitlab shell runner 。 环境太难管理了 创建 gitlab shell runner 实话实说, gitlab 现在的用户体验太好了。 根本不需要到处去搜文档,直接在 runner 管理界面就可以找到, 还贴心的给你准备了全套, 一键复制粘贴搞定。 https://git.example.com/admin/runners 点击 Show Runner installation instructions 可以看到多种 runner 的配置。 在默认的基础上, 根据实际情况优化一下。 1 2……
阅读全文
golang 使用反射绑定 cobra flag 参数 cobra https://github.com/spf13/cobra 是 golang 中一个非常好用的 命令 开发库。 但是绑定 flag 参数的时候略微有点繁琐, 不但有多少个参数就需要写多少行绑定代码, 而且参数定义和描述也是分开的, 非常的不直观。 1 2 3 4 5 6 func init() { rootCmd.Flags().StringVarP(&stu.Name, "name", "", "zhangsanfeng", "student name") rootCmd.Flags().Int64VarP(&stu.Age, "age", "a", 18, "student age") // ... } 想着吧, 反正都要了解 golang reflect 反射, 不如就用 反射 实现一个绑定支……
阅读全文
go-jarvis/jarivs 为了方便 golang 容器化开发的时候管理配置。 核心功能 根据 config 结构体生成 yaml 配置文件 程序启动时, 从 yaml 配置文件和 环境变量 中对 config 赋值 执行逻辑 根据配置 config{} 生成对应的 default.yml 配置文件。 读取依次配置文件 default.yml, config.yml + 分支配置文件.yml + 环境变量 根据 GitlabCI, 分支配置文件 config.xxxx.yml 如没有 CI, 读取本地文件: local.yml 使用需求 config 对象中的结构体中,……
阅读全文
docker runner 配置编译环境的大文件依赖 需求简介: 现在要做某个 arm 平台的的交叉编译环境, 交叉编译依赖和工具包大小 5G 左右, 特别大。 如果按照以往的方式, 直接将 编译依赖和工具 直接打包到编译镜像中, 会有很多麻烦。 单 layer 过大 docker 单层 layer 限制为 5G。 镜像升级迭代 浪费空间 。 如果镜像上层升级或者依赖变化, 整个 layer 不能……
阅读全文
"gitlab-runner-build": executable file not found in $PATH 在搭建 gitlab-runner 的过程中,报错如下 1 ERROR: Job failed (system failure): prepare environment: Error response from daemon: OCI runtime create failed: container_linux.go:370: starting container process caused: exec: "gitlab-runner-build": executable file not found in $PATH: unknown (exec.go:57:0s). Check https://docs.gitlab.com/runner/shells/index.html#shell-profile-loading for more information 因为在 environment 中 扩展了 PATH 而导致 gitlab-runner-helper 中的 PATH 出现了异常。 从而导致 gitlab-runner-build 这个脚本(命令) 无法被找到。 原因分析 在 gitlab 的定义中 environment 的行为有两种 , append(扩展) 或 overwrite(覆盖)。……
阅读全文