Typescript项目之间的依赖关系(在一个回购中)

时间:2016-12-20 23:59:02

标签: typescript

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

myrepo
--/common
--/project1
--/project2

为了在project1project2之间共享代码,我将一些共享代码分解为common。我想允许project1project2代码从common导入类,但不能从彼此导入类(并且common不应该从任何一个导入类另外两个)。

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

import {CommonClass} from 'common/commonclass';

通过将其放入project1的tsconfig.json中,我找到了一种允许导入正常工作的方法:

  "baseUrl":".",
  "paths":{
    "*":["*","../*"]
  }

但是,我还没有找到一种方法来限制哪些其他子项目可以成为import的主题。我尝试过使用rootDirs,希望它会以rootDir的方式限制允许的源文件,但事实上并非如此。

如何将每个项目中可导入的代码列入白名单?或者是否有一些更好的方法来构建我不知道的Typescript中的子项目?

2 个答案:

答案 0 :(得分:2)

我还必须处理类似的结构,并且找不到理想的方法 我设法得到的最好的是libproject1中的project2目录,其中包含已编译的common以及定义文件。

我使用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足够稳定。

答案 1 :(得分:0)

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

例如:在project2 / tsconfig.json中,您可以将include设置为true,并在// project2/tsconfig.json { "compilerOptions": { "module": "commonjs", "target": "es5", "noResolve": true }, "include": [ "../common/**/*", "**/*" ] }

中指定所有必需的路径
// project2/ProjectUtil2.ts

import ProjectUtil1 from "../project1/ProjectUtil1";    // TypeScript error
import StringUtil from "../common/StringUtil";

export class ProjectUtil2 {

    static formatOutput(text: string) {
        return "Project 2: " + ProjectUtil1.formatOutput(text);
    }
}

export default ProjectUtil2;

使用上述设置,TypeScript会警告您错误导入ProjectUtil1:

class Point(object):
    def __repr__(self):
        return "(" + str(self.x) + "," + str(self.y) + ")"

    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __add__(self, point):
        return Point(self.x + point.x, self.y + point.y)

    def __sub__(self, point):
        return Point(self.x - point.x, self.y - point.y)

    def __mul__(self, num):
        return Point(num * self.x, num * self.y)

    def __rmul__(self, num):
        return self.__mul__(num)

    def length(self):
        return self.x ** 2 + self.y ** 2


x = Point(1, 2)
y = Point(1, 3)

print(x + y)
print(y + x)
print(x - y)
print(y - x)
print(y * 3)
print(3 * y)