You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker环境下Jest无法通过相对路径找到模块问题排查

解决Docker环境下Jenkins流水线Jest找不到Common模块的问题

1. 先构建Common模块(TypeScript项目引用依赖)

你用了TypeScript的项目引用references关联common模块,但当前Dockerfile只构建了server,没处理common。TypeScript项目引用要求先编译依赖模块,否则server的编译产物无法正确解析common的路径。

修改Dockerfile,在server构建前先处理common:

# 先构建common模块
WORKDIR /app/common
COPY common/package.json common/package-lock.json ./
RUN npm ci --loglevel verbose
RUN npm run build-ts # 确保common目录有对应的build-ts脚本

# 回到server继续构建
WORKDIR /app/server
# 原有的server构建、测试步骤...

2. 给Jest添加Common路径的映射规则

当前Jest配置只处理了@/开头的路径,没覆盖到../../../common/src这种跨目录引用。可以通过两种方式修复:

方式一:直接映射相对路径

修改server/jest.conf.js的moduleNameMapper:

moduleNameMapper: {
    '^@/(.*)$': '<rootDir>/src/$1',
    // 匹配common的相对路径,映射到实际位置
    '^../../../common/src/(.*)$': '<rootDir>/../common/src/$1'
},

方式二:把Common加入模块搜索路径

修改server/package.json里的Jest配置,扩展modulePaths:

"jest": {
    "testEnvironment": "node",
    "rootDir": "./",
    "modulePaths": [
      "<rootDir>",
      "<rootDir>/../common/src" // 添加common的src目录到搜索路径
    ]
},

这样你甚至可以简化foo.services.ts里的import为import { SomeType } from 'SomeType';,Jest会自动在搜索路径里找到对应文件。

3. 确保Jest运行的是TS源文件而非编译后的JS

你在Docker里先执行了npm run build-ts生成dist目录,Jest可能误跑了dist里的JS文件(而非tests目录下的TS测试文件),导致路径解析混乱。

修改server/package.json的test脚本,明确指定测试文件:

"scripts": {
    "test:unit": "jest tests/unit/**/*.spec.ts"
}

同时检查Jest是否配置了ts-jest来处理TS文件,如果没配置,需要安装依赖并添加配置:

// server/jest.conf.js
transform: {
    '^.+\\.tsx?$': 'ts-jest'
},
testMatch: [
    '**/tests/unit/**/*.spec.ts'
],

4. 验证Docker内的文件完整性

可以在Dockerfile中临时加入命令,确认common目录的文件是否被正确复制:

RUN ls -la /app/common/src # 检查SomeType.ts是否存在

确保COPY . .命令正确把整个项目的文件复制到了/app目录下。


内容的提问来源于stack exchange,提问作者dragonfly02

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 05:36:05