Pesquisa de site

build - Como copiar arquivos que não são .ts para a pasta dist ao construir TypeScript?


Eu tenho o módulo Mail em uma pasta com esta estrutura:

- Mail
  - templates
      - <Handlebars files>
  - mail.module.ts

Quando eu construo (compilo) um projeto TypeScript, minha pasta template não é incluída na pasta build. Como mover esse tipo de arquivo para a pasta dist ao construir?

É diferente para builds de desenvolvimento e de produção?

Resposta #1

Você também pode fazer isso adicionando uma propriedade de ativo no arquivo nest-cli.json, conforme mencionado na documentação.

Para o seu caso, você pode tentar algo assim:

"assets":["**/Mail/templates/*"]

Ou se todos os seus modelos tiverem um tipo de arquivo específico (estou assumindo que se chama .template), isso também deve funcionar:

"assets":["**/*.template"]

O segundo exemplo copiará todos os arquivos do tipo .template de todos os subdiretórios para a sua pasta dist mantendo a mesma estrutura de pastas quando você executar um nest build. Da mesma forma, você pode usar isso para copiar qualquer tipo de arquivo de sua escolha (.json, .proto, etc) substituindo .template no padrão glob.

Resposta #2

O compilador TS não lida com arquivos que não sejam TypeScript ou JS (por exemplo, .ts, .js, .tsx, etc.).

Uma maneira de fazer isso, é apenas executar cp para copiar esses arquivos depois de compilar o NestJS. No seu package.json, substitua a linha

"build": "nest build",

com

"build": "nest build && cp ./Mail/templates ./build",

Idealmente, eu mudaria para o Webpack (ou similar) para transpilar TypeScript e copiar artefatos. O NestJs tem um exemplo básico de como construir com Webpack aqui. Para estendê-lo para ter uma fase de "cópia", instale o pacote npm copy-webpack-plugin e adicione essas adições no arquivo de configuração do webpack:

const copyFiles = require('copy-webpack-plugin');
// ... omitted for abbreviation

module.exports = function(options) {
   return {
   // ... omitted for abbreviation
   ,
    plugins: [
      // ... omitted for abbreviation
      new copyFiles([
            { from: 'Mail/templates', to: 'templates' }
        ])
    ]
}

Resposta #3

Uma solução rápida para o seu cenário seria:

  1. npm install --save-dev copyfiles
  2. Modifique seu package.json para que inclua um novo script:

    "postbundle": "copyfiles -u 1 src/**/*.template dist/"
  3. Adicione ou atualize seu script de pacote para que corresponda a:

    "bundle": "tsc"

Outra abordagem mais avançada seria usar o Babel ou Webpack para o trabalho de compilação

Artigos relacionados