【问题标题】:Visual Studio 2015 compiles ALL typescript files when SINGLE file is changed更改单个文件时,Visual Studio 2015 编译所有打字稿文件
【发布时间】:2015-11-30 15:20:34
【问题描述】:

我正在使用带有 Typescript 1.5.4 和 Resharper 9 的 Visual Studio 2015

这是错误的场景:

  • 我有大约 180 个打字稿文件
  • 我更改了单个 .ts 文件
  • VS 显示消息“生成 XXX.ts 文件完成。剩余文件仍在编译”
  • 之后我的所有 .ts 文件都编译为 .js
  • 在这些 .js 文件中进行了 2 项更改:格式略有不同,并且删除了对 .js.map 的引用
  • 当我构建整个项目时,会再次生成 .js 文件,但使用原始格式并提供指向 .js.map 的链接

这很烦人,因为它在 Git 中产生了太多噪音 它阻止我直接在浏览器中调试打字稿文件。 (因为缺少 .js.map 文件)

所需的行为当然是应该在保存时编译唯一更改的 .ts 文件。怎么做?

似乎 R# 与此无关,因为它在 R# 禁用时继续发生。

我当前的项目设置:

-------------更新-------------

我已尝试更新到 Typescript 1.6 版。 PATH 变量指向C:\Program Files (x86)\Microsoft SDKs\TypeScript\1.4\,所以我将其更新为指向1.6

所以当我现在输入tsc -v 时,它会显示message TS6029: Version 1.6.2

但由于历史原因(我从事的项目大约有 2 年的历史),我必须在 VisualStudio 中使用版本1.4。所以在 .csproj 中是<TypeScriptToolsVersion>1.4</TypeScriptToolsVersion>

在此更改之后,compile on safe 完全停止工作。

现在我必须重建整个解决方案:(

【问题讨论】:

  • 我现在的解决方法是这个 git 命令(在 unix shell 或 Windows 上的 Cygwin 中工作)git status | grep -v .js 过滤掉 .js 文件。
  • 和active的配置有关系吗?
  • @dandavis 我不这么认为。我尝试更改为“调试”或“发布”,但也没有帮助

标签: javascript visual-studio compilation typescript


【解决方案1】:

另一种解决方法:您可以使用 Gulp 生成已编译的 js 文件和地图。使用 Gulp,您还可以创建监视任务,以便在保存 ts 文件时进行编译。您甚至可以创建清理任务来清理项目。

构建任务示例:

var tsProject = ts.createProject(paths.typescriptRoot + 'tsConfig.json'); // use tsconfig.json
    gulp.task("tsbuild", function () {
        var tsResult = tsProject.src()
            .pipe(sourcemaps.init()) // needed to create sourcemaps
            .pipe(ts(tsProject)); // use tsconfig.json
        return tsResult.js
            .pipe(concat(paths.concatTsFileName)) // concat all output files into a sings js files
            .pipe(sourcemaps.write()) // write the sourcemap to be able to debug the ts files
            .pipe(gulp.dest(paths.typescriptOut)); // output the result on specific path
    });

清理任务示例:

gulp.task("clean:tsout", function (cb) {
    rimraf(paths.typescriptOut + paths.concatTsFileName, cb); // rimraf is used to delete a folder
});

gulp.task("clean:scriptjs",
    function () {
        return gulp.src(paths.typescriptJs, { read: false })  // to clean up multiple files we need to use gulp-rimraf
          .pipe(gulpRimraf());
    });

Watch 任务示例:

gulp.task("watch:tsbuild", ['tsbuild'], function () {
    gulp.watch(paths.typescriptRoot + '**/*.ts', ['tbbuild']);
});

【讨论】:

    【解决方案2】:

    我也遇到过类似的问题,但是由于我们自己处理 TS 编译,所以我想完全避免自动编译......

    解决方法是在项目中强制 TypeScriptCompileOnSaveEnabled 标志为 false

    <PropertyGroup>
        <TypeScriptCompileOnSaveEnabled>false</TypeScriptCompileOnSaveEnabled>
    </PropertyGroup>
    

    在我的情况下,这有效地阻止了 VS2015 在保存时自动编译 .ts 文件,而 VS 每次都不会介入并弄乱输出......

    【讨论】:

    • 这没有帮助。 VS 2015 继续检出并编译所有 TS 文件。
    【解决方案3】:

    Visual Studio 似乎没有正确支持监视模式(即增量编译):

    需要明确的是,--watch 如果您正在使用,则可以在 Windows 上运行 node.js/io.js,但是VS分发的tsc.exe程序没有 支持它;您仍然可以使用 Compile on Save 来获得类似的功能 无论如何。

    https://github.com/Microsoft/TypeScript/issues/2375#issuecomment-100812347

    我不确定为什么关闭。支持 --watch 我们的 tsc.exe 主机将是可能的和可取的。现在限制 因素是我们的 tsc.exe 主机有点难看的 C++,它使用了一些 Chakra 的古老 COM 接口,我们没有花费太多精力 在。我们的选择是:[...]

    https://github.com/Microsoft/TypeScript/issues/2375#issuecomment-100949019

    作为一种解决方法,您可以运行

    tsc --watch
    

    tsconfig.json所在的文件夹中?

    编辑: https://github.com/Microsoft/TypeScript/issues/5638 - 当单个文件更改时,Visual Studio 2015 编译所有打字稿文件

    从 VS 2015 RTM 开始,Compile-on-Save,每次保存文件时 我们需要生成项目中的所有文件以确保一致 输出。我们遇到了许多与输出不一致有关的问题 以不同的顺序保存文件时。构建所有文件是唯一的 考虑到所有情况,我们可以保证正确和一致的输出 语言结构以及它们如何跨文件交互(例如 命名空间/内部模块可以被扩充,这会影响 发出代码的形状,const enms 也作为常量排列, 等等..)。

    【讨论】:

    • 感谢您的回答。我将尝试使用 tsc --watch,但为此我需要在项目配置中关闭 compile on safe。这会影响我的同事。我不是唯一一个从事这个项目的人,但我是唯一一个遇到这个问题的人......
    • 你的同事和你一样使用 VS 2015 吗?
    • 是的,确实如此。但他们确实安装了 Windows 10,但我只是从 Win 7 就地升级。所以可能会有一些打字稿编译器的残留版本
    • 奇怪的是它对他们有用。根据 github 问题,您的行为似乎符合预期 - github.com/Microsoft/TypeScript/issues/5638
    • 好吧,毕竟这对他们不起作用,我弄错了。我已经根据同事的设置更新了我的设置,结果在我的问题的update section 中进行了描述。原来的 bug 被一个新的 bug 取代。
    【解决方案4】:

    在“ECMAScript 版本”中尝试“ECMAScript 5”而不是“ECMAScript 3”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-12
      • 2019-11-30
      • 1970-01-01
      相关资源
      最近更新 更多