【问题标题】:Gulpfile that efficiently compiles only changed TypeScript filesGulpfile 仅有效编译已更改的 TypeScript 文件
【发布时间】:2014-11-17 08:15:40
【问题描述】:

我正在尝试让 gulp 编译并查看 TypeScript 文件。这就是我到目前为止所得到的

var tsProject = plugins.typescript.createProject(
{
    removeComments: false,
    target: 'ES5',
    module: 'amd',
    noExternalResolve: false,
    noImplicitAny: false,
});

var typescriptGlob = [
    presentationScriptsDir + '**/*.ts',
    definitelyTypedDefinitions
];

gulp.task("compile-typescript", function () {
    return gulp.src(typescriptGlob)
        .pipe(plugins.typescript(tsProject))
        .pipe(gulp.dest(presentationScriptsDir));
});

gulp.task("watch-typescript", function() {
    return gulp.watch(typescriptGlob, ["compile-typescript"]);
});

我正在使用gulp-typescript

但是,由于我们有数百个 TypeScript 文件,我不想在其中一个文件发生更改时重新编译所有文件。上面的代码可以做到这一点(我可以说是因为watch-typescript 花费的时间至少与compile-typescript 一样多)

我试过用gulp-changed,像这样

gulp.task("compile-typescript", function () {
    return gulp.src(typescriptGlob)
        .pipe(plugins.changed(presentationScriptsDir, {extension: '.js'}))
        .pipe(plugins.typescript(tsProject))
        .pipe(gulp.dest(presentationScriptsDir));
});

这确实会过滤掉未更改的文件。但是 typescript 编译器会报告错误,因为它只获取一个文件,缺少通常从其他文件获取的类型声明。

我不想将 noExternalResolve 标志设置为 true,因为这样就不会进行大量类型检查,这在很大程度上挫败了首先使用 TypeScript 的理由。

如何更好地编写这个 gulpfile?

【问题讨论】:

    标签: javascript typescript gulp gulp-watch gulp-changed


    【解决方案1】:

    TypeScript 编译器不像大多数语言编译器那样经历单独的编译和链接阶段。所以,它确实无法完成增量编译。

    就像你说的,为了进行类型检查,编译器需要加载并至少重新解析所有可能被引用的文件。

    我们在项目中所做的是使用 Visual Studio 对“保存时编译”的支持,这将在我们开发和调试时为我们生成 .js 文件。 (显然该机制使用 noExternalResolve 功能)。然后我们依靠我们的单元测试过程和持续集成服务器来运行一个常规的 TypeScript 编译来获取所有的语法和输入错误。

    因此,我建议使用 noExternalResolve 标志运行您的手表,但还要在您的工作流程中包含一个步骤,以便在重要点运行完整的 TypeScript 编译。也许您可以指定某个“根”文件在更改时启动完整编译,或者您可以找到一些其他不经常发生的事件,您可以使用它来触发常规编译。

    【讨论】:

    • @mike-shenk 我们还将编辑器配置为使用 noResolve 标志进行快速编译。但是,我们正在使用 amd 模块,这种方法在一种情况下会中断。如果我们导入一个文件并且只使用该导入来扩展一个类,那么该文件将不会包含在发出的 javascript 中。这是因为带有 noResolve 的 TS 将假定“扩展”是用于扩展接口而不是类,因此它将省略该导入。你看到同样的东西吗?
    猜你喜欢
    • 2013-05-23
    • 2011-12-10
    • 2018-08-22
    • 1970-01-01
    • 2016-01-07
    • 1970-01-01
    • 2019-12-16
    • 2019-08-12
    • 2020-04-29
    相关资源
    最近更新 更多