Visual Studio Code在保存时编译


156

如何配置Visual Studio Code在保存时编译打字稿文件?

我看到可以配置任务以使用${file}作为参数集中构建文件。但是我希望在保存文件时完成此操作。


4
上面的链接适用于VS,不适用于VS代码。保存时编译与编译和任务不同。保存时仅发出单个JS文件。我也想要VS代码。
Ciantic

这是一个好建议。我打开了一个内部工作项来实现该功能。
德克·鲍默(DirkBäumer),2015年


1
您能否标记一个答案
Seega 2015年

2
键入tsc <filename> --watch在终端
丹尼尔Ç雅各布

Answers:


204

2018年5月更新:

从2018年5月开始,您不再需要tsconfig.json手动创建或配置任务运行器。

  1. tsc --init在您的项目文件夹中运行以创建tsconfig.json文件(如果还没有文件的话)。
  2. Ctrl+Shift+B打开VS Code中的任务列表,然后选择tsc: watch - tsconfig.json
  3. 做完了!您保存的每个文件都会重新编译您的项目。

您可以tsconfig.json在工作空间中包含多个文件,并根据需要一次运行多个编译(例如,前端和后端分别运行)。

原始答案:

您可以使用Build命令执行此操作:

创建一个简单的tsconfig.jsonwith "watch": true(这将指示编译器观看所有编译的文件):

{
    "compilerOptions": {
        "target": "es5",
        "out": "js/script.js",
        "watch": true
    }
}

请注意,files省略了array,默认情况下*.ts将编译所有子目录中的所有文件。您可以提供任何其他参数或更改target/ out,只需确保将watch其设置为即可true

配置任务(Ctrl+Shift+P-> Configure Task Runner):

{
    "version": "0.1.0",
    "command": "tsc",
    "showOutput": "silent",
    "isShellCommand": true,
    "problemMatcher": "$tsc"
}

现在按Ctrl+Shift+B构建项目。您将在输出窗口(Ctrl+Shift+U)中看到编译器输出。

保存后,编译器将自动编译文件。要停止编译,请按Ctrl+P->> Tasks: Terminate Running Task

我已经专门为此答案创建了一个项目模板: typescript-node-basic


10
这样做的问题是它使任务保持运行状态,VS Code知道何时保存较少的文件或ts文件,因为我们无法轻松地连接到“保存时”命令,所以拥有另一个观察者似乎是多余的。我想知道是否有人已经做了扩展,可以在保存特定文件类型时运行某些程序,这会好得多。
Ciantic 2015年

2
@Ciantic这个答案是在VS Code具有扩展支持之前编写的。您在说的只是扩展,但是让TypeScript编译器监视文件并仅重新编译已更改的文件实际上要快得多。
zlumer 2015年

1
@Kokodoko bc compileOnSave仅适用于VS 2015,而不适用于代码
scape

2
@scape如果在task.json的命令行参数中添加“ -w”,它也可以在VS Code中使用!
Kokodoko

1
实际上,VSCode会为您做配置工作:configure task:VSCode将自动检测到其中存在一个tsconfig.json并提示您选择tsc: build - tsconfig.json或的对话框tsc: watch - tsconfig.json。选择后者,VSCode会生成tasks.json文件(如果以前没有),并为您添加正确的配置。
丹尼尔(Daniel)

37

如果要避免使用CTRL+ SHIFT+ B而是希望在保存文件的任何时间发生这种情况,可以将命令绑定到与save操作相同的快捷方式:

[
    {
        "key": "ctrl+s",          
        "command": "workbench.action.tasks.build" 
    }
]

这放在您的keybindings.json-中(使用文件->首选项->键盘快捷键转到此标题)。


1
这应该只是上述答案的附加内容(已编辑)。这件事情让我感到很快乐!
chrissavage

好答案...?如何过滤将启动的内容...例如:如果文件具有html扩展名,我只想执行命令?
ZEE

@ZEE是的,这是可能的,请参阅此文档中有关键绑定的内容,以及有关简短示例的httpete答案。具体来说,使用when条件editorLangId是重要的。
BobChao87 '17

22

如果按Ctrl+ Shift+B似乎很费劲,则可以打开“自动保存”(“文件”>“自动保存”),并使用NodeJS监视项目中的所有文件,然后自动运行TSC。

打开Node.JS命令提示符,将目录更改为项目的根文件夹,然后键入以下内容;

tsc -w

嘿,请记住,每次VS Code自动保存文件时,TSC都会重新编译该文件。

博客文章中提到了这种技术。

http://www.typescriptguy.com/getting-started/angularjs-typescript/

向下滚动到“保存时编译”


6

写一个扩展

现在,vscode是可扩展的,可以通过扩展来挂接on save事件。可以在此处找到有关VSCode的扩展的良好概述:https ://code.visualstudio.com/docs/extensions/overview

这是一个简单的示例,仅echo $filepath在消息对话框中调用并输出stdout:

import * as vscode from 'vscode';
import {exec} from 'child_process';

export function activate(context: vscode.ExtensionContext) {

    vscode.window.showInformationMessage('Run command on save enabled.');

    var cmd = vscode.commands.registerCommand('extension.executeOnSave', () => {

        var onSave = vscode.workspace.onDidSaveTextDocument((e: vscode.TextDocument) => {

            // execute some child process on save
            var child = exec('echo ' + e.fileName);
            child.stdout.on('data', (data) => {
                vscode.window.showInformationMessage(data);
            });
        });
        context.subscriptions.push(onSave);
    });

    context.subscriptions.push(cmd);
}

(也参考此SO问题:https : //stackoverflow.com/a/33843805/20489

现有的VSCode扩展

如果您只想安装现有的扩展,以下是我在VSCode库中编写的扩展: https

源代码可在此处获取:https : //github.com/emeraldwalk/vscode-runonsave/blob/master/src/extension.ts


5

我为获得想要的行为而竭尽全力。这是将TypeScript文件保存为仅此文件(保存的文件)到我想要的配置时进行编译的最简单,最好的方法。这是一个task.json和一个keybindings.json。

在此处输入图片说明


7
对于懒惰的开发人员:{ "version": "0.1.0", "command": "tsc", "isShellCommand": true, "args": ["--module","amd","--target","ES5","${file}"], "showOutput": "silent", "problemMatcher": "$tsc" } 关键要点:{ "key": "cmd+s", "command": "workbench.action.tasks.build", "when":"editorTextFocus && editorLangId == 'typescript'" }
Dariusz Filipiak,2016年

我可以说使用最新版本的TypeScript 1.8.X和Visual Studio代码1.0,我展示的技术已经过时了。只需在项目的根级别使用tsconfig.json即可,所有这些都将自动进行语法检查。然后在命令行上使用tsc -w自动监视/重新编译。{“ compilerOptions”:{“ module”:“ amd”,“ target”:“ ES5”,“ noImplicitAny”:false,“ removeComments”:true,“ preserveConstEnums”:true,“ inlineSourceMap”:true},“排除” :[“ node_modules”]}
httpete '16

5

我建议不要使用以下task.json文件以监视方式启动tsc,而不是构建单个文件并绑定Ctrl + S来触发该构建。

{
    "version": "0.1.0",
    "command": "tsc",
    "isShellCommand": true,
    "args": ["-w", "-p", "."],
    "showOutput": "silent",
    "isWatching": true,
    "problemMatcher": "$tsc-watch"
}

这将一次构建整个项目,然后重建与保存方式无关的保存文件(Ctrl + S,自动保存...)


2
其中一些道具已弃用。
EbruGüngör17年

3

更新

在你的 tsconfig.json

"compileOnSave": true, // change to true

如果问题仍然存在,请执行以下任一操作:

重新启动编辑器更改任何路线,将其还原并保存应用程序。它将开始编译。

const routes: Routes = [
  {
    path: '', // i.e. remove , (comma) and then insert it and save, it'll start compile
    component: VersionsComponent
  }
]

1
如今VS代码是否支持该功能?上次检查时无法保存,因此需要使用扩展名。
Antti,

现在它支持
WasiF

2

我使用gulp-typescript和增量构建在gulp任务的保存上实现了编译。这允许您随意控制编译。请注意我的变量tsServerProject,在我的真实项目中我也有tsClientProject,因为我想在不指定模块的情况下编译客户端代码。据我所知,vs代码无法做到这一点。

var gulp = require('gulp'),
    ts = require('gulp-typescript'),
    sourcemaps = require('gulp-sourcemaps');

var tsServerProject = ts.createProject({
   declarationFiles: false,
   noExternalResolve: false,
   module: 'commonjs',
   target: 'ES5'
});

var srcServer = 'src/server/**/*.ts'

gulp.task('watch-server', ['compile-server'], watchServer);
gulp.task('compile-server', compileServer);

function watchServer(params) {
   gulp.watch(srcServer, ['compile-server']);
}

function compileServer(params) {
   var tsResult = gulp.src(srcServer)
      .pipe(sourcemaps.init())
      .pipe(ts(tsServerProject));

   return tsResult.js
      .pipe(sourcemaps.write('./source-maps'))
      .pipe(gulp.dest('src/server/'));

}

1

选择“首选项”->“工作区设置”并添加以下代码,如果启用了“热重新加载”,则更改将立即反映在浏览器中

{
    "files.exclude": {
        "**/.git": true,
        "**/.DS_Store": true,
        "**/*.js.map": true,
        "**/*.js": {"when": "$(basename).ts"}
    },
    "files.autoSave": "afterDelay",
    "files.autoSaveDelay": 1000
}


1

我可以说使用最新版本的TypeScript 1.8.X和Visual Studio代码1.0,我展示的技术已经过时了。只需在项目的根级别使用tsconfig.json,它们就会自动进行语法检查。然后在命令行上使用tsc -w自动监视/重新编译。它将读取相同的tsconfig.json文件以获取ts compile的选项和配置。

// tsconfig.json

{
    "compilerOptions": {
        "module": "amd",
        "target": "ES5",
        "noImplicitAny": false,
        "removeComments": true,
        "preserveConstEnums": true,
        "inlineSourceMap": true
    },
    "exclude": [ "node_modules" ]
} 

1

保存时自动编译的一种非常简单的方法是在终端中键入以下内容:

tsc main --watch

main.ts您的文件名在哪里。

请注意,只有在打开此终端后,此命令才能运行,但这是一个非常简单的解决方案,可以在编辑程序时运行。


tsc -w也适用于项目中的所有打字稿文件
比特码

1

您需要增加监视限制来解决保存时的重新编译问题,打开终端并输入以下两个命令:

sudo sysctl fs.inotify.max_user_watches=524288
sudo sysctl -p --system

要使更改即使在重新启动后仍持久存在,也请运行以下命令:

echo fs.inotify.max_user_watches=524288 | sudo tee /etc/sysctl.d/40-max-user-watches.conf && sudo sysctl --system

0

尝试了上述方法,但是由于要观看的最大文件数已超过限制,我的感觉就停止了自动编译。

运行cat /proc/sys/fs/inotify/max_user_watches命令。

如果显示的文件数量较少(包括node_modules),则以/etc/sysctl.confroot特权打开文件 并追加

fs.inotify.max_user_watches=524288 进入文件并保存

再次运行cat命令以查看结果。会工作的!希望!


0

我使用在.vscode / tasks.json中的文件夹上运行的自动任务(应运行VSCode> = 1.30)

{
 "version": "2.0.0",
 "tasks": [
    {
        "type": "typescript",
        "tsconfig": "tsconfig.json",
        "option": "watch",
        "presentation": {
            "echo": true,
            "reveal": "silent",
            "focus": false,
            "panel": "shared"
        },
        "isBackground": true,
        "runOptions": {"runOn": "folderOpen"},
        "problemMatcher": [
            "$tsc-watch"
        ],
        "group": {
            "kind": "build",
            "isDefault": true
        }
    }
 ]
}

如果仍然无法打开项目文件夹,请尝试按Ctrl + Shift + P和“任务:管理文件夹中的自动任务”,然后在主项目文件夹或运行文件夹中选择“允许文件夹中的自动任务”。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.