リンクされたファイルを仮想の場所にコピーすることには大きな問題が1つあります。リンクされたファイルの1つを指すJavaScript参照で[定義に移動](Shift + F2)を使用すると、ローカルにコピーされたファイルに移動します。リンクされたファイルに。そうすると、ローカルバージョンの編集を間違えることになり、リンクされたファイルを使用するメリットがなくなります。さらに、Intellisenseで問題が発生する可能性があります。
より良い解決策:リンクされたファイルを関連するリンクと一緒に現在のプロジェクトディレクトリにコピーする代わりに、それらをそのディレクトリ内の「hiddenDebug」フォルダ(または任意のディレクトリ。同じディレクトリに保持すると管理が容易になります)にコピーします。次に、以下で説明するように、デバッグ中にパスを操作します)。
共有リポジトリから「hiddenDebug」フォルダにファイルをコピーする方法は次のとおりです(ソースプロジェクトのビルド後のイベントに追加します)。
単一の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
Global.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アプリケーションを公開すると、ソース(リンクされた)ファイルが公開ターゲットに自動的にコピーされます。これを設定すると、忘れることができます。最良の部分は、Intellisenseまたはクイックナビゲーションを失うことはないということです。
TypeScriptに移行すると、ほとんどのJavaScriptファイル参照の課題が単純化または排除されます(他のマネージド.NET言語で利用できるような、プロジェクト間の簡単な参照を望んでいますが、そのような機能を有効にするための回避策がすでにいくつかある可能性があります)。
それがあなたのために働くかどうか、またはあなたがより良い方法を持っているかどうか私に知らせてください。