将链接文件复制到虚拟位置存在一个大问题:如果您在指向其中一个链接文件的 JavaScript 引用上使用 Go To Definition (Shift + F2),您将被带到本地复制的文件,而不是到链接的文件。那么,你一定会犯编辑本地版本的错误,从而消除使用链接文件的好处。此外,这可能会导致 Intellisense 出现问题。
更好的解决方案:与其将链接文件与关联链接一起复制到当前项目目录,不如将它们复制到该目录(或您希望的任何目录中的“hiddenDebug”文件夹;将其保存在同一目录中更易于管理,然后在调试期间操纵路径,我将在下面解释)。
以下是如何将文件从共享存储库复制到“hiddenDebug”文件夹(添加到源项目的 Post-Build 事件):
单个 CSS 文件
xcopy /Y "$(ProjectDir)App_Themes\Theme1\Shared.css" "$(SolutionDir)WebApp\App_Themes\Theme1\hiddenDebug\"
JavaScript 目录
xcopy /Y /S "$(ProjectDir)Scripts" "$(SolutionDir)WebApp\Scripts\Shared\hiddenDebug\"
在调试时,您可以使用 Global.asax 中的 Response.Filter 动态更改共享文件的源路径。这是一个例子:
响应过滤器类(在共享项目中)
Imports System.IO
Namespace Code
Public Class LinkedReferencesFilter
Inherits MemoryStream
Private ReadOnly outputStream As Stream = Nothing
Private ReadOnly _IsDevEnvironment As Boolean = False
Public Sub New(ByVal output As Stream, IsDevEnvironment As Boolean)
Me.outputStream = output
Me._IsDevEnvironment = IsDevEnvironment
End Sub
Public Overrides Sub Write(ByVal buffer As Byte(), ByVal offset As Integer, ByVal count As Integer)
' Convert the content in buffer to a string
Dim contentInBuffer As String = UTF8Encoding.UTF8.GetString(buffer)
If Me._IsDevEnvironment Then
contentInBuffer = contentInBuffer.Replace("<script src=""Scripts/Shared/", "<script src=""Scripts/Shared/hiddenDebug/")
contentInBuffer = contentInBuffer.Replace("/Scripts/Shared/", "/Scripts/Shared/hiddenDebug/")
contentInBuffer = contentInBuffer.Replace("/App_Themes/Theme1/Shared.css", "/App_Themes/Theme1/hiddenDebug/Shared.css")
End If
Me.outputStream.Write(UTF8Encoding.UTF8.GetBytes(contentInBuffer), offset, UTF8Encoding.UTF8.GetByteCount(contentInBuffer))
End Sub
End Class
End Namespace
全球.asax
Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)
' Simulate internet latency on local browsing
If Request.IsLocal Then
System.Threading.Thread.Sleep(50)
End If
Dim currentRelativePath As String = Request.AppRelativeCurrentExecutionFilePath
If request__1.HttpMethod = "GET" Then
If currentRelativePath.EndsWith(".aspx") Then
Dim IsDevEnvironment As Boolean = False
//Use whatever method you want to determine whether your current environment is a development environment:
#If CONFIG = "Develop" Then
IsDevEnvironment = True
#End If
Response.Filter =
New Shared.Code.LinkedReferencesFilter(
output:=Response.Filter,
IsDevEnvironment:=IsDevEnvironment)
End If
End If
End Sub
故障排除:尝试卸载并重新加载包含链接项目的项目。如果这没有帮助,请将 hiddenDebug 目录添加到您的项目中。我必须这样做,但后来我能够将其删除。这很挑剔……如果微软完善了这个功能,那就太好了,但我现在已经准备好了。
如果您不知道:当您发布 Web 应用程序时,源(链接)文件会自动复制到发布目标。一旦设置好,您就可以忘记它。最好的部分是,您不会失去智能感知或快速导航。
迁移到 TypeScript 后,大多数 JavaScript 文件引用挑战将被简化或消除(我希望像其他托管 .NET 语言一样简单的跨项目引用,但可能已经有一些解决方法来启用此类功能)。
请让我知道它是否适合您,或者您是否有更好的方法。