【问题标题】:NPM Cache Step not working in Azure DevOpsNPM 缓存步骤在 Azure DevOps 中不起作用
【发布时间】:2020-09-26 09:08:20
【问题描述】:

我按照 Microsoft 的以下文档为我尝试在 azure 中构建的 android 应用程序配置 npm 缓存步骤,而不是 package.json-Lock 我使用的是 package.json。

https://docs.microsoft.com/en-us/azure/devops/pipelines/release/caching?view=azure-devops#nodejsnpm

我能够在缓存后步骤中上传缓存依赖文件,并在第二次运行管道时正确上传该文件,但即使在工作区中下载了 npm 缓存数据后,npm 安装步骤也是仍在调用远程库并下载远程依赖项。

我也尝试为 npm install 步骤运行 npm install --prefer-offline 但确实有效。如果我还有什么遗漏,请告诉我。

谢谢。

【问题讨论】:

    标签: android node.js azure caching npm


    【解决方案1】:

    使用Cache 任务缓存应用程序的 node_modules 文件夹。使用缓存命中变量(cacheHitVar)来存储缓存恢复的结果。缓存恢复(缓存命中)时设置为true,否则设置为false

    然后为安装依赖项的任务使用条件(例如npm ci)。仅在缓存未命中时安装它们。

    steps:
      - task: Cache@2
        displayName: Cache node_modules
        inputs:
          key: 'npm | "$(Agent.OS)" | $(Build.SourcesDirectory)/package-lock.json'
          path: $(Build.SourcesDirectory)/node_modules
          cacheHitVar: CACHE_RESTORED
    
      - task: Npm@1
        displayName: 'Install the dependencies'
        inputs:
          command: custom
          verbose: false
          customCommand: 'ci'
        condition: ne(variables.CACHE_RESTORED, 'true')
    

    缓存恢复成功后,你会在管道执行中看到如下输出。

    【讨论】:

    • 这是否需要将 package-lock.json 添加到 git(不忽略)?
    • @JBS 是的,因为缓存密钥部分基于锁定文件,并且使用了需要锁定文件的 npm ci 命令。无论这个问题如何,我都建议将锁定文件添加到您的 Git 存储库中。这样,当其他开发人员在本地克隆存储库时,他们将安装相同版本的依赖项。为了避免诸如“在我的机器上工作”之类的问题。您不希望在您不知情的情况下更新直接或临时依赖项。
    • 谢谢@Christophe。我尝试了这种方法,在我的情况下,缓存方法实际上需要更长的时间 - 下载存储的缓存需要很长时间,可能是因为构建服务器的连接和性能限制(不使用基于云的代理)。就我而言,使用npm install --prefer-offline --no-audit 是最快的
    • 我在 Azure DevOps 上有过类似的经历。缓存它所获得的时间最终是不值得的。有时由于网络延迟而速度较慢。如果您有一个私有包注册表,并且对数据使用量有上限,这会有所帮助。
    • @ChristopheGeers - 使用您发布的条件缓存还是 customCommand: 'ci --cache $(npm_config_cache)' 更好?选择的解决方案有什么优点和缺点?
    【解决方案2】:

    请查看微软关于节点模块缓存的以下官方建议https://docs.microsoft.com/en-us/azure/devops/pipelines/release/caching?view=azure-devops#nodejsnpm

    variables:
      npm_config_cache: $(Pipeline.Workspace)/.npm
    
    steps:
    - task: Cache@2
      inputs:
        key: 'npm | "$(Agent.OS)" | package-lock.json'
        restoreKeys: |
           npm | "$(Agent.OS)"
        path: $(npm_config_cache)
      displayName: Cache npm
    
    - script: npm ci
    
    

    【讨论】:

      【解决方案3】:

      这不是一个很好的答案,因为我有完全相同的问题,但这是我的设置。

      - task: Cache@2
        displayName: Cache npm
        inputs:
          key: 'npm | "$(Agent.OS)" | $(Build.SourcesDirectory)/XX/package-lock.json'
          restoreKeys: |
             npm | "$(Agent.OS)"
          path: $(npm_config_cache)
      
      - task: Npm@1
        displayName: Npm restore dependencies
        inputs:
          command: 'custom'
          workingDir: '$(clientapps)'
          customCommand: 'install --cache $(npm_config_cache)'
      

      添加 --cache 将 npm 的缓存文件设置到特定位置。我现在正在使用 --prefer-offline 运行构建,看看是否有帮助。如果有帮助,我会在这里回答。

      【讨论】:

      • 有帮助吗?与此相关的答案似乎有所不同
      • 我已经在我的管道中使用 --prefer-offline 进行了设置,但这似乎并不重要 - 尽管也可能是我的 package-lock.json 在运行之间发生了变化。我的管道不经常运行......无论如何,构建仍然需要更长的时间来恢复我的依赖关系 - 所以我停止研究它。如果从缓存恢复工作,你可以尝试不运行 npm restore (缓存任务可以输出布尔值,检查 azure 管道文档) - 但我不知道这是否有效。
      • 我运行了一些管道作为测试,但它似乎无论如何都不起作用:##[warning]The given cache key has changed in its resolved value between restore and save steps; 所以锁定文件被更改了?无论如何 - 我做错了什么,但我现在不会进一步调查..
      • 啊 - 因为我正在使用 npm install 来重写文件,我应该使用 npm ci 但这会产生错误,所以我无法使用它。因此,此时缓存对我来说似乎是不可撤销的。
      猜你喜欢
      • 2020-06-30
      • 1970-01-01
      • 2021-04-30
      • 1970-01-01
      • 2021-04-30
      • 1970-01-01
      • 2015-12-22
      • 2019-08-02
      • 2018-10-24
      相关资源
      最近更新 更多