在 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"),
});
}
}
我应该如何在 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"),
});
}
}