【发布时间】:2019-01-22 16:14:44
【问题描述】:
Typescript 项目 A 导入 Typescript 项目 B,但是我在处理项目 A 的同时正在积极修改项目 B。
项目 A 和 B 都有自己的 git repo。 我已将项目 B 作为 git 子模块添加到项目 A
/project-a/
/src/
/index.ts
/build/
/index.js
/test/
/node_modules/
/project-b/ <- git submodule
/src
/build/
/node_modules
在 index.ts 中
import { classB } from '../project-b/src/classB';
我可以独立构建项目 B,我可以使用 tsconfig.json 中包含的项目 B 构建项目 A,但是在运行时节点无法从项目 B 的 node_modules 目录中找到项目 B 的模块。
我曾尝试使用项目 A 和项目 B 都是工作区的 yarn 工作区,但是这样做会导致项目 A 不再能够构建,因为项目 B 出现了一堆构建错误,但这些错误并不存在之前。
正确的设置方法是什么?
更新:
一个例子是 project-b 依赖于 'winston' logger npm 模块。 project-b 文件夹中的yarn install 会将winston 包下载到project-b/node_modules。然后我在project-a 文件夹中的yarn run build 并且项目成功构建并且没有错误。如果我然后在project-a 文件夹中运行node build/index.js,则表示无法加载“winston”模块。作为一个hacky修复,我将此依赖项添加到project-a,它修复了运行时错误,但我宁愿不将project-b的所有依赖项添加到project-a。我认为问题在于,如果这是一个 javascript 项目,它会找到 project-b/node_modules 目录,但是因为在 typescript 中,javascript 位于 build/ 中,所以文件夹树中没有 project-b/node_modules 文件夹。
【问题讨论】:
-
尝试从项目 B 的 node_modules 加载模块但失败的文件的路径是什么?通常这应该可以工作。
-
@MattMcCutchen 我在帖子中添加了更新,以尝试提供问题所在的示例。
-
您构建的项目 A 是否将项目 B 的源代码转译到项目 A 的
build目录中?如果是这样,那肯定会导致问题。考虑使用 project references 以便项目 B 将转译到它自己的输出目录中。然后,您可能不得不摆弄编译器选项和/或 package.json 文件,以便您的导入路径适用于源和输出。 -
@MattMcCutchen 是的,目前项目 A 正在将 A 和 B 构建到 A 的构建目录中。我想让他们俩保持独立。具有构建依赖项项目的预构建步骤是正常行为吗?在这种情况下,项目 A 应该使用
import X from ../project-b/some/folder或import X from ../project-b/build/src/some/folder,然后依赖源映射。我仍然希望能够导入打字稿文件而不是 javascript 编译源,以便所有打字稿声明都完好无损。 -
当您使用
tsc -b .时,项目参考为您提供了这样一个“预构建步骤”。import X from '../project-b/build/src/some/folder'应该可以工作,因为 TypeScript 在project-b上运行时会在project-b/build/src/some/folder中创建一个.d.ts文件。这是一个known limitation,您必须先构建它,然后该导入才会在您的 IDE 中解析。
标签: typescript import node-modules git-submodules