我使用Visual Studio 2010来维护都安置在部署时在同一网站上各地40个不同的Web应用程序。 这些项目是在同一个解决方案,但装在不同的项目,因为他们每做完全不同的事情。
我想无需构建和重新部署的每个通过“添加链接”选项共享的各个项目中的CSS / JS文件,这样我可以一次更新CSS或js文件并自动更新体现在各个项目项目。
那我遇到的问题是,当我试图在我的电脑用于调试目的的链接文件不工作在本地运行的项目。 我越来越找不到文件。
我想:我认为,这是因为该文件夹结构本地运行的应用程序时,是不同的。 我很好奇,如果有复制在调试模式建设,只有当文件添加到项目,并相应地调整相对URL,这样我就可以发布到我们的Web服务器之前已正确测试应用程序的方式。
谢谢,
对这个问题的解决方案是复制内容文件(如JS,CSS或其它),其每个生成过程中加入作为链接。 有几种方法可以做到这一点。 我将建议使用可以通过不同的Web应用程序项目重用的MSBuild目标。
所以,你可以(通过命名它WebApplication.Extension.targets例如)具有以下内容创建以下文件:
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!-- Override the default target dependencies to -->
<!-- include the new CopyLinkedContentFiles target. -->
<PropertyGroup>
<BuildDependsOn>
CopyLinkedContentFiles;
$(BuildDependsOn);
</BuildDependsOn>
</PropertyGroup>
<!--
============================================================
CopyLinkedContentFiles
A new target to copy any linked content files into the
web application output folder.
NOTE: This is necessary even when '$(OutDir)' has not been redirected.
============================================================
-->
<Target Name="CopyLinkedContentFiles">
<!-- Remove any old copies of the files -->
<Delete Condition=" '%(Content.Link)' != '' AND Exists('$(WebProjectOutputDir)\%(Content.Link)') "
Files="$(WebProjectOutputDir)\%(Content.Link)" />
<!-- Copy linked content files recursively to the project folder -->
<Copy Condition=" '%(Content.Link)' != '' " SourceFiles="%(Content.Identity)"
DestinationFiles="$(WebProjectOutputDir)\%(Content.Link)" />
</Target>
</Project>
然后放置在.csproj的文件,下面一行这个目标添加到您的Web应用程序项目:
<Import Project="$(MSBuildProjectDirectory)[RelativePathToFile]\WebApplication.Extension.targets" />
基本上你可以在下面的一个后.csproj的文件中加入这一行:
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
之后这个问题,内容的文件添加为链接应该得到解决。
编辑:只执行时的调试配置内置的MSBuild您必须指定条件元素能力以下逻辑。
例如,要导入指定的目标只为调试配置您可以更新import语句如下:
<Import Project="$(MSBuildProjectDirectory)[RelativePathToFile]\WebApplication.Extension.targets" Condition=" '$(Configuration)' == 'Debug' "/>
EDIT2:
为了克服这个问题,前一段时间我创建了一个“ MSBuild.WebApplication.CopyContentLinkedFiles ” NuGet包。 这个包增加了其复制所有内容的文件添加为链接生成过程中的项目文件夹的MSBuild目标。
自动所有链接的内容文件复制到在使用的MSBuild每个构建自己的“虚拟”地点提供解决方案是在这里:
http://mattperdeck.com/post/Copying-linked-content-files-at-each-build-using-MSBuild.aspx
这样可以确保您链接的文件将提供给浏览器,当你点击F5。
它也可以通过粘贴下面的代码片段到您的.proj文件的末尾将包含链接的文件解决
<Target Name="CopyLinkedContentFiles" BeforeTargets="Build">
<Copy SourceFiles="%(Content.Identity)"
DestinationFiles="%(Content.Link)"
SkipUnchangedFiles='true'
OverwriteReadOnlyFiles='true'
Condition="'%(Content.Link)' != ''" />
有与复制链接文件的虚拟位置的一个大问题:如果您在指向链接文件的一个一个JavaScript参考使用转到定义(按住Shift + F2),你会被带到本地复制文件,而不是链接文件。 然后,你一定会做编辑本地版本,从而消除了使用链接文件的好处的错误。 此外,这可能会导致智能感知的问题。
更好的解决方案:与其链接的文件复制到当前项目目录旁边的相关链接,将它们复制到该目录中的“hiddenDebug”文件夹(或任何你想要的目录,保持它在同一目录下可以更容易地管理,然后调试过程中操作的路径,因为我会在下面解释)。
以下是如何从您的共享库中的文件复制到你的“hiddenDebug”文件夹中(添加到源项目的生成后事件):
单CSS文件
XCOPY / Y “$(PROJECTDIR)App_Themes文件\ THEME1 \ Shared.css” “$(SolutionDir)Web应用程序\ App_Themes文件\ THEME1 \ hiddenDebug \”
JavaScript的目录
XCOPY / Y / S “$(PROJECTDIR)脚本” “$(SolutionDir)Web应用程序\脚本\共享\ 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应用程序,源(链接)文件会自动复制到发布目标。 一旦设置完毕,你可以忘掉它。 最好的部分是,你不会失去智能感知或快速导航。
迁移到打字稿后,JavaScript文件引用的挑战将被简化或消除了大部分(我希望,便于跨项目引用像什么也可供其他管理.NET语言,但有可能已经一些解决方法,使这种功能)。
请让我知道它是否适合你,或者如果你有更好的办法。