Please enable Javascript to view the contents

一些程序构建的优化技巧

 ·  ☕ 2 分钟

持续更新中…

1. Golang

  • 使用 trimpath 移除编译路径,避免暴露编译路径信息
1
go build -gcflags="all=-trimpath=${PWD}" -asmflags="all=-trimpath=${PWD}" -o ./bin/opscli ./cmd/cli/main.go

添加之前异常输出路径 /Users/shaowenchen/Code/Github/ops/main.go,添加之后异常输出路径 main.go

  • -ldflags “-w -s” 移除调试信息,减小二进制文件大小
1
go build -ldflags "-w -s" -o ./bin/opscli ./cmd/cli/main.go

添加之前 55 MB,添加之后 44 MB。

2. Python

  • 提前编译生成 pyc 文件
1
2
3
python -m compileall -b ./
find ./ -name "*.py"|egrep -v 'settings.py|wsgi.py|gunicorn_config.py'|xargs rm -rf
find ./ -name "__pycache__" |xargs rm -rf

虽然 pyc 可以被反编译,但这么做可以增加一点难度。通常启动配置文件被编译之后,不会移除源码,这是为了部署时调试。

3. Node

  • 提交 yarn.lock 文件,生产时使用 --frozen-lockfile 锁定依赖
1
yarn install --frozen-lockfile

package.json 用于指定版本范围,而 yarn.lock 锁定精确版本。

使用 yarn install, 如果 package.json 依赖版本与 yarn.lock 冲突,会更新 yarn.lock 文件。

--frozen-lockfile 锁定依赖版本,不会更新 yarn.lock 文件,也大大节省了安装时间,避免卡在 Building fresh packages。但需要注意检查一下 yarn.lock 中的文件链接是否符合预期,比如是否使用的内网等。

  • 安装依赖包时 ESOCKETTIMEDOUT
1
yarn config set network-timeout 300000

或者

1
yarn install --network-timeout 300000

将超时时间从默认的 30s 改为 300s。

另一种说法是,磁盘慢了,导致安装依赖包超时,可以尝试升级试试。

4. Makefile

  • -j 开启多线程构建
1
make -j

-j 默认使用与 CPU 核心数相同的线程数,可以使用 -j 4 指定线程数。

虽然并行构建的效率高,如果有依赖关系可能导致构建失败,同时排查问题也会更复杂。

5. 平台侧

  • Docker 无法拉取 v1 镜像格式
1
Error response from daemon: mediaType in manifest list should be 'application/vnd.docker.distribution.manifest.list.v2+json' not 'application/vnd.oci.image.index.v1+json'

如果你使用的 Docker 版本小于 19.03,可以在 /etc/docker/daemon.json 中设置 "disable-legacy-registry":true,重启 Docker 即可。或者在 Docker Client 命令中添加 --disable-legacy-registry 参数拉取。

原因在于 v1 镜像格式已经被弃用,Docker 新版本已经不再支持 v1 镜像格式。

  • 使用 buildx

使用 buildx 能更好使用缓存。但 Docker 默认不安装 buildx,需要手动安装。

对于 linux 系统,先去 buildx release 页面下载对应的二进制文件 https://github.com/docker/buildx/releases ,然后将二进制文件重命名为 docker-buildx,放到 $HOME/.docker/cli-plugins 目录下即可。


微信公众号
作者
微信公众号