在wwwroot外部调试TypeScript文件
如何调试ASP.NET 5中的TypeScript文件? 假设解决方案布局如下图所示。注意.ts脚本位于wwwroot文件夹之外,编译的.js文件通过Grunt任务到达该文件夹。 该任务还创建引用原始.ts文件的.map文件 但是请注意,引用超出了wwwroot(../Scripts/app.ts)。这显然在浏览器中不起作用 有什么想法吗在wwwroot外部调试TypeScript文件,typescript,asp.net-core,Typescript,Asp.net Core,如何调试ASP.NET 5中的TypeScript文件? 假设解决方案布局如下图所示。注意.ts脚本位于wwwroot文件夹之外,编译的.js文件通过Grunt任务到达该文件夹。 该任务还创建引用原始.ts文件的.map文件 但是请注意,引用超出了wwwroot(../Scripts/app.ts)。这显然在浏览器中不起作用 有什么想法吗 我向我的一个控制器添加了以下操作,其中AppenEnvironment是注入控制器的IApplicationEnvironment: #if DEBUG [
我向我的一个控制器添加了以下操作,其中
AppenEnvironment
是注入控制器的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与以下内容放在项目根目录中(请注意排除项),成功地解决了这个问题:
这样,您可以让任务运行程序将*.ts文件复制到wwwroot,而VS不会抱怨重复。事实上,它将完全忽略排除部分中路径下的所有文件。在Visual Studio 2015 Update 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答案(现在不会编译):
为什么不在wwwroot中复制你的.ts?VS会抱怨标识符重复,因为相同的类将在两个位置定义。此外,我不认为在wwwroot中放置不必要的文件是我们应该采用的工作方式。这只是为了调试,我将在发布时仅打开一个文件来删除投诉:(我已经用一个中间件创建了一个变通解决方案,该中间件为wwwroot外部的.ts文件提供服务。不过,我想知道ASP.NET团队认为应该如何正确地完成这项工作。几乎可以正常工作。必须替换:var path=System.IO.Directory.GetCurrentDirectory()+“/Scripts/”+pathInfo;with:var path=appEnvironment.ApplicationBasePath+“/Scripts/”+pathInfo;并添加构造函数:iaapplicationenvironment appEnvironment;public HomeController(iaapplicationenvironment appEnvironment){this.appEnvironment=appEnvironment;}这是一种更好的方法;我将更新答案!在ASP.NET核心中不能作为文件(路径…)使用需要一个虚拟路径,并且不能超出wwwroot。请参阅@Ilya对ASP.NET Core的回答。我发现这个答案是ASP.NET Core MVC开发中最干净的解决方案,并且最符合所需的指导原则。在ASP.NET Core 1.0发布后,现在不会编译这个问题。我已经在下面发布了一个更新的代码,用于这个极好的想法:看起来如果无法正常工作,则
RequestPath
的名称与物理路径不同,因为Visual Studio不知道此路径映射。
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"),
});
}
}
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"),
});
}
}