Swift构建总是在Docker中构建整个包



当使用像这样的Dockerfile时:

FROM swift:latest
RUN mkdir foo && cd foo && swift package init
RUN cd foo && swift build && swift build
RUN cd foo && swift build

当运行第三步时,swift build将只编译应用程序一次,因为第二次执行将只使用已经构建的对象,并且输出将是单个Compile Swift Module 'foo' (1 sources)

然而,当运行第四步时,它似乎忽略了已经构建的东西,并重新构建了整个东西,尽管什么都没有改变,也没有清理。我试过运行RUN ls /foo/.build && ls /tmp,一切似乎都准备好了。

事实上,我试图实现的是设置我的映像,这样我首先从git克隆项目,构建它(所以这个"基础"层由docker缓存(,然后在本地机器的任何更改中COPY,只构建新的更新,但这最终构建了整个项目2次。

知道吗?

编辑:这是我实际的Dockerfile的样子:

FROM swift:latest
RUN git clone git@foo.com/foo.git
RUN cd /foo && swift build
COPY . /foo
RUN cd /foo && swift build

因此,理想情况下,前3层将保持缓存,后2层只会构建新的更改,相反,它最终会重建整个项目

您需要验证swift构建确实能够首先构建增量更改(意思是"一般",不涉及docker(

像"Compile Time Incredibly Slow"这样的线程(使用XCode,即使有选项"当只有小的更改发生时,XCode也不会重建整个目标。"(不会激发信心。

如果swift build确实重建了所有内容,那么再多的层缓存也无法避免完全重建。

最新更新