Cache de dependência de npm com ação github
Desejo armazenar em cache as dependências do npm para não instalar o npm toda vez que enviar e, em vez disso, apenas carregá-lo do cache.
Acho que a ação do github suporta isso agora ?: Como faço para armazenar em cache as etapas nas ações do GitHub?
Aqui estão alguns casos
- Se
package.jsonmudar, o que significayarn.lockoupackage-lock.jsonmudou, faça o npm instalar e atualizar o cache - Estendendo meu ponto acima, o colaborador poderia estar fazendo tanto
yarn installenpm install
Da mesma pergunta acima, mudei minha ação no github para algo assim
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
Isso ainda npm installreduz e não reduziu meu tempo de computação para instalar dependências (portanto, não tenho certeza se isso está funcionando corretamente ou não)
Então eu yarn install axiosesperava que ele atualizasse meu cache, mas na pós-instalação vejo isso como registrado
Post job cleanup.
Cache hit occurred on the primary key Linux-npm-cache-, not saving cache.
Então aqui estão minhas perguntas, é possível alcançar
- Se
package.jsonmudar, o que significayarn.lockoupackage-lock.jsonmudou, façanpm installe atualize o cache - Estendendo meu ponto acima, o colaborador poderia estar fazendo tanto
yarn installenpm install
E alguém pode me explicar isso
with:
path: ~/.npm
key: ${{ runner.OS }}-npm-cache-${{ hashFiles('**/package-lock.json') }} restore-keys: | ${{ runner.OS }}-npm-cache-
Respostas
Para ter um cache eficiente com as ações do GitHub, é necessário que haja um package-lock.jsonou yarn.lockpresente. Este arquivo é gerado automaticamente ao instalar pacotes. Se você quiser mais informações sobre o package-lock.json, verifique os documentos .
Agora há a questão de saber se npm e yarn devem ser usados no mesmo projeto. Mais sobre esse assunto aqui .
Com base na pergunta, vamos supor que tanto um package-lock.json quanto um yarn.lock existam. Se você estiver usando apenas um dos dois, sinta-se à vontade para remover um abaixo. A configuração abaixo é para yarn versão 2, que usa yarn config get cacheFolderpara obter a pasta de cache. Para outra versão do fio, consulte os documentos .
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
É isso aí! Bem, exceto por mais uma coisa. Acima, estamos usando ~/.npmpara armazenar em cache as dependências do npm. Em termos de desempenho, seria mais rápido armazenar em cache, **/node_modulesno entanto, em alguns casos, isso introduziria conflitos. Sinta-se à vontade para experimentar para ver qual funciona para você. Mais sobre isso aqui e aqui .
A partir de sua pergunta, você também pediu para explicar o seguinte código:
with:
path: ~/.npm
key: ${{ runner.OS }}-npm-cache-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.OS }}-npm-cache-
https://github.com/actions/cache#usage:
caminho - uma lista de arquivos, diretórios e padrões curinga para armazenar em cache e restaurar. Veja @ actions / glob para padrões suportados.
chave - Uma chave explícita para restaurar e salvar o cache
Restore-chaves - Uma lista de chaves para o uso ordenado para restaurar o cache se não houver acerto de cache ocorreu para a chave
Portanto, o código acima:
pathé a pasta que será armazenada em cache / restaurada (onde as dependências são instaladas)keyé um identificador exclusivo para o caminho que será armazenado em cache. Nesse caso, ele faz o hash do conteúdo de qualquer**/package-lock.jsonarquivo usandohashFiles. Basicamente, quando o arquivo package-lock.json muda, isso significa que as dependências mudaram e o cache não deve ser usado.restore-keysé basicamente uma chave padrão para usar no caso de não haver correspondência para okey