我的文件夹中有邮件模块,其结构如下:
- Mail
- templates
- <Handlebars files>
- mail.module.ts
当我构建(编译)TypeScript 项目时,我的
template
文件夹不包含在 build
文件夹中。
构建时如何将此类文件移至dist
?
开发与生产版本有什么不同吗?
您还可以通过在nest-cli.json中添加资产属性来实现此目的,如文档中所述。
对于您的情况,您可以尝试这样的操作:
"assets":["**/Mail/templates/*"]
或者,如果您的模板都有特定的文件类型(我假设其称为 .template),这也应该有效:
"assets":["**/*.template"]
第二个示例将在运行嵌套构建时将所有子目录中的 .template 类型的所有文件复制到具有相同文件夹结构的 dist 文件夹中。同样,您可以通过替换 glob 模式中的 .template 来复制您选择的任何文件类型(.json、.proto 等)。
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' }
])
]
}
针对您的情况的快速解决方法是:
npm install --save-dev copyfiles
修改您的 package.json,使其包含新脚本:
"postbundle": "copyfiles -u 1 src/**/*.template dist/"
添加或更新您的捆绑脚本以使其匹配:
"bundle": "tsc"
另一种更高级的方法是使用 babel 或 webpack 进行编译工作
我正在努力解决同样的问题,然后创建了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
如果出现问题,请随时提出问题。
我也遇到了同样的问题。
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"
}
如果您想要一种轻松无忧的方式,那么流行的 ts-node 包会自动执行此操作!
ts-node
相当于运行 node
,但适用于 TypeScript 项目。如果您要使用 ts-node
,则无需编译 TypeScript 文件并运行 js
文件,ts-node
会在后台完成所有这些工作。
在我的例子中,我添加了资产配置来复制 html 文件并且它起作用了。
nest-cli.json
{
"collection": "@nestjs/schematics",
"sourceRoot": "src",
"compilerOptions": {
"assets": ["**/*.html"]
}
}
或者您可以在构建脚本中使用 cp 命令:
"build": "pnpm i && tsc --build && cp public/legal.html dist/legal.html",
首先,将以下代码添加到nest-cli.json:
"compilerOptions": {
"assets": ["*.proto"],
"watchAssets": true
}
然后最重要的是你必须将文件放在/src目录中,而不是放在项目根目录中。