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