如何在一个解决scheme中的多个项目之间共享脚本?
如果问题不明确。 我在一个解决scheme中有3个MVC项目。 每当我创build一个新的项目,它添加了“脚本”文件夹,所有的.js文件,我将永远需要。 我不想每次都为每个应用程序创build这个。 有没有办法从解决scheme中的一个中央文件夹引用脚本,这样所有的应用程序/项目都可以共享一个通用的脚本文件夹,其中包含所有的脚本?
编辑: 请解释这样做的利弊如果有任何…现在我很好奇。
这是我会build议的:
右键单击该解决scheme,并创build一个新的解决scheme文件夹称为Common Javascript Files
(或任何你想调用它。
右键单击解决scheme, 在Windows资源pipe理器中单击打开文件夹 ,或手动导航到其他版本的Visual Studio 🙁
在解决scheme目录中,创build一个与解决scheme文件夹名称相同的目录(解决scheme文件夹通常不会在源代码级匹配目录,但为了理智)。
在这个新目录中,添加需要在解决scheme之间共享的文件。
在Visual Studio中,单击解决scheme文件夹并select添加 – 现有项目 。
在文件select对话框中,导航到之前创build的目录,select添加到目录的文件,然后单击添加 。
在每个需要共享文件的项目中,右键单击项目(或项目中的目录),然后单击添加 – 现有项目 。
导航到共享目录,select文件并单击下拉箭头,然后单击添加为链接 。
现在,项目中的文件基本上是“解决scheme文件夹”中文件的快捷方式。 但是它们被视为项目中的实际文件(这包括.CS或Visual Basic文件,它们将被编译为实际存在于项目中的文件)。
PROS
- 在devise时间,文件真正在项目中共享
- 只有每个项目所需的文件都可以添加,这不是全部或没有
- 在IIS(虚拟目录等)中不需要任何configuration
- 如果解决scheme在TFS源代码控制中,则可以将目录添加到TFS源,共享文件将被源代码控制。
- 通过在项目中select文件编辑文件,将编辑实际的文件。
- 删除链接文件不会删除文件。
- 这不仅限于JS文件,链接的文件可以是你可能需要的任何文件(图像,Css,Xml,CS,CSHTML等)
缺点
- 每个部署获取它自己的文件。
- 理解“解决scheme文件夹”不是解决scheme目录中存在的目录时,学习曲线很小。
最好的办法,即时通讯,是滚动自己的CDN …基本上只是在IIS中创build另一个网站,并给它它自己的绑定,例如“ http://cdn.somedomain.com ”
然后将所有的CSS / JS /字体/共享图像等存储在CDN网站上,并从其他网站链接到他们。
这样做解决了2个问题,
- 所有的东西都是在需要的时候共享的,你只需要pipe理每个文件1个版本。
- 您的用户浏览器可以caching他们在一个单一的位置,而不是为每个使用它们的网站下载你的东西的副本。
我添加了这个答案,因为我看到很多人参考创build虚拟目录。 虽然确实共享这些文件,但它为它们创build了多个下载path,这是极大的带宽浪费。 为什么让你的用户下载jquery.js(1 *网站数量)时,你可以允许他们下载一次(cdn.somedomain.com)。
另外当我说带宽浪费的时候,我不只是在谈论服务器带宽,我是在谈论移动用户的数据计划…作为一个例子,我打我们公司人力资源网站(保险等)在我的手机上其他一天,它消耗了250MB的大门,下载了jQuery和一堆东西,每次5倍…在一个2GB的一个月的数据计划,这样做的网站,真的很烦我。
在这里,国际海事组织是最好的和最简单的解决scheme,我花了一个星期,试图find最好,最简单的方式,总是有更多的利弊:
Resources(DLL) Shared images image.png css shared.css scripts jquery.js MvcApp1 Images Content Shared <- We want to get files from above dll here ... MvcApp2 Images Content Shared <- We want to get files from above dll here ...
将以下内容添加到MvcApp1 – > Project – > MvcApp1 Properties – > Build events – > post build event:
start xcopy "$(SolutionDir)Resources\Shared\*" "$(SolutionDir)MvcApp1\Shared" /r /s /i /y
下面是对它做什么的解释: 包括与bin目录相同级别的引用程序集的构build操作内容文件目录
对MvcApp2也一样。 现在,每个构build新鲜的静态文件将被复制到您的应用程序,你可以像“〜/共享/ css / site.css”
如果您想要,您可以调整上述命令,将脚本从.dll复制到每个应用程序的脚本文件夹,这样就可以将一些脚本移动到.dll而不必更改任何path,例如:
如果您想在每次构build之后仅将资源/共享/脚本中的脚本复制到MvcApp1 /脚本中:
start xcopy "$(SolutionDir)Resources\Shared\Scripts\*" "$(SolutionDir)MvcApp1\Scripts" /r /s /i /y
在IIS中创build一个虚拟文件夹,指向3个应用程序中的每一个的相同脚本文件夹。 那么你只需要把它们保存在一个应用程序中。 还有其他的select,但是这取决于你的应用程序的结构。
编辑
一个可怕的想法是使用区域。 在一个公共区域有一个脚本目录,脚本被设置为编译。 然后把它们从dll中解放出来。 这可能是一个好主意,如果你预见到后来更多function的公共区域。
一个build议,可以让你debugging你的脚本,而无需重新编译项目:
- select一个“ 主 ”项目(您将用于debugging)并添加物理文件
- 使用“添加为链接”function(如Eric的答案中所述)将脚本文件添加到解决scheme中的其他项目
- 按照Mac评论中的build议,在Build上使用CopyLinkedContentFiles任务将文件复制到第二个文件中,再转移到其他项目
通过这种方式,您可以修改“ 主 ”项目中的脚本,而无需重新启动debugging器,这对我来说是个天壤之别。
默认包含的大多数文件也可以通过各种CDN获得。
如果您不添加自己的自定义脚本,则甚至可能不需要脚本目录。
微软的脚本CDN: http : //www.asp.net/ajaxlibrary/cdn.ashx