构建typescript时如何将非ts文件复制到dist?

问题描述 投票:0回答:9

我的文件夹中有邮件模块,其结构如下:

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

当我构建(编译)TypeScript 项目时,我的

template
文件夹不包含在
build
文件夹中。 构建时如何将此类文件移至
dist

开发与生产版本有什么不同吗?

typescript build nestjs
9个回答
33
投票

您还可以通过在nest-cli.json中添加资产属性来实现此目的,如文档中所述。

对于您的情况,您可以尝试这样的操作:

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

或者,如果您的模板都有特定的文件类型(我假设其称为 .template),这也应该有效:

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

第二个示例将在运行嵌套构建时将所有子目录中的 .template 类型的所有文件复制到具有相同文件夹结构的 dist 文件夹中。同样,您可以通过替换 glob 模式中的 .template 来复制您选择的任何文件类型(.json、.proto 等)。


21
投票

TS 编译器不处理 TypeScript 或 JS 以外的文件(例如

.ts
.js
.tsx
等)。

一种方法是,在编译 NestJS 后运行

cp
来复制这些文件。在您的
package.json
中替换行

"build": "nest build",

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

理想情况下,我会切换到 Webpack(或类似的)来转译 TypeScript 和复制工件。 NestJs 有一个关于如何使用 Webpack 进行构建的基本示例here。要将其扩展为具有“复制”阶段,请安装

copy-webpack-plugin
npm 包并在 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' }
        ])
    ]
}

20
投票

针对您的情况的快速解决方法是:

  1. npm install --save-dev copyfiles

  2. 修改您的 package.json,使其包含新脚本:

    "postbundle": "copyfiles -u 1 src/**/*.template dist/"

  3. 添加或更新您的捆绑脚本以使其匹配:

    "bundle": "tsc"

另一种更高级的方法是使用 babel 或 webpack 进行编译工作


8
投票

我正在努力解决同样的问题,然后创建了typescript-cp

它根据项目的 tsconfig.json 检测源目录和输出目录(使用 typescript 自己的配置解析器,尽可能顺利地工作)并将非 TS 文件复制到 outDir。

它有一个非常基本的 CLI,具有与 typescript 的 tsc 类似的参数,但这就是

tscp
。它还支持包引用。

# Copy
$ tscp

# Copy for TS project references
$ tscp -b

# Watcher
$ tscp -w

# Watcher for TS project references
$ tscp -b -w

# Custom compiler settings
$ tscp -p tsconfig.production.json

# Help
$ tscp -h

如果出现问题,请随时提出问题。


4
投票

我也遇到了同样的问题。

  • 如果您的模板目录位于
    src
    文件夹下,如 Derryl Thomas 在之前的答案中所说,您需要在 Nest-cli.json 文件中指定资产的路径位置。

注意:

资源必须位于 src 文件夹中,否则将不会被复制。

  • 如果像我一样,您的模板目录与
    src
    文件夹位于同一级别,您还需要更新
    sourceRoot
    文件的
    entryFile
    属性和
    nest-cli.json
    属性。

要查看您的配置文件应该是什么样子,您可以下载 cli 图这里


这是我的项目的存档:

这是我的 Nest-cli.json 文件的样子

{
  "$schema" : "https://json.schemastore.org/nest-cli",
  "collection": "@nestjs/schematics",
  "sourceRoot" : ".",
  "compilerOptions" : {
    "assets" : ["config.*.yaml", "assets/**"]
  },
  "entryFile" : "src/main"
}


1
投票

如果您想要一种轻松无忧的方式,那么流行的 ts-node 包会自动执行此操作!

ts-node
相当于运行
node
,但适用于 TypeScript 项目。如果您要使用
ts-node
,则无需编译 TypeScript 文件并运行
js
文件,
ts-node
会在后台完成所有这些工作。


1
投票

在我的例子中,我添加了资产配置来复制 html 文件并且它起作用了。

nest-cli.json

{
  "collection": "@nestjs/schematics",
  "sourceRoot": "src",
  "compilerOptions": {
    "assets": ["**/*.html"]
  }
}

0
投票

或者您可以在构建脚本中使用 cp 命令:

"build": "pnpm i && tsc --build && cp public/legal.html dist/legal.html",

-3
投票

首先,将以下代码添加到nest-cli.json

  "compilerOptions": {
    "assets": ["*.proto"],
    "watchAssets": true
  }

然后最重要的是你必须将文件放在/src目录中,而不是放在项目根目录中。

© www.soinside.com 2019 - 2024. All rights reserved.