在 wwwroot 之外调试 TypeScript 文件

Debugging TypeScript files outside wwwroot

我应该如何在 ASP.NET 5 中调试 TypeScript 文件? 假设解决方案布局如下图所示。注意 .ts 脚本位于 wwwroot 文件夹之外,编译后的 .js 文件通过 Grunt 任务到达那里。 该任务还创建引用原始 .ts 文件的 .map 文件。

但是请注意,该引用超出了 wwwroot (../Scripts/app.ts)。这显然在浏览器中不起作用。

有什么想法吗?

我向我的一个控制器添加了以下操作,其中 appEnvironment 是一个 IApplicationEnvironment 注入到您的控制器中:

#if DEBUG

[ExcludeFromCodeCoverage]
[Route("Scripts/{*pathInfo}", Order = 500)]
public IActionResult TestTypescript(string pathInfo, System.Threading.CancellationToken cancellationToken)
{
    var path = appEnvironment.ApplicationBasePath + "/Scripts/" + pathInfo;
    if (System.IO.File.Exists(path) && pathInfo.EndsWith(".ts"))
    {
        return File(path, "application/javascript");
    }
    else
    {
        return HttpNotFound();
    }
}

#endif

方便的是,新的 Web 服务器删除了 ../(我假设是出于安全目的),因此您甚至不必担心将它们放在路由中。 (请注意,要使这些路径正常工作,控制器本身不需要 [RoutePrefix] 属性。)

我正在使用 Visual studio 2015 RC,如果我在 visual studio 中将 Internet Explorer 设置为调试浏览器,则默认情况下可以调试 wwwroot 文件夹之外的脚本。

这也使您有机会直接在 visual studio IDE 中设置断点。

我遇到了同样的问题。现在,使用 Visual Studio 2015 Update 1,我设法通过将 tsconfig.json 放在项目根目录中并包含以下内容(注意排除)来解决这个问题:

{
  "compilerOptions": {
    "module": "amd",
    "noImplicitAny": false,
    "sourceMap": false,
    "target": "es5"
  },
  "exclude": [
    "wwwroot",
    "bower_components",
    "node_modules"
  ]
}

有了这个,你可以让你的任务运行器将 *.ts 文件复制到 wwwroot 并且 VS 不会抱怨重复。事实上,它将完全忽略排除部分中路径下的所有文件。

我在 Visual Studio 2015 更新 1 中仍然遇到完全相同的问题。我在 Startup.cs 中使用以下代码片段解决了它:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, IApplicationEnvironment appEnv)
{
    app.UseStaticFiles();
    if (env.IsDevelopment())
    { 
        app.UseFileServer(new FileServerOptions()
        {
            FileProvider = new PhysicalFileProvider(System.IO.Path.Combine(appEnv.ApplicationBasePath, "App")),
            RequestPath = new PathString("/App"),
        });
    }
}

我所有的 TypeScript 文件都在 /App

ASP.Net 核心版本的更新以获得良好的 stef 答案(现在无法编译):

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseFileServer(new FileServerOptions()
        {
            FileProvider = new PhysicalFileProvider(Path.Combine(env.ContentRootPath, "Scripts")),
            RequestPath = new PathString("/app"),
        });
    }
}