Swift构建始终在Docker中构建整个软件包

时间:2018-08-06 10:49:51

标签: 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层将仅构建新更改,而最终重建整个项目

1 个答案:

答案 0 :(得分:0)

您需要验证快速构建确实能够首先构建增量更改(意思是“一般”,无需涉及docker)

像“ Compile Time Incredibly Slow”这样的线程(使用XCode,即使使用选项“仅当发生很小的变化时,Xcode都不会重建整个目标。”)不会激发信心。

如果swift build确实重建了所有内容,则没有任何层缓存会避免完全重建。