Earthly项目教程:第三部分 - 添加依赖项并优化缓存策略

Earthly项目教程:第三部分 - 添加依赖项并优化缓存策略

earthly Super simple build framework with fast, repeatable builds and an instantly familiar syntax – like Dockerfile and Makefile had a baby. earthly 项目地址: https://gitcode.com/gh_mirrors/ea/earthly

前言

在构建现代应用程序时,依赖管理是一个至关重要的环节。本文将深入探讨如何在Earthly构建系统中高效地管理项目依赖,并通过合理的缓存策略显著提升构建效率。我们将以Go语言项目为例,同时也会简要介绍Python、JavaScript和Java项目的实现方式。

依赖管理基础

让我们从一个简单的Go项目开始,该项目需要使用外部依赖包logrus。

首先创建go.mod文件定义依赖:

module example.com/go-app

go 1.13

require github.com/sirupsen/logrus v1.5.0

对应的main.go文件内容如下:

package main

import "github.com/sirupsen/logrus"

func main() {
    logrus.Info("hello world")
}

初始Earthfile实现

最直接的Earthfile实现可能是这样的:

VERSION 0.8
FROM golang:1.15-alpine3.13
WORKDIR /go-workdir

build:
    COPY go.mod go.sum .
    COPY main.go .
    RUN go build -o output/example main.go
    SAVE ARTIFACT output/example AS LOCAL local-output/go-example

docker:
    COPY +build/example .
    ENTRYPOINT ["/go-workdir/example"]
    SAVE IMAGE go-example:latest

这种实现虽然能工作,但存在明显的效率问题:任何文件变更都会导致整个构建过程重新执行,无法充分利用缓存机制。

优化缓存策略

为了提高构建效率,我们需要重新组织构建步骤:

  1. 首先下载依赖项
  2. 然后复制并构建代码

优化后的Earthfile如下:

VERSION 0.8
FROM golang:1.15-alpine3.13
WORKDIR /go-workdir

build:
    # 先下载依赖
    COPY go.mod go.sum .
    RUN go mod download
    # 然后复制并构建代码
    COPY main.go .
    RUN go build -o output/example main.go
    SAVE ARTIFACT output/example AS LOCAL local-output/go-example

docker:
    COPY +build/example .
    ENTRYPOINT ["/go-workdir/example"]
    SAVE IMAGE go-example:latest

这种分离依赖下载和代码构建的方式可以显著提高构建效率,因为只有在依赖项变更时才会重新下载依赖。

依赖项重用模式

对于更复杂的项目,我们可能需要多个构建目标共享相同的依赖项。这时可以将依赖管理提取到独立的目标中:

VERSION 0.8
FROM golang:1.15-alpine3.13
WORKDIR /go-workdir

deps:
    COPY go.mod go.sum ./
    RUN go mod download
    # 保存可能被修改的依赖文件
    SAVE ARTIFACT go.mod AS LOCAL go.mod
    SAVE ARTIFACT go.sum AS LOCAL go.sum

build:
    FROM +deps
    COPY main.go .
    RUN go build -o output/example main.go
    SAVE ARTIFACT output/example AS LOCAL local-output/go-example

docker:
    COPY +build/example .
    ENTRYPOINT ["/go-workdir/example"]
    SAVE IMAGE go-example:latest

这种模式通过FROM +deps语法实现了依赖项的重用,使构建过程更加模块化和高效。

多语言实现示例

JavaScript项目实现

对于Node.js项目,可以采用类似的依赖管理策略:

VERSION 0.8
FROM node:13.10.1-alpine3.11
WORKDIR /js-example

deps:
    COPY package.json ./
    COPY package-lock.json ./
    RUN npm install
    SAVE ARTIFACT package.json AS LOCAL ./package.json
    SAVE ARTIFACT package-lock.json AS LOCAL ./package-lock.json

build:
    FROM +deps
    COPY src src
    RUN mkdir -p ./dist && cp ./src/index.html ./dist/
    RUN npx webpack
    SAVE ARTIFACT dist /dist AS LOCAL dist

docker:
    FROM +deps
    COPY +build/dist ./dist
    EXPOSE 8080
    ENTRYPOINT ["/js-example/node_modules/http-server/bin/http-server", "./dist"]
    SAVE IMAGE js-example:latest

Java项目实现

Gradle项目的Earthfile示例:

VERSION 0.8
FROM openjdk:8-jdk-alpine
RUN apk add --update --no-cache gradle
WORKDIR /java-example

deps:
    COPY build.gradle ./
    RUN gradle build

build:
    FROM +deps
    COPY src src
    RUN gradle build
    RUN gradle install
    SAVE ARTIFACT build/install/java-example/bin AS LOCAL build/bin
    SAVE ARTIFACT build/install/java-example/lib AS LOCAL build/lib

docker:
    COPY +build/bin bin
    COPY +build/lib lib
    ENTRYPOINT ["/java-example/bin/java-example"]
    SAVE IMAGE java-example:latest

Python项目实现

Python项目的依赖管理示例:

VERSION 0.8
FROM python:3
WORKDIR /code

deps:
    RUN pip install wheel
    COPY requirements.txt ./
    RUN pip wheel -r requirements.txt --wheel-dir=wheels
    SAVE ARTIFACT wheels /wheels

build:
    FROM +deps
    COPY src src
    SAVE ARTIFACT src /src

docker:
    COPY +deps/wheels wheels
    COPY +build/src src
    COPY requirements.txt ./
    RUN pip install --no-index --find-links=wheels -r requirements.txt
    ENTRYPOINT ["python3", "./src/hello.py"]
    SAVE IMAGE python-example:latest

最佳实践总结

  1. 分离依赖下载和代码构建:这是提高构建效率的关键
  2. 使用独立依赖目标:对于多目标构建,创建专门的+deps目标
  3. 保存可能变更的依赖文件:如go.mod、package-lock.json等
  4. 合理利用缓存:Earthly会自动缓存各步骤结果,合理组织步骤顺序可最大化缓存利用率

通过本文介绍的技术,您可以显著提升Earthly构建过程的效率,特别是在频繁迭代开发时,依赖项缓存可以节省大量构建时间。

earthly Super simple build framework with fast, repeatable builds and an instantly familiar syntax – like Dockerfile and Makefile had a baby. earthly 项目地址: https://gitcode.com/gh_mirrors/ea/earthly

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冯海莎Eliot

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值