问题
我一直在使用firebase依赖性进行颤动。 (云存储,云存储,cloud_function等...)
构建时间一直很痛苦。在我本地的机器(MacBook Pro 16英寸带有32GB RAM,Intel)上,需要10分钟才能进行干净的版本。重建2-5分钟。(缓慢,但也许不错。
当我从CI/CD的github动作中运行构建时,它需要将近一个小时的时间没有缓存。不仅耗时,而且还要$$$$(Macos Runner每分钟$ 0.08 * 60 = 4.8 $构建)
两年前,为了解决这个问题,我找到了这个问题并应用了:https://github.com/invertase/firestore-ios-sdk-frameworks
这有助于节省40分钟的CI/CD,但更新相关的依赖性总是很痛苦。由于我已修复了iOS SDK版本,因此当它与Flutter的Firebase依赖关系匹配时,它很容易引入回归或构建失败。
目前,预编译的SDK无法与最新的Flutter Firebase库一起使用:https://github.com/firebase/flutterfire/issues/9761
因此,在GitHub Action中构建我的项目需要一个小时。我不能忍受!
解决方案:ccache!
经过一些研究,我从React Native Doc中发现了有关iOS构建的缓存:https://reactnative.dev/docs/build-speed#use-a-compiler-cache
我立即以为我也可以将其应用于我的Flutter Project。
这是简单的步骤完成的。
对于本地机器(与React Native Doc相同)
- 安装ccache
brew install ccache
-
添加symlinks
ln -s ccache /usr/local/bin/gcc ln -s ccache /usr/local/bin/g++ ln -s ccache /usr/local/bin/cc ln -s ccache /usr/local/bin/c++ ln -s ccache /usr/local/bin/clang ln -s ccache /usr/local/bin/clang++
-
确保已使用
$ which gcc /usr/local/bin/gcc
如果它不显示
/usr/local/bin/gcc
,请确保在.profile
或.bashrc
或.zshrc
中调整$路径。 -
更新podfile
post_install do |installer| react_native_post_install(installer) # ...possibly other post_install items here installer.pods_project.targets.each do |target| target.build_configurations.each do |config| # Using the un-qualified names means you can swap in different implementations, for example ccache config.build_settings["CC"] = "clang" config.build_settings["LD"] = "clang" config.build_settings["CXX"] = "clang++" config.build_settings["LDPLUSPLUS"] = "clang++" end end __apply_Xcode_12_5_M1_post_install_workaround(installer) end
-
在构建之前导出CCACHE配置
export CCACHE_SLOPPINESS=clang_index_store,file_stat_matches,include_file_ctime,include_file_mtime,ivfsoverlay,pch_defines,modules,system_headers,time_macros export CCACHE_FILECLONE=true export CCACHE_DEPEND=true export CCACHE_INODECACHE=true
-
测试您的构建:
flutter build ios
由于尚未生成缓存,因此第一个构建仍然很慢。 -
检查是否创建了缓存。
$ ccache -s Summary: Hits: 196 / 3068 (6.39 %) Direct: 0 / 3068 (0.00 %) Preprocessed: 196 / 3068 (6.39 %) Misses: 2872 Direct: 3068 Preprocessed: 2872 Uncacheable: 1 Primary storage: Hits: 196 / 6136 (3.19 %) Misses: 5940 Cache size (GB): 0.60 / 20.00 (3.00 %)
-
重新运行构建:
flutter build ios
现在,在本地机器上,构建时间应该更快。
对于github动作
与本地机器相同的步骤。我们需要使用ccache-action轻松安装CCACHE,并让其自动存储和还原缓存:https://github.com/hendrikmuhs/ccache-action
-
将此添加到工作流文件
- name: Install Ccache uses: hendrikmuhs/ccache-action@v1.2 with: max-size: 5G
默认情况下,最大高速缓存尺寸为500m,但对于我的项目来说太小了。使用默认设置,它没有达到缓存,因此我必须将其增加到5G。
-
更新构建命令
- name: Build flutter app run: | export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" export CCACHE_SLOPPINESS=clang_index_store,file_stat_matches,include_file_ctime,include_file_mtime,ivfsoverlay,pch_defines,modules,system_headers,time_macros export CCACHE_FILECLONE=true export CCACHE_DEPEND=true export CCACHE_INODECACHE=true ccache -s flutter build ipa --export-options-plist=ios/exportOptions.plist --release
像本地机器一样,第一个构建仍然很慢,但是从第二个构建中,您会看到它更快的速度。
这样,我就可以在不使用预编译的Firestore SDK的情况下达到几乎相同的构建时间(约20分钟)。