如何解决TSC编译输出代码中glob模式的路径解析问题
可行解决方案
方案1:动态计算绝对路径+构建时复制静态资源(最推荐,长期可维护)
操作步骤:
- 安装文件复制工具
copyfiles和Node类型声明依赖:
npm install copyfiles @types/node --save-dev
- 修改
package.json的构建脚本,编译完成后自动复制docs目录到输出目录:
{ "scripts": { "build": "tsc && copyfiles -u 1 src/docs/*.yaml dist/", "dev": "ts-node --project ./tsconfig.json ./src/index.ts" } }
以上配置默认
tsconfig.json中outDir为dist,如果是其他输出目录可自行替换。-u 1参数作用是去掉复制路径的第一层src前缀,保证输出目录下直接生成docs文件夹。
- 修改
index.ts中的加载路径,用__dirname拼接绝对路径:
import path from 'path'; lib.load({ files: [ path.join(__dirname, 'docs', '*.yaml') ] });
优势:
- 不需要额外判断环境,路径完全和当前文件所在位置绑定,不会出现工作目录变化导致路径失效的问题
- 项目规模扩大后,新增静态资源只需要调整复制规则即可,统一维护成本低
方案2:环境变量区分运行环境
操作步骤:
- 安装跨平台环境变量工具
cross-env兼容Windows系统:
npm install cross-env --save-dev
- 启动脚本中注入环境变量,修改
package.json:
{ "scripts": { "build": "tsc", "dev": "cross-env NODE_ENV=development ts-node --project ./tsconfig.json ./src/index.ts", "start": "cross-env NODE_ENV=production node dist/index.js" } }
- 代码中根据环境变量拼接路径:
const basePath = process.env.NODE_ENV === 'development' ? './src' : '.'; lib.load({ files: [ `${basePath}/docs/*.yaml` ] });
优势:
- 不需要修改构建逻辑,不需要复制静态资源
注意点:
- 依赖环境变量正确注入,启动脚本和代码中的环境判断要保持一致
- 如果运行时工作目录(
process.cwd())和项目根目录不一致,会出现路径失效问题
方案3:调整tsconfig配置移除rootDir限制(不推荐,但可用)
如果不想修改现有代码逻辑,可以去掉"rootDir": "./src"配置,将tsconfig的include设置为仅包含src目录即可,编译时会保留src目录结构到输出目录,原./src/docs/*.yaml路径在生产环境也可以直接使用。
劣势:
- 项目结构分层不清晰,编译输出目录会冗余src层级
内容的提问来源于stack exchange,提问作者Farzan
相关产品推荐
相关产品推荐

