Typescript项目之间的依赖关系(在一个repo内)

Typescript项目之间的依赖关系(在一个repo内),typescript,Typescript,我有一系列的Typescript项目(每个项目都是实际的可编译目标,有自己的tsconfig.json)。它们是一个代码存储库中的同级目录,如下所示: myrepo --/common --/project1 --/project2 import {CommonClass} from 'common/commonclass'; 为了在project1和project2之间共享代码,我将一些共享代码分解为common。我希望允许project1和project2code从common导入类,但

我有一系列的Typescript项目(每个项目都是实际的可编译目标,有自己的tsconfig.json)。它们是一个代码存储库中的同级目录,如下所示:

myrepo
--/common
--/project1
--/project2
import {CommonClass} from 'common/commonclass';
为了在
project1
project2
之间共享代码,我将一些共享代码分解为
common
。我希望允许
project1
project2
code从
common
导入类,但不能从彼此导入类(并且
common
应该不能从其他两个导入类)

理想情况下,
project1
中的代码可能如下所示:

myrepo
--/common
--/project1
--/project2
import {CommonClass} from 'common/commonclass';
我找到了一种允许导入正确工作的方法,将其放入
project1
的tsconfig.json中:

  "baseUrl":".",
  "paths":{
    "*":["*","../*"]
  }
但是,我还没有找到一种方法来限制哪些其他子项目可以作为导入的主题。我尝试过使用
rootDirs
,希望它能像
rootDir
那样限制允许的源文件,但实际上并没有


我怎样才能将每个项目中哪些代码是可导入的白名单?或者,是否有更好的方法可以在Typescript中构建子项目,但我不知道这种方法?

我还必须处理类似的结构,但找不到理想的方法来实现这一点。
我想出的最好办法是在
project1
project2
中有一个
lib
目录,其中包含编译后的
公共
,以及定义文件

我使用gulp将
common
项目构建到不同的
projectX/lib
目录中:

gulp.task("common-project1", function () {
    var tsProject = ts.createProject("common/tsconfig.json");

    return tsProject.src("common/**/*.ts")
        .pipe(tsProject())
        .pipe(gulp.dest("project1/lib/common"));
});

这不是最好的解决方案,因为它要求您在每次更改
common
源代码时都要运行这个gulp任务,但我发现一旦
common
足够稳定,这种情况就不会经常发生了。

您可以在tsconfig.json中使用
noResolve
编译器选项,请参阅

例如:在project2/tsconfig.json中,您可以将
noResolve
设置为true,并在
include

//project2/tsconfig.json
{
“编译器选项”:{
“模块”:“commonjs”,
“目标”:“es5”,
“noResolve”:正确
},
“包括”:[
“./普通/***”,
"**/*"
]
}
使用上述设置,TypeScript将警告您ProjectUtil1的错误导入:

//project2/ProjectUtil2.ts
从“./project1/ProjectUtil1”//打字错误
从“./common/StringUtil”导入StringUtil;
导出类ProjectUtil2{
静态格式输出(文本:字符串){
返回“项目2:+ProjectUtil1.formatOutput(文本);
}
}
导出默认项目UTIL2;

您的项目是如何编译的?这是一个日常问题,我可以分享我的方法。只需在命令行上通过makefile使用
tsickle
(一个包装好的drop-in替代
tsc
),我的意思是,typescript输出是什么?编译成单个文件,或每个文件编译到位?每个文件独立编译;tsickle只是将打包输出更改为与闭包编译器兼容,我们随后使用闭包编译器对其进行打包。这正是我所做的,尽管我也使用了
gulp.watch
(它与保存时编译很好地协同),这使文件几乎可以立即在项目之间同步。这里值得注意的副作用是缺少项目间重构。例如,如果您对对象进行全局重命名(即VS中的
Ctrl+R+R
),更改不会传播到项目及其复制文件之外(尽管我觉得这对于定义良好的API和松散耦合的依赖项来说不应该是个问题,因为公共签名只是偶尔更改(如果有的话)。对,这是一个缺点,但是如果您将公共库看作更像第三方库,那么很明显这种方法有很多优点,特别是从长远来看。随着时间的推移,
common
lib将变得足够成熟,因此(1)不需要进行更改,(2)如果需要更改,它将影响太多的依赖项目,从而使此更改变得简单。我实际上尝试了类似的方法,但使用符号链接而不是复制文件,并发现
tsc
实际上注意到文件确实来自
rootDir
之外,并给出了一个错误:-(然后尝试将js/d.ts文件复制到
rootDir
下,效果非常好