typescript 如何在GitHub Actions中缓存纱包

zbdgwd5y  于 2023-01-27  发布在  TypeScript
关注(0)|答案(4)|浏览(183)

我正在使用GitHub操作来构建我的TypeScript项目。每次我运行操作时,我都要等待3分钟才能安装所有依赖项。
是否有办法缓存Yarn依赖项,从而加快构建时间?
我试过这个:

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

     - uses: actions/cache@v1
       id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`)
       with:
         path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
         key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
         restore-keys: |
           ${{ runner.os }}-yarn-

    - name: Install yarn
      run: npm install -g yarn

    - name: Install project dependencies
      run: yarn

但构建时间仍然相同。

wgmfuz8q

wgmfuz8q1#

溶液1:使用actions/setup-node@v2或更高版本(2022年8月31日添加)

- name: Set up Node.js
  uses: actions/setup-node@v3
  with:
    node-version: '16'
    cache: 'yarn'

- name: Install project dependencies
  run: yarn --prefer-offline

actions/setup-node@v2或更新版本具有内置缓存,因此您不再需要设置actions/cache
--prefer-offline告诉yarn在安装期间尽可能使用缓存下载,而不是从服务器下载。

溶液2:使用actions/setup-node@v1 & caching带有actions/cache的Yarn全局缓存(过时)

- name: Set up Node.js
  uses: actions/setup-node@v1
  with:
    node-version: '16'

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

- uses: actions/cache@v3
  id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`)
  with:
    path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
    key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
    restore-keys: |
    ${{ runner.os }}-yarn-

- name: Install project dependencies
  run: yarn --prefer-offline

解释

上面的缓存代码只缓存和恢复yarn全局缓存目录(https://classic.yarnpkg.com/en/docs/cli/cache),它不缓存node_modules目录本身。
为了提高安装速度,您需要告诉yarn在安装过程中尽可能使用缓存下载(在上面提到的缓存目录中),而不是从服务器下载。

- name: Install project dependencies
  run: yarn --prefer-offline

溶液3:使用操作/缓存缓存node_modules(不推荐)

您还可以直接缓存node_modules目录,并在缓存可用时跳过正在运行的yarn
但不建议这样做,因为:

  • yarn善于利用全局缓存,如果全局缓存中已经存在依赖项,yarn可以在1秒内完成运行(参见@mvlabat的注解)。
  • node_modules可能已损坏。每次重新运行yarn并让yarn决定是否从缓存中获取文件会更安全(因为yarn在使用缓存之前会尝试验证缓存)。

代码示例:

- name: Set up Node.js
  uses: actions/setup-node@v1
  with:
    node-version: '16'

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

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

- name: Cache node_modules
    id: cache-node-modules
    uses: actions/cache@v3
    with:
    path: node_modules
    key: ${{ runner.os }}-${{ matrix.node-version }}-nodemodules-${{ hashFiles('**/yarn.lock') }}
    restore-keys: |
        ${{ runner.os }}-${{ matrix.node-version }}-nodemodules-

- run: yarn
    if: |
    steps.cache-yarn-cache.outputs.cache-hit != 'true' ||
    steps.cache-node-modules.outputs.cache-hit != 'true'
mw3dktmi

mw3dktmi2#

正如github package的自述文件所述:

steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
  with:
    node-version: '14'
    cache: 'npm' # or yarn
- run: npm install
- run: npm test

编辑:

事实证明,文档的编写方式非常具有误导性,它们进行了更新,以明确它不缓存node_modules文件夹,而只缓存全局缓存目录,如this issue中所述。
也如Mrchief在评论中所说:
......您仍然会遇到npm i time,只是节省了从互联网下载的时间(如果模块在npm缓存中)
所以你仍然应该使用这个节省时间从互联网上下载软件包,但如果你想缓存node_modules文件夹,检查其他答案,它使用actions/cache
你还应该检查Quang Lam的答案,它是关于为什么你不应该缓存node_modules文件夹的评论。

zqdjd7g9

zqdjd7g93#

如缓存步骤id字段旁边的注解所述:
使用此选项检查cache-hitsteps.yarn-cache.outputs.cache-hit != 'true'
缺少用于确定是否应运行步骤的条件if属性:

- name: Install yarn
  run: npm install -g yarn

- name: Install project dependencies
  if: steps.yarn-cache.outputs.cache-hit != 'true' # Over here!
  run: yarn

P.S.您可能应该使用Setup NodeJS GitHub Action,它会为您额外设置Yarn:

- uses: actions/setup-node@v1
  with:
    node-version: '10.x' # The version spec of the version to use.

有效输入的完整列表参见action.yml file
编辑:事实证明,Yarn包含在software installed on the GitHub-hosted Ubuntu 18.04.4 LTS ( ubuntu-latest / ubuntu-18.04 ) runner的列表中,因此没有必要包含全局安装Yarn的步骤。

u91tlkcl

u91tlkcl4#

actions/setup-node支持使用多个自定义选项缓存since v2

- uses: actions/checkout@v3

- name: Setup Node.js
  uses: actions/setup-node@v3
  with:
    node-version: '16'
    cache: 'yarn'

- name: Install JS dependencies
  run: yarn install

已按建议执行缓存,仅缓存yarn cache dir,不缓存node_modules。不建议缓存node_modules,因为它可能导致问题,例如在节点版本更改时。

  • 旧答案:*

这是一个专门用于Yarn的1-liner缓存:https://github.com/c-hive/gha-yarn-cache
它可以按照GitHub的建议进行缓存,支持Yarn v1和v2。
与国家预防机制相同:https://github.com/c-hive/gha-npm-cache

相关问题