使用 github 操作缓存 npm 依赖项

iRo*_*tia 10 caching github npm yarnpkg github-actions

我想缓存 npm 依赖项,这样我就不会在每次推送时都执行 npm install ,而是从缓存中加载它。

我认为 github 操作现在支持这个?:如何在 GitHub 操作中缓存步骤?

这里有几个案例

  • 如果package.json更改,这意味着yarn.lockpackage-lock.json更改了 npm install 和 update cache
  • 延长我的上述观点,投稿人可以做的都yarn installnpm install

从上述相同的问题,我将我的 github 操作更改为这样的

name: Tsc compilation test
on: [push, pull_request]
jobs:
  build:
    name: Build
    runs-on: ubuntu-18.04
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Cache NPM dependencies
        uses: actions/cache@v1
        with:
          path: ~/.npm
          key: ${{ runner.OS }}-npm-cache-${{ hashFiles('**/package-lock.json') }}
          restore-keys: |
            ${{ runner.OS }}-npm-cache-
      - name: Install dependencies
        run: npm install
      - name: Test tsc
        run: npm run ts-compile-check
Run Code Online (Sandbox Code Playgroud)

这仍然npm install没有减少我安装依赖项的计算时间(所以我不确定这是否正常工作)

然后我确实yarn install axios希望它会更新我的缓存,但在安装后我看到这已记录

Post job cleanup.
Cache hit occurred on the primary key Linux-npm-cache-, not saving cache.
Run Code Online (Sandbox Code Playgroud)

所以这是我的问题,是否有可能实现

  • 如果package.json更改,这意味着yarn.lockpackage-lock.json更改,请执行npm install并更新缓存
  • 延长我的上述观点,投稿人可以做的都yarn installnpm install

有人可以向我解释这个吗

    with:
      path: ~/.npm
      key: ${{ runner.OS }}-npm-cache-${{ hashFiles('**/package-lock.json') }}
      restore-keys: |
        ${{ runner.OS }}-npm-cache-
Run Code Online (Sandbox Code Playgroud)

Pat*_*azé 8

为了对 GitHub 操作进行有效的缓存,需要有一个package-lock.jsonoryarn.lock存在。这个文件是在安装包时自动生成的。如果您想了解有关 package-lock.json 的更多信息,请查看文档

现在有一个问题,是否应该在同一个项目中使用 npm 和 yarn。有关该主题的更多信息,请点击此处

基于这个问题,我们假设 package-lock.json 和 yarn.lock 都存在。如果您只使用两者之一,请随时从下面删除一个。下面的配置适用于用于yarn config get cacheFolder获取缓存文件夹的纱线版本 2 。对于另一个纱线版本,请参阅文档

name: Tsc compilation test
on: [push, pull_request]
jobs:
  build:
    name: Build
    runs-on: ubuntu-18.04
    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Get yarn cache directory path
        id: yarn-cache-dir-path
        run: echo "::set-output name=dir::$(yarn config get cacheFolder)"

      - name: Cache yarn dependencies
        uses: actions/cache@v2
        with:
          path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
          key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
          restore-keys: |
            ${{ runner.os }}-yarn-

      - name: Cache npm dependencies
        uses: actions/cache@v2
        with:
          path: '~/.npm'
          key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
          restore-keys: |
            ${{ runner.os }}-node-

      - name: Install dependencies
        run: npm install # or yarn install

      - name: Test tsc
        run: npm run ts-compile-check
Run Code Online (Sandbox Code Playgroud)

就是这样!好吧,除了一件事。上面我们~/.npm用于缓存 npm 依赖项。在性能方面,缓存会更快,**/node_modules但在某些情况下这会引入冲突。随意尝试看看哪一个适合你。更多关于这里这里的信息


从您的问题中,您还要求解释以下代码:

    with:
      path: ~/.npm
      key: ${{ runner.OS }}-npm-cache-${{ hashFiles('**/package-lock.json') }}
      restore-keys: |
        ${{ runner.OS }}-npm-cache-
Run Code Online (Sandbox Code Playgroud)

https://github.com/actions/cache#usage

path - 要缓存和恢复的文件、目录和通配符模式的列表。有关支持的模式,请参阅 @actions/glob。
key - 用于恢复和保存缓存的显式键
restore-keys - 如果键没有发生缓存命中,则用于恢复缓存的有序键列表

因此上面的代码:

  • path 是将被缓存/恢复的文件夹(安装依赖项的位置)
  • key是将被缓存的路径的唯一标识符。在这种情况下,它使用 .hash 散列任何**/package-lock.json文件的内容hashFiles。基本上,当 package-lock.json 文件发生变化时,这意味着依赖项发生了变化,不应使用缓存。
  • restore-keys 基本上是默认键,以防万一 key

  • 此操作将缓存 npm deps,但不会跳过“npm install”。为了实现这一点,您需要向缓存步骤添加一个 id,例如“id:cache-npm-deps”,然后添加“if:steps.cache-npm-deps.outputs.cache-hit!=” true'` 到您的安装依赖项步骤。 (3认同)
  • “缓存并不意味着您永远不必安装依赖项。相反,它意味着 Node.js 可以跳过自上次安装以来未更改的依赖项的下载和编译步骤。当您运行 npm install 时或者npm ci,Node.js会检查你的node_modules文件夹和package-lock.json文件。如果安装的包版本与package-lock.json中指定的版本匹配,Node.js可以使用缓存的版本而不是下载并再次编译。” (2认同)