【问题标题】:Podfile.lock hashed cache key changes after pod install even though pods are all up to date azure devops pipelinepod 安装后 Podfile.lock 散列缓存键更改,即使 pod 都是最新的 azure devops 管道
【发布时间】:2021-05-10 21:54:08
【问题描述】:

每次我通过我的 azure devops 管道运行构建时都会收到此错误:

给定的缓存键在恢复和保存步骤之间的解析值发生了变化

我正在尝试缓存我的 react native 项目中使用的 cocoapods。我在缓存键字符串中使用 Podfile.lock 的哈希(如果 Podfile.lock 有更改,则缓存键将更改,缓存未命中后将上传新缓存)

如果我在本地删除 Podfile.lock 和 ios/Pods 文件夹,然后运行 ​​pod install 则没有任何变化。当构建管道运行 pod install 时,Podfile.lock 哈希确实发生了变化,这意味着永远无法检索缓存,因为密钥总是被修改。

我试过了:

  • 将 vmImage 更改为 10.14 而不是 macOS 最新版
  • 确保本地所有 pod 都是最新的
  • 确保本地和构建管道中的 cocoapods 版本相同

我想不出还有什么可以尝试的,微软文档中没有关于 cocoapods 缓存的示例,而且似乎没有人遇到过同样的问题

【问题讨论】:

    标签: ios caching azure-devops cocoapods podfile-lock


    【解决方案1】:

    该错误表明您需要确保在 Cache 和 Post-Job Cache 步骤之间的任何构建步骤都不会更改缓存键值。您可以删除导致更改的步骤或从密钥中删除 Podfile.lock。

    【讨论】:

    • 不会从键中删除 Podfile.lock 完全删除缓存查找/生成的目的吗?缓存键不是从 Podfile.lock 哈希生成的整个想法,如果 Podfile.lock 更改(因为 pod 已更改),那么下一次运行将呈现缓存未命中?如果您只是将密钥指定为例如“foobar”,这是否总是意味着 pod 上会有缓存命中(即使它们发生了变化)?此外,奇怪的是 npm 缓存任务完美无缺,因此特别是 pod 似乎有些可疑。
    • 你的管道怎么样?请查看此博客,看看它是否对您有帮助:medium.com/@zmoola22/….
    • @CeceDong-MSFT 我已经关注了该博客文章,但仍然遇到这个问题。由于某种原因,pod install 步骤(必需且无法删除)导致缓存键被修改,这意味着在管道的后续运行中缓存没有被命中。
    • 您建议从缓存键中删除 Podfile.lock,您是否建议包含其他文件来代替它?我们需要包含一个文件的哈希值,该哈希值会在项目 pod 发生变化时发生变化,这会导致缓存未命中(文件哈希值将与存储的缓存键不同)并导致上传和存储新的缓存
    • 很遗憾,我没有看到要缓存的其他文件。
    【解决方案2】:

    您可以尝试以下方法:

    # Podfile.lock and project.pbxproj are changed during the build process, so we make copies
    - script: |
       cp ./ios/Podfile.lock ./ios/podfile_key
       cp ./ios/AwesomeProject.xcodeproj/project.pbxproj ./ios/project_key
      displayName: Create pod cache keys
    
    - task: Cache@2
      inputs:
        key: 'pods | "$(Agent.OS)" | ./ios/podfile_key | ./ios/Podfile | ./ios/AwesomeProject.xcworkspace/contents.xcworkspacedata | ./ios/project_key'
        path: './ios/Pods'
        cacheHitVar: 'PODS_CACHE_RESTORED'
      displayName: Cache pods
    
    - task: CocoaPods@0
      displayName: 'pod install using the CocoaPods task with defaults'
      condition: ne(variables.PODS_CACHE_RESTORED, 'true')
      inputs:
       workingDirectory: './ios/'
       forceRepoUpdate: false
    

    【讨论】:

    • 感谢 aleksander_si 感谢您在此问题上发帖。我不明白的一件事是 /podfile_key 和 /project_key。这些是从哪里来的?你什么时候创建这些文件?
    • 这两个文件是由缓存任务之前的脚本创建的,请参见示例。就我而言,如果工作区和项目文件发生更改,我也想使缓存无效,因此我将相关文件添加到缓存密钥签名中。
    猜你喜欢
    • 2018-05-12
    • 2021-06-16
    • 2021-02-26
    • 2021-02-14
    • 2016-04-03
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多